@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.cjs.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","runInAction","R","LitElement","html","nothing","css","property","customElement"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,cAAN,MAAkB;AAAA,EAiBvB,WAAA,GAAc;AAhBd,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,EAA0B,IAAA,CAAA;AAC1B,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,EAA0B,IAAA,CAAA;AAC1B,IAAA,aAAA,CAAA,IAAA,EAAA,mBAAA,EAAmC,IAAA,CAAA;AACnC,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAgC,IAAA,CAAA;AAChC,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAwB,IAAA,CAAA;AACxB,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAyB,IAAA,CAAA;AACzB,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAgC,IAAA,CAAA;AAChC,IAAA,aAAA,CAAA,IAAA,EAAA,aAAA,EAA6B,IAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAA8B,IAAA,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAA8B,IAAA,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAA8B,IAAA,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,EAAe,QAAA,CAAA;AACf,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAiB,EAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,EAAe,CAAA,CAAA;AACf,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAkB,EAAA,CAAA;AAGhB,IAAAA,uBAAA,CAAmB,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,IAAI,WAAA,GAA+C;AACjD,IAAA,MAAM,KAAA,GAA0C;AAAA,MAC9C,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,MAClB,CAAC,UAAA,EAAY,IAAA,CAAK,OAAO,CAAA;AAAA,MACzB,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI;AAAA,KACpB;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,WAAA,EAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClE,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,WAAA,EAAa,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClE,IAAA,IAAI,IAAA,CAAK,mBAAmB,KAAA,CAAM,IAAA,CAAK,CAAC,qBAAA,EAAuB,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACtF,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,CAAM,IAAA,CAAK,CAAC,kBAAA,EAAoB,IAAA,CAAK,cAAc,CAAC,CAAA;AAC7E,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,SAAA,EAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA,CAAK,CAAC,UAAA,EAAY,IAAA,CAAK,OAAO,CAAC,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,CAAM,IAAA,CAAK,CAAC,iBAAA,EAAmB,IAAA,CAAK,cAAc,CAAC,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAC,CAAA;AAC3E,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,eAAA,EAAiB,IAAA,CAAK,YAAY,CAAC,CAAA;AAC9E,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,gBAAA,EAAkB,IAAA,CAAK,YAAY,CAAC,CAAA;AAC/E,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,gBAAA,EAAkB,IAAA,CAAK,YAAY,CAAC,CAAA;AAC/E,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,EAAG,KAAA,CAAM,IAAA,CAAK,CAAC,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AACjE,IAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,WAAW,OAAA,EAA+B;AACxC,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpD,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,oBAAoB,OAAA,CAAQ,iBAAA;AAC9E,IAAA,IAAI,OAAA,CAAQ,cAAA,KAAmB,MAAA,EAAW,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AACxE,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACxD,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,cAAA,KAAmB,MAAA,EAAW,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AACxE,IAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAClE,IAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,EAAW,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,EAAW,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,EAAW,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACxD,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,EACd;AAAA,EAEA,QAAQ,CAAA,EAAW;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,EACd;AACF,CAAA;;;ACZA,IAAM,kBAAA,GAAwC;AAAA,EAC5C,YAAA,EAAc,SAAA;AAAA,EACd,WAAA,EAAa,SAEf,CAAA;AAEA,IAAM,kBAAA,GAA+B;AAAA,EACnC,EAAA,EAAI,QAAA;AAAA,EACJ,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,8BAAA;AAAA,IACP,QAAA,EAAU,+BAAA;AAAA,IACV,OAAA,EAAS,iBAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,SAAA,EAAW;AAAA;AAEf,CAAA;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;AAEA,SAAS,eAAe,KAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,EAAA,EAAI,KAAA,EAAO,EAAC,EAAE;AAAA,EACvC;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,GAAW,MAAM,EAAA,GAAK,EAAA;AAAA,IAC9C,MAAM,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,EAAA;AAAA,IACpD,OAAO,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,QAAQ;AAAC,GAChD;AACF;AAEA,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAM,GAAA,EAAK,MAAA,EAAQ,EAAC,EAAE;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,EAAA;AAAA,IAC5C,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,GAAA;AAAA,IAClD,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,cAAA,CAAe,KAAK,CAAC,IAAI;AAAC,GAC5F;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAuB;AAChD,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAW;AAC1B,IAAA,OAAO,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,oBAAoB,GAAA,EAA0B;AAC5D,EAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AAEpC,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACjC;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,aAAA,CAAc,IAAI,CAAC,IAAI,EAAC;AAE/F,EAAA,OAAO;AAAA,IACL,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,CAAA;AAAA,IAC/D,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,GAAK,OAAO,KAAA,GAA4B,MAAA;AAAA,IACpE,gBAAgB,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA,GAAK,OAAO,cAAA,GAA6C,MAAA;AAAA,IACvG;AAAA,GACF;AACF;AAEO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO;AAAA,IACL,GAAG,kBAAA;AAAA,IACH,KAAA,EAAO,EAAE,GAAG,kBAAA,CAAmB,KAAA;AAAM,GACvC;AACF;AAEO,SAAS,eAAe,MAAA,EAAyC;AACtE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,EAAA,KAAO,SAAS,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AACpF;AAEO,SAAS,cAAc,MAAA,EAAgC;AAC5D,EAAA,OAAO,cAAA,CAAe,MAAM,CAAA,EAAG,MAAA,IAAU,EAAC;AAC5C;AAEO,SAAS,0BAA0B,MAAA,EAAgC;AACxE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAE/B,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,OAAO,OAAA,IAAW,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,CAAC,sBAAA,EAAwB,CAAA,EAAG;AAAA,KAC1E;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAEhC,EAAA,IAAI,OAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,IAAA,KAAS,UAAU,CAAA,EAAG;AACrD,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,OAAO,OAAA,IAAW,CAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,OAAA,EAAS,OAAO,OAAA,IAAW,CAAA;AAAA,IAC3B,OAAO,CAAC,EAAE,GAAG,KAAA,EAAO,QAAQ,CAAC,sBAAA,EAAuB,EAAG,GAAG,MAAM,CAAA,EAAE,EAAG,GAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC;AAAA,GACxF;AACF;AAEO,SAAS,sBAAsB,MAAA,EAA6C;AACjF,EAAA,MAAM,KAAA,GAAQ,cAAc,MAAM,CAAA,CAAE,KAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,gBAAgB,CAAA;AACjF,EAAA,OAAQ,KAAA,EAAO,SAAS,EAAC;AAC3B;AAEO,SAAS,iBAAiB,MAAA,EAAuC;AACtE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,MAAM,SAAA,GAAa,MAAA,CAAO,cAAA,IAAkB,EAAC;AAE7C,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,SAAA,CAAU,YAAA,IAAgB,KAAA,CAAM,gBAAgB,kBAAA,CAAmB,YAAA;AAAA,IACjF,WAAA,EAAa,SAAA,CAAU,WAAA,IAAe,KAAA,CAAM,eAAe,kBAAA,CAAmB,WAAA;AAAA,IAC9E,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,aAAA,EAAe,KAAA,CAAM,aAAA,IAAiB;AAAC,GACzC;AACF;;;AC9LA,IAAI,UAAA,GAAa,EAAA;AAGV,SAAS,WAAW,GAAA,EAAmB;AAC5C,EAAA,UAAA,GAAa,GAAA;AACf;AAEO,SAAS,UAAA,GAAqB;AACnC,EAAA,IAAI,YAAY,OAAO,UAAA;AACvB,EAAA,IAAI,OAAO,sQAAA,KAAgB,WAAA,IAAe,WAAiB,mBAAA,EAAqB;AAC9E,IAAA,OAAO,MAAA,CAAO,SAAY,CAAI,mBAAmB,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,EAAA;AACT;;;ACbO,IAAM,qBAAA,GAAN,MAAM,sBAAA,SAA8B,KAAA,CAAM;AAAA;AAAA,EAG/C,WAAA,CAAY,SAAiC,MAAA,EAAiB;AAC5D,IAAA,KAAA,CAAM,OAAO,CAAA;AAD8B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAF7C,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,EAAO,yBAAA,CAAA;AAId,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,sBAAA,CAAsB,SAAS,CAAA;AAAA,EAC7D;AACF;AAEO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,KAAA,CAAM;AAAA;AAAA,EAGhD,WAAA,CAAY,SAAiC,KAAA,EAAiB;AAC5D,IAAA,KAAA,CAAM,OAAO,CAAA;AAD8B,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAF7C,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,EAAO,0BAAA,CAAA;AAId,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,uBAAA,CAAuB,SAAS,CAAA;AAAA,EAC9D;AACF;;;ACbA,eAAsB,eAAA,CAAgB,IAAA,EAAc,WAAA,GAAc,MAAA,EAAyD;AACzH,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,MAAM,GAAA,GAAM,GAAG,IAAI,CAAA,uBAAA,EAA0B,mBAAmB,IAAI,CAAC,4BAA4B,WAAW,CAAA,CAAA;AAC5G,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,MAAM,GAAG,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,sBAAA,CAAuB,CAAA,2BAAA,CAAA,EAA+B,GAAG,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,qBAAA,CAAsB,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA;AACrF,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,EAAA,OAAO,EAAE,IAAA,EAAM,mBAAA,CAAoB,IAAI,CAAA,EAAE;AAC3C;AAoCA,eAAsB,eAAA,CACpB,IAAA,EACA,MAAA,GAA+B,EAAC,EACA;AAChC,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,MAAM,CAAA,GAAI,IAAI,eAAA,EAAgB;AAC9B,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACzC,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACnE,CAAC,CAAA;AACD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,KAAA;AAAA,MACV,CAAA,EAAG,IAAI,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,IAAI,CAAC,CAAA,YAAA,EAAe,CAAA,CAAE,QAAA,EAAU,CAAA;AAAA,KACtF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,sBAAA,CAAuB,CAAA,0BAAA,CAAA,EAA8B,GAAG,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,qBAAA,CAAsB,CAAA,YAAA,EAAe,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA;AACpF,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AAUA,eAAsB,aAAa,IAAA,EAA+C;AAChF,EAAA,MAAM,OAAO,UAAA,EAAW;AACxB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,MAAM,CAAA,EAAG,IAAI,0BAA0B,kBAAA,CAAmB,IAAI,CAAC,CAAA,QAAA,CAAU,CAAA;AAAA,EACvF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,EAAC,EAAE;AAAA,EACpB;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,SAAW,EAAE,IAAA,EAAM,EAAC,EAAE;AAC/B,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA,CAAK,OAAO,EAAC;AACtD,EAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AACtB;;;ACxFO,IAAM,YAAN,MAAgB;AAAA,EAMrB,WAAA,CACU,MACA,WAAA,EACR;AAFQ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAPV,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAiC,EAAC,CAAA;AAClC,IAAA,aAAA,CAAA,IAAA,EAAA,YAAA,EAAqB,CAAA,CAAA;AACrB,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAmB,KAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAuB,IAAA,CAAA;AAMrB,IAAAA,wBAAmB,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,QAAQ,IAAA,EAAc;AACpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,SAAA,GAAY;AAChB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AAChB,IAAAC,gBAAA,CAAY,MAAM;AAChB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,WAAA;AAChC,MAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,IAAA,CAAK,MAAM,MAAM,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,GAAA;AAKhB,MAAA,IAAI,MAA+B,EAAC;AACpC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/B,QAAA,GAAA,GAAM,OAAA,CAAQ,IAAA;AAAA,MAChB,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,IAAQ,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAS,OAAA,CAAQ,IAAA,CAA4C,IAAI,CAAA,EAAG;AACvI,QAAA,GAAA,GAAO,QAAQ,IAAA,CAA2C,IAAA;AAAA,MAC5D;AACA,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,IAAQ,OAAO,QAAQ,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAAK,QAAQ,IAAA,GAA+C,IAAA;AACzJ,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,IAAc,KAAA,EAAO,UAAA,IAAc,KAAA,CAAA;AACvD,MAAA,MAAM,QAAQ,GAAA,EAAK,KAAA,IAAS,OAAA,CAAQ,IAAA,EAAM,SAAS,GAAA,CAAI,MAAA;AACvD,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,EAAC;AACzC,MAAA,MAAM,KAAA,GAAUC,iBAAI,CAAC,CAAA,MAA8B,EAAE,GAAG,CAAA,KAAM,IAAI,CAAA;AAClE,MAAAD,gBAAA,CAAY,MAAM;AAChB,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,MAAA;AAAA,MAC9C,CAAC,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAAA,gBAAA,CAAY,MAAM;AAChB,QAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,iBAAA;AAC9C,QAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,MAChB,CAAC,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAAA,gBAAA,CAAY,MAAM;AAChB,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,MACjB,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AC1DO,IAAM,aAAA,GAAN,cAA4BE,cAAA,CAAW;AAAA,EAqG5C,IAAY,UAAA,GAAa;AACvB,IAAA,MAAM,GAAA,GAA+B;AAAA,MACnC,KAAA,EAAO,IAAA;AAAA,MAAM,OAAA,EAAS,IAAA;AAAA,MAAM,KAAA,EAAO,IAAA;AAAA,MAAM,eAAA,EAAiB,IAAA;AAAA,MAC1D,YAAA,EAAc,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAAM,SAAA,EAAW,IAAA;AAAA,MAAM,OAAA,EAAS,IAAA;AAAA,MAC9D,SAAA,EAAW,IAAA;AAAA,MAAM,IAAA,EAAM;AAAA,KACzB;AACA,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,GAAG,IAAA,CAAK,YAAY,UAAA,EAAW;AAAA,EAClD;AAAA,EAEA,IAAY,YAAA,GAAuB;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AACf,IAAA,IAAI,CAAA,CAAE,UAAA,IAAc,IAAA,IAAQ,CAAA,CAAE,aAAa,CAAA,EAAG;AAC5C,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,EAAE,OAAO,UAAA,EAAY,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,OAAO,qBAAA,EAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,EAAE,UAAU,CAAA;AAAA,IAC3I;AACA,IAAA,IAAI,CAAA,CAAE,YAAA,IAAgB,IAAA,IAAQ,CAAA,CAAE,eAAe,CAAA,EAAG;AAChD,MAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,KAAA,EAAO,YAAY,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,KAAA,EAAO,uBAAuB,CAAA,EAAG,EAAE,MAAA,CAAO,CAAA,CAAE,YAAY,CAAA,GAAI,MAAA;AAAA,IACjJ;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAES,iBAAA,GAAoB;AAC3B,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,EAAY,KAAA;AAC/B,IAAA,IAAI,OAAO,YAAA,EAAc,IAAA,CAAK,MAAM,WAAA,CAAY,qBAAA,EAAuB,MAAM,YAAY,CAAA;AACzF,IAAA,IAAI,OAAO,WAAA,EAAa,IAAA,CAAK,MAAM,WAAA,CAAY,oBAAA,EAAsB,MAAM,WAAW,CAAA;AACtF,IAAA,IAAI,OAAO,eAAA,EAAiB,IAAA,CAAK,MAAM,WAAA,CAAY,sBAAA,EAAwB,MAAM,eAAe,CAAA;AAChG,IAAA,IAAI,OAAO,gBAAA,EAAkB,IAAA,CAAK,MAAM,WAAA,CAAY,oBAAA,EAAsB,MAAM,gBAAgB,CAAA;AAChG,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,MAAA,MAAM,KAAA,GAAQ,MAAM,gBAAA,KAAqB,MAAA,GAAS,SAAS,KAAA,CAAM,gBAAA,KAAqB,QAAQ,KAAA,GAAQ,KAAA;AACtG,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,oBAAA,EAAsB,KAAK,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,IAAI,OAAOC,QAAA,CAAA,qEAAA,CAAA;AACxB,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,KAAK,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,OAAA,IAAY,EAA2C,WAAA,EAAa;AACzG,MAAA,MAAA,CAAO,KAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,QAAA,CAAS,SAAS,WAAW,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,KAAK,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAa,OAAA,IAAY,EAAgD,gBAAA,EAAkB;AACtH,MAAA,MAAA,CAAO,KAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,WAAA,CAAY,SAAS,SAAM,CAAA;AAAA,IAChE;AAEA,IAAA,OAAOA,QAAA;AAAA,wBAAA,EACgB,MAAA,CAAoD,gBAAA,IAAoB,EAAE,CAAA,WAAA,EAAc,EAAE,EAAE,CAAA;AAAA;AAAA,UAAA,EAE3G,CAAA,CAAE,iBAAA,GACAA,QAAA,CAAA,eAAA,EAAsB,CAAA,CAAE,iBAAiB,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,wBAAA,EAA2B,CAAA,CAAE,iBAAiB,CAAA,mBAAA,CAAA,GACxGA,QAAA,CAAA,0HAAA,CACJ;AAAA,UAAA,EACE,MAAA,CAAO,MAAA,GAASA,QAAA,CAAA,oBAAA,EAA2B,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKA,QAAA,CAAA,oBAAA,EAA2B,CAAC,CAAA,OAAA,CAAS,CAAC,CAAA,MAAA,CAAA,GAAWC,WAAO;AAAA;AAAA;AAAA,UAAA,EAGnH,KAAK,KAAA,KAAU,KAAA,GAAQD,6BAAyB,CAAA,CAAE,KAAK,UAAUC,WAAO;AAAA,UAAA,EACxE,IAAA,CAAK,YAAY,KAAA,IAAS,CAAA,CAAE,UAAUD,QAAA,CAAA,mBAAA,EAA0B,CAAA,CAAE,OAAO,CAAA,IAAA,CAAA,GAASC,WAAO;AAAA;AAAA,YAAA,EAEvF,KAAK,KAAA,KAAU,KAAA,GAAQD,+BAA2B,IAAA,CAAK,YAAY,YAAYC,WAAO;AAAA,YAAA,EACtF,IAAA,CAAK,eAAA,KAAoB,KAAA,IAAS,CAAA,CAAE,gBAAA,GAAmBD,6BAAyB,CAAA,CAAE,gBAAA,CAAiB,IAAI,CAAA,OAAA,CAAA,GAAYC,WAAO;AAAA;AAAA;AAAA,YAAA,EAG1H,IAAA,CAAK,QAAA,KAAa,KAAA,IAAS,CAAA,CAAE,QAAA,IAAY,OAAOD,QAAA,CAAA,MAAA,EAAa,CAAA,CAAE,QAAQ,CAAA,YAAA,CAAA,GAAiBC,WAAO;AAAA,YAAA,EAC/F,IAAA,CAAK,SAAA,KAAc,KAAA,IAAS,CAAA,CAAE,SAAA,IAAa,OAAOD,QAAA,CAAA,MAAA,EAAa,CAAA,CAAE,SAAS,CAAA,aAAA,CAAA,GAAkBC,WAAO;AAAA,YAAA,EACnG,IAAA,CAAK,OAAA,KAAY,KAAA,IAAS,CAAA,CAAE,cAAA,GAAiB,IAAID,QAAA,CAAA,MAAA,EAAa,CAAA,CAAE,cAAc,CAAA,YAAA,CAAA,GAAiBC,WAAO;AAAA,YAAA,EACtG,IAAA,CAAK,SAAA,KAAc,KAAA,IAAS,CAAA,CAAE,UAAA,GAAa,IAAID,QAAA,CAAA,MAAA,EAAa,CAAA,CAAE,UAAU,CAAA,UAAA,CAAA,GAAeC,WAAO;AAAA,YAAA,EAC9F,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,IAAA,GAAOD,iBAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,OAAA,CAAA,GAAYC,WAAO;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAKvF;AACF,CAAA;AA5KE,aAAA,CADW,eACK,QAAA,EAASC,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAAA;AAiGW,eAAA,CAAA;AAAA,EAAnCC,sBAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAlGf,aAAA,CAkGyB,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACA,eAAA,CAAA;AAAA,EAAnCA,sBAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ;AAAA,CAAA,EAnGf,aAAA,CAmGyB,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AAnGzB,aAAA,GAAN,eAAA,CAAA;AAAA,EADNC,4BAAc,gBAAgB;AAAA,CAAA,EAClB,aAAA,CAAA;;;ACqBb,IAAM,mBAAA,GAAoE;AAAA,EACxE,UAAA,EAAY,EAAE,EAAA,EAAI,iCAAA,EAAmC,KAAK,kCAAA;AAC5D,CAAA;AAEA,IAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,SAAS,gBAAgB,QAAA,EAA0B;AACjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,oBAAoB,CAAA;AACjD,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAC5B;AAEA,SAAS,wBAAwB,MAAA,EAAiC;AAChE,EAAA,MAAM,MAAM,IAAI,eAAA,CAAgB,MAAM,CAAA,CAAE,IAAI,aAAa,CAAA;AACzD,EAAA,OAAO,GAAA,KAAQ,UAAU,OAAA,GAAU,MAAA;AACrC;AAEA,SAAS,cAAc,IAAA,EAAqE;AAC1F,EAAA,OAAO,aAAa,IAAI,CAAA,CACrB,KAAK,CAAC,EAAE,MAAK,KAAM;AAClB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,mBAAA,EAAoB;AACxC,IAAA,KAAA,MAAW,UAAU,IAAA,EAAM;AACzB,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,EAAY,IAAA,EAAK;AACnC,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAMF,IAAAA,GAAM,MAAA,CAAO,OAAA,EAAS,IAAA,EAAK,IAAK,MAAA;AACtC,MAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,WAAA,IAAe,EAAC,EAAG;AAChD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,EAAE,EAAA,EAAI,KAAAA,IAAAA,EAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA,CACA,KAAA,CAAM,OAAO,EAAE,GAAG,qBAAoB,CAAE,CAAA;AAC7C;AAEA,SAAS,UAAA,CAAW,MAAc,UAAA,EAAyE;AACzG,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,IAAI,CAAC,QAAQ,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,QAAQ,OAAA,EAAQ;AAE7D,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACrC,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAM,IAAA,CAAK,EAAA;AAClB,MAAA,MAAA,CAAO,SAAS,MAAM;AACpB,QAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AACtB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,OAAA,EAAU,IAAI,iBAAiB,CAAC,CAAA;AACxE,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IAClC,CAAC;AAAA,GACH;AAEA,EAAA,IAAI,KAAK,GAAA,EAAK;AACZ,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AACrB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACrC,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,QAAA,IAAA,CAAK,GAAA,GAAM,YAAA;AACX,QAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,OAAA,EAAU,IAAI,qBAAqB,CAAC,CAAA;AAC1E,QAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MAChC,CAAC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAK,MAAM;AAAA,EAAC,CAAC,CAAA;AAC5C;AAEA,eAAe,kBAAA,CACb,MAAA,EACA,SAAA,EACA,UAAA,EACe;AACf,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,gBAAA,EAAkB;AAErC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAC,EAAA,CAAyD,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAClF,MAAA,EAAA,CAAG,YAAA,CAAa,cAAc,IAAA,CAAK,SAAA,CAAU,MAAM,KAAA,IAAS,EAAE,CAAC,CAAA;AAC/D,MAAA,SAAA,CAAU,YAAY,EAAE,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,SAAA,GAAY,cAAA;AACrB,MAAA,QAAA,CAAS,WAAA,GAAc,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,cAAA,CAAA;AAC3C,MAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAA,EAAoB;AACtC,EAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,EAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,WAAA,CAAY,sBAAA,EAAwB,MAAM,YAAY,CAAA;AACrF,EAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,WAAA,CAAY,qBAAA,EAAuB,MAAM,WAAW,CAAA;AACnF,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,WAAA,CAAY,uBAAA,EAAyB,MAAM,OAAO,CAAA;AAAA,EACnF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,aAAa,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5D,IAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,WAAA,CAAY,CAAA,EAAA,EAAK,GAAG,IAAI,KAAK,CAAA;AAAA,EAC9D,CAAC,CAAA;AACH;AAEA,SAAS,aAAA,CAAc,WAAA,EAA0B,SAAA,EAAsB,UAAA,EAAwB;AAC7F,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,EAAA,IAAA,CAAK,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAejB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,eAAe,CAAA;AAEhD,EAAA,QAAA,CAAS,QAAQ,WAAA,CAAY,QAAA,IAAY,OAAO,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,GAAI,EAAA;AAC/E,EAAA,QAAA,CAAS,QAAQ,WAAA,CAAY,QAAA,IAAY,OAAO,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA,GAAI,EAAA;AAC/E,EAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,IAAA;AACzB,EAAA,MAAA,CAAO,QAAQ,WAAA,CAAY,MAAA;AAE3B,EAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AACpC,IAAA,WAAA,CAAY,UAAA,CAAW;AAAA,MACrB,UAAU,QAAA,CAAS,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,MACpD,UAAU,QAAA,CAAS,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,MACpD,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AACD,IAAA,SAAA,CAAU,SAAA,EAAU,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,KAAA,EAAgC,UAAA,EAAqC,IAAA,EAAc;AACrG,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AACjB,EAAC,OAAoD,gBAAA,GAAmB,IAAA;AAExE,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,gBAAgB,CAAA;AAIpD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EACvB,CAAC,CAAA;AAED,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CACP,WAAA,EACA,SAAA,EACA,UAAA,EACA,UAAA,EACA;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AAEjB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,EAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,EAAA,IAAA,CAAK,QAAA,GAAW,YAAY,IAAA,IAAQ,CAAA;AACpC,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM;AACnC,IAAA,WAAA,CAAY,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,IAAA,GAAO,CAAC,CAAC,CAAA;AACrD,IAAA,SAAA,CAAU,SAAA,EAAU,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC5C,EAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,EAAA,IAAA,CAAK,QAAA,GAAW,YAAY,IAAA,IAAQ,UAAA;AACpC,EAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM;AACnC,IAAA,WAAA,CAAY,QAAQ,IAAA,CAAK,GAAA,CAAI,YAAY,WAAA,CAAY,IAAA,GAAO,CAAC,CAAC,CAAA;AAC9D,IAAA,SAAA,CAAU,SAAA,EAAU,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,iBAAA;AACjB,EAAA,IAAA,CAAK,WAAA,GAAc,CAAA,UAAA,EAAU,WAAA,CAAY,IAAI,OAAO,UAAU,CAAA,CAAA;AAE9D,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAErB,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,eAAA,CAAgB,GAAA,EAAkB,OAAA,GAAkC,EAAC,EAAkB;AAC3G,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,qBAAA,CAAsB,0CAA0C,CAAA;AAChF,IAAA,OAAA,CAAQ,UAAU,GAAG,CAAA;AACrB,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,EAAM;AAC3B,IAAA,UAAA,CAAW,QAAQ,OAAO,CAAA;AAAA,EAC5B,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,YAAY,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,eAAA,IAAmB,eAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,MAAA,KAAW,cAAc,MAAA,CAAO,QAAA,CAAS,WAAW,EAAE,CAAA;AAClF,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,GAAA,CAAI,SAAA,GAAY,iEAAA;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,oBAAA;AAEhB,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,KAAgB,OAAO,MAAA,KAAW,cAAc,uBAAA,CAAwB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,CAAA;AAC9H,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,EAAA,IAAI,MAAA,GAAqB,EAAE,KAAA,EAAO,EAAC,EAAE;AAErC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,WAAW,CAAA;AACnD,IAAA,MAAA,GAAS,yBAAA,CAA0B,GAAA,CAAI,IAAA,IAAQ,MAAM,CAAA;AACrD,IAAA,UAAA,CAAW,MAAM,CAAA;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,qBAAA,CAAsB,MAAA,CAAO,KAAK,CAAC,CAAA;AACpF,IAAA,OAAA,CAAQ,UAAU,GAAG,CAAA;AACrB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA,qCAAA,EAAqC,GAAA,CAAI,OAAO,CAAA,IAAA,CAAA;AAChE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,IAAA,EAAM,WAAW,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,sBAAsB,MAAM,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,IAAI,CAAA;AAE3C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAapB,EAAA,GAAA,CAAI,SAAA,GAAY,EAAA;AAChB,EAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AAErB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,sBAAA;AACtB,EAAA,GAAA,CAAI,YAAY,SAAS,CAAA;AAEzB,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,EAAA,cAAA,CAAe,SAAA,GAAY,eAAA;AAC3B,EAAA,SAAA,CAAU,YAAY,cAAc,CAAA;AACpC,EAAA,MAAM,kBAAA,CAAmB,UAAA,EAAY,cAAA,EAAgB,UAAU,CAAA;AAE/D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,gBAAA;AACnB,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAEjD,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AAEnB,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,MAAA,CAAO,SAAA,GAAY,CAAA,iBAAA,EAAoB,SAAA,CAAU,KAAK,CAAA,IAAA,CAAA;AACtD,MAAA,YAAA,CAAa,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,MAAA,CAAO,SAAA,GAAY,gCAAA;AACnB,MAAA,YAAA,CAAa,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,SAAA,CAAU,UAAA,GAAa,WAAA,CAAY,OAAO,CAAC,CAAA;AACpF,IAAA,MAAA,CAAO,YAAY,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,UAAA,EAAY,IAAI,CAAC,CAAA;AAChE,IAAA,YAAA,CAAa,SAAA,GAAY,EAAA;AACzB,IAAA,YAAA,CAAa,YAAY,gBAAA,CAAiB,WAAA,EAAa,SAAA,EAAW,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EAC3F,CAAA;AAEA,EAAA,SAAA,CAAU,WAAA,CAAY,aAAA,CAAc,WAAA,EAAa,SAAA,EAAW,UAAU,CAAC,CAAA;AACvE,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAC5B,EAAA,SAAA,CAAU,YAAY,YAAY,CAAA;AAElC,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,SAAA,EAAU;AAAA,EAC5B,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,UAAA,EAAW;AACb","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"]}
|
|
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 /** 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/index.d.cts
CHANGED
|
@@ -1,54 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
}
|
|
1
|
+
import { S as SiteEnvironment, a as SiteConfig } from './index-CxOAQ9Nx.cjs';
|
|
2
|
+
export { B as BlockDef, P as PageDef, b as PropiedadCardBlockProps, c as SiteConfigTheme } from './index-CxOAQ9Nx.cjs';
|
|
52
3
|
|
|
53
4
|
interface CatalogRef {
|
|
54
5
|
id: string;
|
|
@@ -81,16 +32,18 @@ interface PublicPropertySummary {
|
|
|
81
32
|
}
|
|
82
33
|
|
|
83
34
|
interface BootSiteRuntimeOptions {
|
|
84
|
-
/**
|
|
35
|
+
/** Tenant slug (e.g. 'mi-inmobiliaria'). Prefer this so the storefront works on any URL. */
|
|
36
|
+
slug?: string;
|
|
37
|
+
/** API base URL (e.g. https://api.onlistify.com). If not set, uses VITE_PUBLIC_API_URL or setApiBase. */
|
|
85
38
|
baseUrl?: string;
|
|
86
39
|
/** 'draft' or 'live'. Defaults to query param ?environment=draft or 'live'. */
|
|
87
40
|
environment?: SiteEnvironment;
|
|
88
|
-
/** Custom function to derive tenant slug from pathname.
|
|
41
|
+
/** Custom function to derive tenant slug from pathname. Ignored if slug is set. */
|
|
89
42
|
getSlugFromPath?: (pathname: string) => string;
|
|
90
43
|
/** Called when config load or runtime errors occur. */
|
|
91
44
|
onError?: (err: Error) => void;
|
|
92
45
|
}
|
|
93
|
-
/** Mounts the storefront UI
|
|
46
|
+
/** Mounts the storefront UI into the given element. Pass slug and baseUrl in options for a standard integration on any URL. */
|
|
94
47
|
declare function bootSiteRuntime(app: HTMLElement, options?: BootSiteRuntimeOptions): Promise<void>;
|
|
95
48
|
|
|
96
49
|
/** 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. */
|
|
@@ -161,4 +114,4 @@ declare class StorefrontNetworkError extends Error {
|
|
|
161
114
|
constructor(message: string, cause?: unknown);
|
|
162
115
|
}
|
|
163
116
|
|
|
164
|
-
export { type
|
|
117
|
+
export { type BootSiteRuntimeOptions, type CatalogRef, type ListPropertiesParams, type PaginationMeta, type PluginItem, type PropertiesApiResponse, type PublicPropertySummary, SiteConfig, SiteEnvironment, StorefrontConfigError, StorefrontNetworkError, bootSiteRuntime, fetchPlugins, fetchProperties, fetchSiteConfig, setApiBase };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,54 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
}
|
|
1
|
+
import { S as SiteEnvironment, a as SiteConfig } from './index-CxOAQ9Nx.js';
|
|
2
|
+
export { B as BlockDef, P as PageDef, b as PropiedadCardBlockProps, c as SiteConfigTheme } from './index-CxOAQ9Nx.js';
|
|
52
3
|
|
|
53
4
|
interface CatalogRef {
|
|
54
5
|
id: string;
|
|
@@ -81,16 +32,18 @@ interface PublicPropertySummary {
|
|
|
81
32
|
}
|
|
82
33
|
|
|
83
34
|
interface BootSiteRuntimeOptions {
|
|
84
|
-
/**
|
|
35
|
+
/** Tenant slug (e.g. 'mi-inmobiliaria'). Prefer this so the storefront works on any URL. */
|
|
36
|
+
slug?: string;
|
|
37
|
+
/** API base URL (e.g. https://api.onlistify.com). If not set, uses VITE_PUBLIC_API_URL or setApiBase. */
|
|
85
38
|
baseUrl?: string;
|
|
86
39
|
/** 'draft' or 'live'. Defaults to query param ?environment=draft or 'live'. */
|
|
87
40
|
environment?: SiteEnvironment;
|
|
88
|
-
/** Custom function to derive tenant slug from pathname.
|
|
41
|
+
/** Custom function to derive tenant slug from pathname. Ignored if slug is set. */
|
|
89
42
|
getSlugFromPath?: (pathname: string) => string;
|
|
90
43
|
/** Called when config load or runtime errors occur. */
|
|
91
44
|
onError?: (err: Error) => void;
|
|
92
45
|
}
|
|
93
|
-
/** Mounts the storefront UI
|
|
46
|
+
/** Mounts the storefront UI into the given element. Pass slug and baseUrl in options for a standard integration on any URL. */
|
|
94
47
|
declare function bootSiteRuntime(app: HTMLElement, options?: BootSiteRuntimeOptions): Promise<void>;
|
|
95
48
|
|
|
96
49
|
/** 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. */
|
|
@@ -161,4 +114,4 @@ declare class StorefrontNetworkError extends Error {
|
|
|
161
114
|
constructor(message: string, cause?: unknown);
|
|
162
115
|
}
|
|
163
116
|
|
|
164
|
-
export { type
|
|
117
|
+
export { type BootSiteRuntimeOptions, type CatalogRef, type ListPropertiesParams, type PaginationMeta, type PluginItem, type PropertiesApiResponse, type PublicPropertySummary, SiteConfig, SiteEnvironment, StorefrontConfigError, StorefrontNetworkError, bootSiteRuntime, fetchPlugins, fetchProperties, fetchSiteConfig, setApiBase };
|
package/dist/index.js
CHANGED
|
@@ -503,7 +503,8 @@ PropiedadCard = __decorateClass([
|
|
|
503
503
|
|
|
504
504
|
// src/sdk/site-runtime.ts
|
|
505
505
|
var BUILTIN_PLUGIN_URLS = {
|
|
506
|
-
"onl-hero": { js: "/plugins/example/hero-plugin.js", css: "/plugins/example/hero-plugin.css" }
|
|
506
|
+
"onl-hero": { js: "/plugins/example/hero-plugin.js", css: "/plugins/example/hero-plugin.css" },
|
|
507
|
+
"onl-header": { js: "/plugins/example/header-plugin.js", css: "/plugins/example/header-plugin.css" }
|
|
507
508
|
};
|
|
508
509
|
var loadedPlugins = /* @__PURE__ */ new Set();
|
|
509
510
|
function getSlugFromPath(pathname) {
|
|
@@ -677,10 +678,9 @@ async function bootSiteRuntime(app, options = {}) {
|
|
|
677
678
|
} else {
|
|
678
679
|
setApiBase(getApiBase());
|
|
679
680
|
}
|
|
680
|
-
const
|
|
681
|
-
const slug = getSlug(typeof window !== "undefined" ? window.location.pathname : "");
|
|
681
|
+
const slug = options.slug?.trim() || (options.getSlugFromPath ?? getSlugFromPath)(typeof window !== "undefined" ? window.location.pathname : "");
|
|
682
682
|
if (!slug) {
|
|
683
|
-
app.innerHTML = "<p>
|
|
683
|
+
app.innerHTML = "<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>";
|
|
684
684
|
return;
|
|
685
685
|
}
|
|
686
686
|
app.innerHTML = "<p>Cargando...</p>";
|