{"version":3,"file":"/assets/js/app-web-f0a5937ff41e05593141.js","mappings":"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knE,I,E6BwB/lE,K,G7BxBsrE,I,KAA4C,IDtHrvE,M,KCsHmyE,IDtHnyE,M,GCsH00E,I,E6B8BvzE,K,G7B9B84E,I,KAA4C,IDtH78E,M,KCsH2/E,IDtH3/E,M,GCsHkiF,I,E6BoC/gF,K,G7BpCsmF,I,KAA4C,IDtHrqF,M,KCsHmtF,IDtHntF,M,GCsH0vF,I,E6B0CvuF,K,G7B1C8zF,I,KAA4C,IDtH73F,M,KCsH26F,IDtH36F,M,KCsHk9F,IDtHl9F,M,E8BsKmB,K,K7BhDshG,IDtHziG,M,GCsH4kG,I,E6BoD7jG,K,G7BpD4oG,I,KAAwC,IDtHnsG,M,KCsH6uG,IDtH7uG,M,E8B+Ke,K,K7BzDgzG,IDtH/zG,M,EiCZN,S,GH8LqB,K,M7B5D46G,IDtH37G,M,GMfN,O,GwBqM0B,K,M7BhE6iH,IDtHjkH,M,GiCZN,S,GHqM0B,K,M7BnEwrH,IDtH5sH,M,GMfN,O,GwB4M2B,K,M7BvEo0H,IDtHz1H,M,GiCZN,S,GH4M2B,K,M7B1Ek9H,IDtHv+H,M,GmCHN,Y,GLuMsB,IAAAR,I,KArEtB,I,KACA,I,KACA,I,KACA,I,KACA,I,KACA,I,KACA,I,eMlJJ,O,KADqBtM,I,KAHjB,KpCGL,EoCEH,C,4BALoB2N,K,aCEiD1P,GAKrE,O,KhD2DQ,GA7DR,EgBDynG,MhBCrnG,IgDEJ,G,YAJQC,GAGJ,O,KAFI,EAAA0P,W,KAKA,IAJA,EAAAjU,GAAM,iBACV,G,YAGmC0I,GAEvC,O,KADI,EAAAoB,Q/BRI,O+BSR,G,4BAT2CjF,GAAI,sBAAsB,I,GAOpC0C,GAAM,I,eCwE/B,O,UAAA,EAOR,C,YA1E2CjD,G,SAEvC4P,EADAhN,EAAA1C,EAAYgE,K,GACZ0L,EAAYC,GAAA,OADZjN,EACqB,E,SAAAkN,GACjB,EAAAxM,gBpCa8J,UoCZ9J,EAAAe,QAAA,GrCWkC,IqCXlC,UrCaJ,IDdU,M,SCeL,GDfK,MsCMV,OAJI,EAAA0L,UtCrBW,EsCqBX,UnCT+lB,EAAM,MAAY,MmCUjnB,EAAAvK,Q5BAA,O4BCA,EAAAqB,oBAAA,GvBxBk3B,GfP/xB,KsCgCnF,EAAAD,IAAA,GrCeA,IDpBM,MsCMV,M,SAEO3G,GAIP,OAHI,EAAA0P,UAAY,EAwCsD,GAtClE,EjCxBinG,MiC6BjnG,IAJJ,KACJ,OjDoCQ,GAnCqB,EgB3Bk8H,ShBgE38H,GiDtCpB,G,YAGQ1P,GAKJ,O,KAJI,EAAA0P,W,KAOA,IjDyBA,GiD9BA,EjChCinG,MhBqDznG,IASQ,GiD7BA,EjCjCinG,MhBuDtmG,IiDrBf,G,YAeI1P,GAGJ,O,KAUAkE,GAZI,EAYM,iCAVV,G,YAIIlE,GAEJ,O,KAaA+G,GAdI,EAcA,KAAyB,IAb7B,G,YAa6BY,G,sBCrEzB,IDwEJ,OjDnBI,GiDiBA,EjDjBS,GAOT,GiDWA,EjCzEk7T,OhB2Fz7T,IiDjBG,G,YAiBK3H,GAQL,O,KAPI8C,GAAK,EAAC,Y,SE9FV1E,EACA2R,EACAjN,EACAkN,G,SAAwB,O,iBAQpB,I,GAVJC,EAGkB,EAFlBC,EAEkB,EADlBC,EACkB,E,SAAAnQ,GAItB,OAHI,OAAY,EACZ,OAAY,EACZ,SAAc,EAClB,K,IAPIiQ,EACAC,EACAC,EAoC2oB,GAnC3oB,EAmCwqB,EAA0B,EA/BtsB,CFuFQC,CAAS,EACG,sBACA,KG9FZ,UHiGAtN,GAAK,EAAC,KACV,G,YA9D+BqB,G,KAC/B,EAAAoB,Q5BtBI,O4BuBJ,EAAAqB,oBtCzCmD,YsCyCnD,GvB9C+rC,GfK5oC,MsC0CnD,EAAAD,IAAA,GrCKkB,GDhCR,M,MgBfgE,UCmDuE,WAAW,MAAgB,M,E1B1D5K,G+CuDJ,OAsDmE,EAzD3D0J,OAAA,GrCKiB,IDnCX,MsCuFqD,EAxD3DzJ,oBAAA,GvBnDo0C,GfPjvC,KiB+DoD,EAjDvI,GzBmEG,E8CrBX,G,YA+B4CzC,G,KACxC,EAAAiB,e9B9DI,W8B+DJ,EAAAuB,IAAA,GrCJqB,GD9DX,MsCuEd,OrBnCg6B,EDnDl1B,UCmDw1B,WAAW,MAAgB,O1B1D77B,C+C6G+D,e9BjF3D,c8BiER,G,4BA1E8BrG,GAAI,SAAS,I,GA2Bd0C,GAAM,I,GAwCGA,GAAM,I,eI1D5C,O,KAAA,EAAgC,C,cAChC,O,KAAA,EAAiD,C,cAWjD,O,KAAA,EAA8D,C,YA5BvBjD,GAcvC,O,KrD6CQ,GA5D4C,KAEpD,IqDaA,G,YAbWC,G,WnDbP,G,EAAA,GmDyCi+B,EAzBr9BmF,OAAA,GnCdgU,KPPhQ,I,MgBYF,UCc3E,QAAW,M,E1BrBV,GmDyCi+B,EAxBt7BsJ,SAAA,GzCEpB,KDqB67C,K0CCnf,EzBhC79B,GzBmEG,E,MwBrEmE,UCiB7E,Y,KyBMD,M,KACA,K,EnD/BI,GmDyCi+B,EAvBt6BA,SAAA,GzCIvC,ODkBg8C,K0CCnf,EzBhC79B,GzBmEG,E,MwBrEmE,UCoBtE,Y,KyBKR,M,KACA,K,EnDjCI,GmDyCi+B,EAtBr6BA,SAAA,GzCS1D,ODYk9C,K0CCnf,EzBhC79B,GzBmEG,E,MwBrEmE,UCuBtD,Y,KyBIxB,M,KACA,K,EnDnCI,GmDyCi+B,EArBp6BA,SAAA,GzCWhD,ODSu8C,K0CCnf,EzBhC79B,GzBmEG,E,MwBrEmE,UC2BhE,Y,KyBEd,M,KACA,K,EnDrCI,GmDyCi+B,EApBp6BA,SAAA,GzCarC,MDM47C,K0CCnf,EzBhC79B,GzBmEG,E,MwBrEmE,UCgCpD,Y,KyBD1B,M,KACA,K,EnDvCI,GmDyBA,OAgBi+B,EAnBp6BA,SAAA,GzCe3B,ODGk7C,K0CCnf,EzBhC79B,GzBmEG,EkDnC09B,EzBL79B,KzBwCG,EmDxEgP,EAFvP,OnD0EO,EkDnDP,G,YAfuDzO,GAAC,O,KAAA,G,4BAExB,GAAG,I,GEUohB,S,GAAuC,qB,GAAmD,qB,GAAmD,qB,GAAmD,qB,GAAoD,sB,GAAqD,sB,GAAqD,sB,GAAqD,sB,GAAqD,sB,GAAqD,sB,GAAqD,sB,GAA4D,0B,aCZ9nCD,GAQ3C,O,KxDqDQ,GA/DU,EgBC04J,ShBCv5J,IwDQL,G,YAPWC,G,WtDXP,CsDkBqoE,gB3CCllE,Q2CFnD,OACqoE,EAJ7nEoE,QAAA,G5CES,IDMP,M8CZF,EAPR,U1CDA,GZ0EO,G,SuDtEPhG,G,iBAEI,IAKuwC,GAPlvC,EAO2vC,EAP7uC,CFUnCkS,CAAK,GACT,G,4BAP0BhQ,GAAI,SAAS,I,eGcnC,C,cAHJ,C,cAEA,C,YAI2BiQ,G,gBACVvQ,G,MzD5BjB,GyD6C4+C,EAfh+CmF,OAAA,G/CCL,IDTG,MgDuBk+C,EAdh+CqL,MAAA,G/CET,IDXO,MgDOF,EA1BiB,U5CDzB,GZ0EO,GwD3CC,EAAAC,QAAU,YACV,EAAAC,KAAQ,OACR,EAAAC,MAAS,6B,eARUJ,G,gBAULvQ,GAGd,OAFI,EAAA4Q,EAAI,EACJ,EAAAF,KAAQ,eACZ,G,CAHc,IAIlB,OAIwpB,GAR3oB,E3C5BmjK,O2CoCj3I,GAJ/sB,G,eAG8B,aA7BtC,C,YTJ8C3Q,GAoB9C,O,KlDwCQ,GA5D0B,EgBNG,MhBMC,IkDoBtC,G,YAnBQC,GAkBJ,O,KAjBI,EAAA0P,W,KAwBA,IAvBA,EAAAiB,MAAS,6BACT,EAAAF,QAAU,YlDwDV,GAzDsB,EgBL0iK,OhBKriK,IAyD3B,GAcK,EgB5E2jK,OhB4EtjK,IkDvDd,G,YAbSzQ,GAKL,O,KAJI,EAAA6Q,SURJ,UVSI,EAAAC,SAAY,UACZ,EAAAF,EAAK,m9CACL,EAAAF,KAAO,UACX,G,YAEK1Q,GAKL,O,KAJI,EAAA6Q,SUfJ,UVgBI,EAAAC,SAAY,UACZ,EAAAF,EAAK,wqDACL,EAAAF,KAAO,UACX,G,YAQsBvM,GAG9B,O,KAFI,EAAAqM,MAAA,GtCsGihB,IDtHvgB,MuCiBV,EAAArL,OAAA,GtCqGwiB,IDtH9hB,MuCkBd,G,4BA7B2B7E,GAAI,eAAe,I,GA0BtB0C,GAAM,I,aW1C1B5E,GACuB,O,UAEnB,EAFkB,C,4BAEU,OAC/B,44BAMiC,OACjC,2sCAM+B,OAC/B,w5C,aClBDA,GACqB,O,UAEjB,EAFgB,C,4BAEU,OAC7B,04BAM+B,OAC/B,qpCAM6B,OAC7B,kwC,aCLDA,GACsB,O,UAElB,EAFiB,C,YAEyB2B,GAgDlD,O,K/DYQ,GA5DkC,EgBNL,MhBMS,I+DgD9C,G,YA/CQC,GA8CJ,O,KA7CI,EAAA0P,W,KAqDA,IApDA,EAAAiB,MAAS,6BACT,EAAAF,QAAU,a/DwDV,GAxDP,EgBNukK,OhBMlkK,IAwDE,GApDsD,EgBV0gK,OhBWvkK,IAmDO,GA7CyB,EgBjBuiK,OhBiBliK,IA6C9B,GAhCqB,EgB9B2iK,OhB8BtiK,IAgC1B,GARO,EgBtDyjK,OhBsDpjK,IAQZ,GASe,EgBvEijK,OhBuE5iK,IATpB,GAca,EgB5EmjK,OhB4E9iK,IAdlB,GAwBM,EgBtF0jK,OhBsFrjK,I+DrCf,G,YAzCSzQ,GAGL,O,KAFI,EAAA4Q,EAAK,sDACL,EAAAF,KAAO,UACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,gGACL,EAAAF,KAAO,UACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,2OACL,EAAAF,KAAO,UACX,G,YAEK1Q,GAKL,O,KAJI,EAAA6Q,SHvBJ,UGwBI,EAAAC,SAAY,UACZ,EAAAF,EAAK,mVACL,EAAAF,KAAO,QACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,+UACL,EAAAF,KAAO,QACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,qEACL,EAAAF,KAAO,QACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,yJACL,EAAAF,KAAO,QACX,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,+DACL,EAAAF,KAAO,QACX,G,YASsBvM,GAG9B,O,KAFI,EAAAqM,MAAA,GnDsCY,KDnFF,MoD8CV,EAAArL,OAAA,GnDsCG,IDpFO,MoD+Cd,G,4BA1D6B7E,GAAI,iBAAiB,I,GAuD1B0C,GAAM,I,eCgEtB,O,KAAA,EAGR,C,YAjHI5E,GACwB,O,UAkCpB,EAlCmB,C,YAGvBA,GACkB,O,UA2Ed,EA3Ea,C,YATjBA,GACkB,O,UAUd,EAVa,C,YAU0B2B,GA0B/C,O,KhEkBQ,GA7CgD,EgBjBikG,MhBmBxnG,IgEyBD,G,YAzBQC,GAwBJ,O,KAvBI,EAAA0P,UAAY,KhE0CZ,GgExCA,EhD1B6B,MhBuL/B,IgExIF,G,YAoFI1P,GAOJ,O,KANI,EAAA0P,UAAY,KACZ,EAAAgB,KAAQ,OACR,EAAAC,MAAS,6BACT,EAAAF,QAAU,YhErEV,GgEuEA,EhDrIgkK,OhBoBzjK,IA0CP,GgEuEA,EhDrIgkK,OhBmCvkK,IA2BO,GgEuEA,EhDrIgkK,OhB+CxjK,IgEuFZ,G,YA/GazQ,GAML,O,KALI,EAAA6Q,SJvBR,UIwBQ,EAAAC,SAAY,UACZ,EAAAF,EAAI,oIAEJ,EAAAF,KAAQ,UACZ,G,YAEK1Q,GAIL,O,KAHI,EAAA4Q,EAAI,sJAEJ,EAAAF,KAAQ,UACZ,G,YAEK1Q,GAIL,O,KAHI,EAAA4Q,EAAI,gMAEJ,EAAAF,KAAQ,QACZ,G,YAK+C3Q,GA2C3D,O,KhE3BQ,GAEN,EgBhEunG,MhBgEnnG,IgEyBN,G,YA1CQC,GAyCJ,O,KAxCI,EAAA0P,UAAY,KhEcZ,GgEZA,EhDtD6B,MhBuL/B,IgE3FF,G,YAuCI1P,GAOJ,O,KANI,EAAA0P,UAAY,KACZ,EAAAgB,KAAQ,OACR,EAAAC,MAAS,6BACT,EAAAF,QAAU,YhErEV,GgEuEA,EhDrIgkK,OhBqEhkK,IAPA,GgEuEA,EhDrIgkK,OhBiFhjK,IAnBhB,GgEuEA,EhDrIgkK,OhBsFpjK,IAxBZ,GgEuEA,EhDrI+jB,OhB8FtkB,IgEwCG,G,YAnFazQ,GAKL,O,KAJI,EAAA6Q,SJnDR,UIoDQ,EAAAC,SAAY,UACZ,EAAAF,EAAK,mGACL,EAAAF,KAAQ,iCACZ,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,8EACL,EAAAF,KAAQ,UACZ,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,yFACL,EAAAF,KAAQ,UACZ,G,YAEK1Q,GAkBL,O,KhExBJ,GAiCG,EgB/FshJ,iBhBgGzhJ,IgEVI,G,YAjBmBA,GAgBf,O,KAfI,EAAAvE,GAAM,2BACN,EAAAsV,IAAM,UACN,EAAAC,GAAK,QACL,EAAAC,GAAK,QACL,EAAAC,IAAM,UACN,EAAAC,cAAiB,iBhEb7B,GAgDA,EgB9GkvL,OhB8G7uL,IAhDL,GAsDC,EgBpHivL,OhBoH5uL,IgE/BE,G,YARSnR,GAEL,O,KADI,EAAAoR,UAAa,UACjB,G,YAEKpR,GAGL,O,KAFI,EAAAqR,OAAU,IACV,EAAAD,UAAa,UACjB,G,YAO2BrR,GAyB/C,O,KhEtDQ,GAoEgB,EgBlIimG,MhBmItnG,IgEfH,G,YAxBQC,GAuBJ,O,KAtBI,EAAA0P,UAAY,KhE/BZ,GgEiCA,EhDnG6B,MhBuL/B,IgEhEF,G,YAYI1P,GAOJ,O,KANI,EAAA0P,UAAY,KACZ,EAAAgB,KAAQ,OACR,EAAAC,MAAS,6BACT,EAAAF,QAAU,YhErEV,GgEuEA,EhDrIgkK,OhBuIrkK,IAzEK,GgEuEA,EhDrIgkK,OhB8I3jK,IAhFL,GgEuEA,EhDrIgkK,OhB0JnkK,IgEpBD,G,YAtCazQ,GAKL,O,KAJI,EAAA6Q,SJhGR,UIiGQ,EAAAC,SAAY,UACZ,EAAAF,EAAK,4DACL,EAAAF,KAAQ,QACZ,G,YAEK1Q,GAKL,O,KAJI,EAAA6Q,SJvGR,UIwGQ,EAAAC,SAAY,UACZ,EAAAF,EAAK,yDACL,EAAAF,KAAQ,UACZ,G,YAEK1Q,GAGL,O,KAFI,EAAA4Q,EAAK,4FACL,EAAAF,KAAQ,UACZ,G,YAQkBvM,GAG9B,O,KAFI,EAAAqM,MAAA,GpDSoX,IDtH1W,MqD8GV,EAAArL,OAAA,GpDQ2Y,IDtHjY,MqD+Gd,G,4BA1GyBmM,GAAKhR,GAAI,aAAa,K,GA4BhBgR,GAAKhR,GAAI,mBAAmB,K,GA6ClCgR,GAAKhR,GAAI,aAAa,K,GA8BvB0C,GAAM,I,aCjH1B5E,EACAgM,EACAC,EACAkH,EACAvO,G,SAD0B,G,WACN,O,SAApB2M,EADA6B,EAFAC,EACAC,E,QAWI,I,GATJ/B,EACe,EAFf6B,EAEe,EAJfC,EAIe,EAHfC,EAGe,E,SAAA1R,GAKnB,OAJI,YAAiB,EACjB,UAAe,EACf,MAAW,EACX,SAAc,EAClB,KAAC,OAsB8e,GA3B3e,EA2BwgB,EAA0B,EAtBtiB,C,YAG8DD,EAAEwE,G,SAAAoN,E,GAAAA,EjEF1C,E,SiEGd3R,GAMJ,OALI,YAA8B4R,I,KAc9B,IAd2C,CAAN,EAAMlC,YAC3C,UCvBA,ODwBA,U,SAJwDiC,G,gBAIzCvR,GAAkB,OAAhB,EAAMmR,UAAU,G,CAAlB,IACf,MAAW,EAAMnH,IACjB,SAAc,EAAMC,OACxB,KACJ,OjEiCQ,GA3CU,EgBnBihL,MhBgE/gL,GiEnCpB,G,YAQiClG,GAGjC,O,KAFI,EAAA0N,YtDda,MsDeb,EAAArB,MAAA,G/C9CiqC,KPPrlC,IsDsDhF,G,cApC+B,O,KAAA,G,cAOA,O,KAAA,G,4BAUF,GAAyB,QAAQ,I,GAgBnCxN,GAAM,I,aEC7B5E,EACA4E,EACAuO,EACAzM,GACsC,O,SAFhB,G,OAEtB,KAAO9B,GAAM,GAAQuO,EAASzM,EAAO,C,YAxBrC1G,EACA4E,EACAuO,EACAzM,G,SAFoB,O,SACE,G,WADtB6K,EACA6B,EACAM,E,QAyBI,I,GA3BJnC,EAGgB,EAFhB6B,EAEgB,EADhBM,EACgB,E,SAAA9R,GAIpB,OAHI,EAAA0P,UAAY,EACZ,UAAe,EACf,KACJ,KAAC,OAgCkC,GApC/B,EAsCF,EAGiB,EArCnB,C,YAoBiE3P,EAAEwE,G,SAE/DwN,EADAC,EAD+DL,EAC/DM,EAAyB1N,EAAMmL,U,GAC/BqC,EpDvDA,GbFA,CiE4EgrB,W/C1C5qB,U+C0C4qB,ehDhD5qB,egD4BJC,EnEOwC,EmERuBL,EnEQvB,E,SmED1B3R,G,MACN,GAA0B,GpDtDA,Q,ERyEuuhD,CQhFzwhD,GbFA,CiE4EgrB,Q9C5D5qB,O8C4D4qB,cCrE5qB,Y,EzDiC6lkD,E0DkrCzkkD,OAAO,GF3pC3B,EAtDJ,UpDDA,4BAAgB,EAAb,UoD2DC,EAAAuR,Q,SAZ2DI,G,gBAYjDvR,GAAkB,OAAhB,EAAMmR,UAAU,G,CAAlB,I,MACT,EAAMW,SACX,OAlBY,GAiBR,EAjBqB,GAkBzB,KACJ,OnECQ,GARgC,EgBtDilG,MhBgErmG,GmEHpB,G,cArB2B,O,KAAA,G,cApBA,O,KAAA,G,4BA0BG,GAA0B,SAAS,I,aGzCxBtP,GAAC,U,YAEvBiB,GAEf,OADI,EAAAsB,OAAA,GpDf4a,KPPpW,I2DuB5E,G,YCSA/G,EACA4E,EACA8B,G,SADoB,O,SAApB6K,EACAmC,E,QAuBI,I,GAxBJnC,EAEa,EADbmC,EACa,E,SAAA9R,GAGjB,OAFI,EAAA0P,UAAY,EACZ,KACJ,KAAC,OAmC6H,GAtC1H,EAsCuJ,EAA0B,EAnCrL,C,YAYItR,EACA4E,EACA8B,GAC0B,O,KAA1BiC,GAAI,EAAA/D,GAAM,GAAQ8B,EAAO,C,YAI2B/E,EAAEwE,G,SAEtDwN,EADAC,EADsDL,EACtDM,EAAyB1N,EAAMmL,U,GAC/BqC,ExDpDA,GbFA,CqEoE08B,WnD7Dt8B,SmD6Ds8B,epDxCt8B,eoDyBJC,EvEIE,EuELoDL,EvEKpD,E,SuEEE3R,G,MACI,GAA0B,GxDnDA,Q,ERyEuuhD,CQhFzwhD,GbFA,CqEoE08B,QlDpDt8B,OkDoDs8B,cHvDt8B,S,EzD2B6lkD,E0DkrCzkkD,OAAO,GE9pC3B,EAnDR,UxDDI,4BAAgB,EAAb,U,MwDwDE,EAAMkS,SACX,OAdiB,GAab,EAZP,GAaG,KACJ,OvEKQ,GAdN,EgBhDunG,MhBgErmG,GuEPpB,G,4BAd2B,GAAuB,MAAM,I,aC/BpD9T,EACA0E,EACAqP,EACAC,EACAb,G,UADoB,E,SACpBC,EAHAtB,EACAmC,EACAC,E,QAuBI,I,GAtBJd,EACW,EAJXtB,EAIW,EAHXmC,EAGW,EAFXC,EAEW,E,SAAAtS,GAYf,OAXI,UAAe,EACf,OAAY,EACZ,OAAY,EACZ,WAAgB,EAQpB,KAAC,OA0BU,GAtCP,EAwCE,EAA0B,EA5BhC,C,YAS2DD,EAAEwE,G,SAEzDgO,EAFyDZ,EACzDhP,EAAA1C,EAAYgE,K,GACZsO,EzD/CA,GbFA,CsEkGH,OvD3FO,OuD2FP,QvD3FO,SuDwCqDZ,ExEM7D,EwELIhP,ExEKJ,E,SwECqB3C,G,MACT,GAAmB,EAAM0P,WzD9CC,Q,EbTlC,CsEkGH,QnDlFO,QmDkFP,EAxCW8C,UAAA,G5DKV,GDzCY,M6D4Eb,EAvCWnP,gB3DxB08B,U2D+Dr9B,EAtCW8K,MAAQ,EAAM,MAAY,MAsCrC,E5CxCmhD,U1B1DhhD,G,MAAA,CsEkGH,M3D/DssC,U2D+DtsC,OCzBO,WDyBP,E5CxC6/D,UzBkBn/D,E,MD5EP,CsEkGH,QvD3FO,QuD2FP,EA3BeA,MAAQ,EAAM,MAAY,MA2BzC,E5CxCwU,WzBkB9T,E,MD5EP,CsEkGH,UvD3FO,QuD2FP,E5CxCu9B,azBkB78B,E,MD5EP,GsEkGH,EApBeM,SAAA,G5DOD,ID/DD,M6D4Eb,E5C9DO,IzBwCG,E,MIMkwhD,CQhFzwhD,GZ0EO,I,EQpC0lkD,E0DkrCzkkD,OAAO,GGnqC3B,EA/CkB,UzDAtB,4BAAgB,EAAb,UyD0EC,EAAA8C,Q,SAnCqDI,G,gBAmCzCnJ,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","sources":["webpack://app-web/webpack/universalModuleDefinition","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/commands/AddSightToRouteCommand.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/commands/RemoveSightFromRouteCommand.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/services/GeoLocationServiceImpl.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/services/TaxiService.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/services/YandexGoService.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/services/YandexMapsService.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetails.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsController.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsEvent.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsPresenterImpl.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsQuery.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsViewState.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/History.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/IdleHistory.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListController.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListData.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListEvent.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListPresenterImpl.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListQuery.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Collections.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListViewState.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightPreview.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/usecases/sightlist/SightsPager.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/App.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-core/src/jsMain/kotlin/react/ChildrenBuilder.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/navigation/AppNavigationHost.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-js/src/jsMain/kotlin/js/core/jso.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Standard.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListView.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDeteilsView.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/text/Strings.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/js-ir/builtins/Library.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/providers/ApiClient.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/providers/SightRepository.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/usecases/sightdetails/SightDetailsController.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/jsMainSources/libraries/stdlib/js/src/kotlin/dynamic.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Length.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Color.functions.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Border.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-emotion/src/jsMain/kotlin/emotion/css/ClassName.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-core/src/jsMain/kotlin/react/IntrinsicType.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/None.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Percentage.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/JustifyContent.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/AlignItems.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Display.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/usecases/sightlist/HistoryImpl.kt","webpack://app-web/../../../../clients/app-common/src/jsMain/kotlin/ru/totalguide/app/usecases/sightlist/SightListController.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-js/src/jsMain/kotlin/js/core/JsTuple.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Overflow.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/GridLength.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Selector.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-csstype/src/jsMain/generated/csstype/RuleBuilder.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-core/src/jsMain/kotlin/react/useCallback.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/common/src/generated/_Arrays.kt","webpack://app-web/../../../../clients/app-common/src/commonMain/kotlin/ru/totalguide/app/services/MapsService.kt","webpack://app-web/../../../../clients/app-web/src/jsMain/kotlin/ru/totalguide/app/web/main.kt","webpack://app-web/../../../../core/core-client/src/commonMain/kotlin/ru/totalguide/core/client/ControllerBase.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/util/Lazy.kt","webpack://app-web/../../../../core/core-client/src/commonMain/kotlin/ru/totalguide/ui/ViewableImage.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/CollectViewState.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/ColorScheme.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/DistanceToPageBottomWatcher.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/ReactApplication.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/TGTheme.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/Typography.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/NamedColor.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/TextStyle.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/FontStyle.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/String.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/TextTransform.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/UseMainScope.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/Yandex.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/footer.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/Studio2iLogo.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/textLink.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-browser/src/jsMain/generated/web/window/WindowTarget.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/globalStyles.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-emotion/src/jsMain/kotlin/emotion/react/Global.ext.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/MediaQuery.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/header.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-emotion/src/jsMain/kotlin/emotion/react/css.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/logo.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/Icons.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-dom/src/jsMain/generated/react/dom/svg/FillRule.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/ThumbsDown.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/ThumbsUp.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/TotalguideLogo.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/icons/Yandex.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/image.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-browser/src/jsMain/generated/web/html/Loading.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/layouts/column.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/FlexDirection.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/js-ir/src/generated/_ArraysJs.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/layouts/commonScreenTemplate.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/layouts/row.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/likeButton.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Cursor.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/locationActions.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/metaDescription.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/placeActions.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-core/src/jsMain/kotlin/react/StateInstance.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/rating.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/placeCard.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/BoxShadow.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/placeholder.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/slider.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Position.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-csstype/src/jsMain/generated/csstype/AdvancedPseudosRuleBuilder.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/spinner.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/AnimationIterationCount.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-react-dom/src/jsMain/generated/react/dom/svg/StrokeLinecap.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Angle.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-emotion/src/jsMain/kotlin/emotion/css/keyframes.ext.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Time.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/style.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/js-ir/runtime/kotlinHacks.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/text/h1.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/text/p.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/text/text.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/title.kt","webpack://app-web/../../../../../../../../../leonid.khachaturov/code/kotlin-wrappers-new/kotlin-cssom-core/src/jsMain/generated/web/cssom/Number.kt","webpack://app-web/../../../../core/core-client/src/jsMain/kotlin/ru/totalguide/ui/UseDistanceToPageBottomCallback.kt","webpack://app-web/../../../../core/core-data/build/generated-src/kotlin/core-data/ApplicationProperties.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/InMemoryRouteRepository.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/kotlin/collections/Collections.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/InMemorySightRepository.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/Archive.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/ClockTower.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/Hermitage.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/RoundTower.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/VyborgCastle.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/WalkFame.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Image.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Location.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Rating.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Route.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Sight.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/entities/Thesis.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/ImageDTO.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/KtorApiClient.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/NotFoundError.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/PageDTO.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/RemoteSightRepository.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/SightDTO.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/network/ThesisDTO.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/repositories/NotFoundException.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/repositories/Page.kt","webpack://app-web/../../../../../clients/app-web/build/compileSync/js/main/productionExecutable/kotlin/src/jsMainSources/libraries/stdlib/js/src/kotlin/math.kt","webpack://app-web/../../../../core/core-data/src/commonMain/kotlin/ru/totalguide/core/data/content/lists.kt"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"app-web\"] = factory();\n\telse\n\t\troot[\"app-web\"] = factory();\n})(this, () => {\nreturn ","package ru.totalguide.app.commands\r\n\r\nimport ru.totalguide.core.repositories.RouteRepository\r\n\r\nclass AddSightToRouteCommand(\r\n private val repository: RouteRepository,\r\n private val sightId: String\r\n) {\r\n\r\n fun execute () {\r\n val currentRoute = repository.currentRoute.value\r\n val newRoute = currentRoute.copy(sights = currentRoute.sights + sightId)\r\n\r\n repository.save(newRoute)\r\n }\r\n}\r\n","package ru.totalguide.app.commands\r\n\r\nimport ru.totalguide.core.repositories.RouteRepository\r\n\r\nclass RemoveSightFromRouteCommand(\r\n private val repository: RouteRepository, private val sightId: String) {\r\n fun execute() {\r\n val currentRoute = repository.currentRoute.value\r\n val newRoute = currentRoute.copy(sights = currentRoute.sights - sightId)\r\n\r\n repository.save(newRoute)\r\n }\r\n\r\n}\r\n","/*\r\n * Created by abond 03.10.2023, 12:45\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.services\r\n\r\nimport ru.totalguide.core.entities.Location\r\n\r\nprivate class GeoLocationServiceImpl : GeoLocationService {\r\n private val redSquare = Location(latitude = 60.710295, longitude = 28.749282) //todo: заменить на реальное местоположение\r\n override val currantLocation: Location = redSquare\r\n}\r\n\r\nfun geoLocationService(): GeoLocationService = GeoLocationServiceImpl()","/*\r\n * Created by abond 22.09.2023, 08:33\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.services\r\n\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.app.services.TaxiService.RedirectionTarget.SITE\r\n\r\ninterface TaxiService {\r\n fun createCallUrl(from: Location, to: Location, redirectTo: RedirectionTarget = SITE): String\r\n\r\n enum class RedirectionTarget {\r\n SITE,\r\n APP,\r\n }\r\n}","/*\r\n * Created by abond 22.09.2023, 08:34\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.services\r\n\r\nimport ru.totalguide.app.services.TaxiService.RedirectionTarget\r\nimport ru.totalguide.app.services.TaxiService.RedirectionTarget.SITE\r\nimport ru.totalguide.core.entities.Location\r\n\r\nprivate class YandexGoService : TaxiService {\r\n override fun createCallUrl(\r\n from: Location,\r\n to: Location,\r\n redirectTo: RedirectionTarget\r\n ): String {\r\n val trackingId = getTrackingId(redirectTo)\r\n return \"https://3.redirect.appmetrica.yandex.com/route?end-lat=${to.latitude}&end-lon=${to.longitude}&appmetrica_tracking_id=$trackingId\"\r\n// return \"https://3.redirect.appmetrica.yandex.com/route?start-lat=${from.latitude}&start-lon=${from.longitude}&end-lat=${to.latitude}&end-lon=${to.longitude}&appmetrica_tracking_id=$trackingId\"\r\n }\r\n\r\n companion object {\r\n private const val TRACKING_ID_SITE = \"25395763362139037\"\r\n private const val TRACKING_ID_APP = \"1178268795219780156\"\r\n\r\n private fun getTrackingId(redirectTo: RedirectionTarget) =\r\n if (redirectTo == SITE) TRACKING_ID_SITE else TRACKING_ID_APP\r\n }\r\n}\r\n\r\nfun yandexGoService(): TaxiService = YandexGoService()","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.services\r\n\r\nimport ru.totalguide.core.entities.Location\r\n\r\nprivate class YandexMapsService : MapsService {\r\n override fun createShowOnMapUrl(location: Location, zoom: Int): String {\r\n return \"https://yandex.ru/maps/?ll=${location.longitude},${location.latitude}&pt=${location.longitude},${location.latitude}&z=$zoom\"\r\n }\r\n\r\n override fun createRouteUrl(from: Location, to: Location): String {\r\n return \"https://yandex.ru/maps/?rtext=~${to.latitude},${to.longitude}&rtt=auto\"\r\n// return \"https://yandex.ru/maps/?rtext=${from.latitude},${from.longitude}~${to.latitude},${to.longitude}&rtt=auto\"\r\n }\r\n}\r\n\r\nfun yandexMapsService(): MapsService = YandexMapsService()","package ru.totalguide.app.usecases.sightdetails\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\n\r\ndata class SightDetails(\r\n val id: String,\r\n val name: String,\r\n val description: String,\r\n val covers: List,\r\n val theses: List,\r\n val isAddedToRoute: Boolean,\r\n val likesCount: Long,\r\n val dislikesCount: Long,\r\n val rating: Long,\r\n val location: Location,\r\n)","/*\r\n * Created by abond 22.09.2023, 08:26\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.Dispatchers\r\nimport ru.totalguide.app.commands.AddSightToRouteCommand\r\nimport ru.totalguide.app.commands.RemoveSightFromRouteCommand\r\nimport ru.totalguide.app.navigation.Navigator\r\nimport ru.totalguide.app.services.geoLocationService\r\nimport ru.totalguide.app.services.yandexGoService\r\nimport ru.totalguide.app.services.yandexMapsService\r\nimport ru.totalguide.app.usecases.sightdetails.SightDetailsEvent.AddSightToRoute\r\nimport ru.totalguide.app.usecases.sightdetails.SightDetailsEvent.RefreshViewState\r\nimport ru.totalguide.app.usecases.sightdetails.SightDetailsEvent.RemoveSightFromRoute\r\nimport ru.totalguide.app.usecases.sightdetails.SightDetailsEvent.ShowRouteEditor\r\nimport ru.totalguide.core.client.Controller\r\nimport ru.totalguide.core.client.ControllerBase\r\nimport ru.totalguide.core.data.InMemoryRouteRepository\r\nimport ru.totalguide.core.data.InMemorySightRepository\r\nimport ru.totalguide.core.data.content.sights\r\nimport ru.totalguide.core.repositories.NotFoundException\r\nimport ru.totalguide.core.repositories.RouteRepository\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\nprivate class SightDetailsController(\r\n sightSlug: String,\r\n private val navigator: Navigator,\r\n sightRepository: SightRepository,\r\n private val routeRepository: RouteRepository,\r\n private val presenter: SightDetailsPresenter,\r\n scope: CoroutineScope,\r\n) : ControllerBase(scope) {\r\n\r\n private val query = SightDetailsQuery(\r\n sightSlug,\r\n sightRepository,\r\n routeRepository,\r\n )\r\n\r\n private fun refreshViewState() = launch {\r\n emitViewState(LoadingSightDetailsViewState)\r\n\r\n launch {\r\n try {\r\n val result = query.execute()\r\n emitViewState(createViewState(result))\r\n } catch (e: NotFoundException) {\r\n emitViewState(NotFoundViewState)\r\n }\r\n }\r\n }\r\n\r\n private fun addSightToRoute() = launch {\r\n val currentState = viewState.value\r\n if (currentState is DisplaySightDetailsViewState) {\r\n AddSightToRouteCommand(\r\n repository = routeRepository,\r\n sightId = currentState.details.id\r\n ).execute()\r\n\r\n refreshViewState()\r\n }\r\n }\r\n\r\n private fun removeSightFromRoute() = launch {\r\n val currentState = viewState.value\r\n if (currentState is DisplaySightDetailsViewState) {\r\n RemoveSightFromRouteCommand(\r\n repository = routeRepository,\r\n sightId = currentState.details.id\r\n ).execute()\r\n refreshViewState()\r\n }\r\n }\r\n\r\n private fun showRouteEditor() = navigator.navigateToRouteEditor()\r\n\r\n private fun createViewState(result: SightDetailsQuery.Result) =\r\n presenter.present(result.details)\r\n\r\n override fun handle(event: SightDetailsEvent) {\r\n when (event) {\r\n RefreshViewState -> refreshViewState()\r\n AddSightToRoute -> addSightToRoute()\r\n RemoveSightFromRoute -> removeSightFromRoute()\r\n ShowRouteEditor -> showRouteEditor()\r\n }\r\n }\r\n\r\n override fun createInitialViewState() = EmptySightDetailsViewState\r\n}\r\n\r\nfun sightDetailsController(\r\n sightSlug: String,\r\n navigator: Navigator,\r\n sightRepository: SightRepository = InMemorySightRepository(sights),\r\n routeRepository: RouteRepository = InMemoryRouteRepository.singleton,\r\n presenter: SightDetailsPresenter = SightDetailsPresenterImpl(\r\n mapsService = yandexMapsService(),\r\n taxiService = yandexGoService(),\r\n geoLocationService = geoLocationService(),\r\n ),\r\n scope: CoroutineScope = CoroutineScope(Dispatchers.Default),\r\n): Controller = SightDetailsController(\r\n sightSlug = sightSlug,\r\n navigator = navigator,\r\n sightRepository = sightRepository,\r\n routeRepository = routeRepository,\r\n presenter = presenter,\r\n scope = scope\r\n)","/*\r\n * Created by abond 22.09.2023, 08:31\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nsealed class SightDetailsEvent {\r\n data object RefreshViewState: SightDetailsEvent()\r\n data object AddSightToRoute: SightDetailsEvent()\r\n data object RemoveSightFromRoute: SightDetailsEvent()\r\n data object ShowRouteEditor: SightDetailsEvent()\r\n}\r\n","/*\r\n * Created by abond 22.09.2023, 08:31\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nimport ru.totalguide.app.services.GeoLocationService\r\nimport ru.totalguide.app.services.MapsService\r\nimport ru.totalguide.app.services.TaxiService\r\nimport ru.totalguide.app.usecases.sightdetails.DisplaySightDetailsViewState.ViewableSightDetails\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.ui.toViewables\r\n\r\nclass SightDetailsPresenterImpl(\r\n private val mapsService: MapsService,\r\n private val taxiService: TaxiService,\r\n private val geoLocationService: GeoLocationService,\r\n) : SightDetailsPresenter {\r\n override fun present(data: SightDetails): SightDetailsViewState {\r\n return DisplaySightDetailsViewState(data.toViewableSightDetail(geoLocationService.currantLocation))\r\n }\r\n\r\n private fun SightDetails.toViewableSightDetail(userCurrentLocation: Location) =\r\n ViewableSightDetails(\r\n id = id,\r\n title = name,\r\n description = description,\r\n covers = covers.toViewables(),\r\n theses = theses,\r\n isAddedToRoute = isAddedToRoute,\r\n likesCount = likesCount.toString(),\r\n dislikesCount = dislikesCount.toString(),\r\n rating = rating.toString(),\r\n showOnMapUrl = mapsService.createShowOnMapUrl(location),\r\n routeUrl = mapsService.createRouteUrl(from = userCurrentLocation, to = location),\r\n callTaxiUrl = taxiService.createCallUrl(from = userCurrentLocation, to = location),\r\n )\r\n}\r\n","/*\r\n * Created by abond 22.09.2023, 08:32\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nimport ru.totalguide.app.usecases.base.Query\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.asTexts\r\nimport ru.totalguide.core.repositories.RouteRepository\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\ninternal class SightDetailsQuery(\r\n private val sightSlug: String,\r\n private val sightRepository: SightRepository,\r\n private val routeRepository: RouteRepository,\r\n) : Query {\r\n\r\n override suspend fun execute(): Result {\r\n val sight = sightRepository.getBySlug(sightSlug)\r\n\r\n return Result(sight.toDetails())\r\n }\r\n\r\n private fun Sight.toDetails(): SightDetails = SightDetails(\r\n id = id,\r\n name = name,\r\n description = description,\r\n covers = covers,\r\n theses = theses.asTexts(),\r\n isAddedToRoute = routeRepository.currentRoute.value.contains(id),\r\n likesCount = rating.likesCount,\r\n dislikesCount = rating.dislikesCount,\r\n rating = rating.rating,\r\n location = location,\r\n )\r\n\r\n data class Result(val details: SightDetails) : Query.Result\r\n}\r\n","package ru.totalguide.app.usecases.sightdetails\r\n\r\nimport ru.totalguide.ui.ViewableImage\r\n\r\nsealed interface SightDetailsViewState\r\n\r\ndata object EmptySightDetailsViewState : SightDetailsViewState\r\n\r\ndata class DisplaySightDetailsViewState(\r\n val details: ViewableSightDetails\r\n) : SightDetailsViewState {\r\n\r\n data class ViewableSightDetails(\r\n val id: String,\r\n val title: String,\r\n val description: String,\r\n val covers: List,\r\n val theses: List,\r\n val isAddedToRoute: Boolean,\r\n val likesCount: String,\r\n val dislikesCount: String,\r\n val rating: String,\r\n val showOnMapUrl: String,\r\n val routeUrl: String,\r\n val callTaxiUrl: String,\r\n )\r\n}\r\n\r\ndata object LoadingSightDetailsViewState : SightDetailsViewState\r\n\r\ndata object NotFoundViewState : SightDetailsViewState","/*\r\n * Created by abond 03.11.2023, 10:53\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\ninterface History {\r\n fun setQueryParams(vararg params: QueryParam)\r\n}\r\n\r\ndata class QueryParam(\r\n val name: String,\r\n val value: String,\r\n)","/*\r\n * Created by abond 01.11.2023, 16:45\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nclass IdleHistory : History {\r\n override fun setQueryParams(vararg params: QueryParam) { }\r\n}","/*\r\n * Created by abond 22.09.2023, 08:26\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.Dispatchers\r\nimport ru.totalguide.app.commands.AddSightToRouteCommand\r\nimport ru.totalguide.app.commands.RemoveSightFromRouteCommand\r\nimport ru.totalguide.app.navigation.Navigator\r\nimport ru.totalguide.app.services.geoLocationService\r\nimport ru.totalguide.app.services.yandexGoService\r\nimport ru.totalguide.app.services.yandexMapsService\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.AddSightToRoute\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.LoadNextPage\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.RefreshViewState\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.RemoveSightFromRoute\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.ShowRouteEditor\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.ShowSightDetails\r\nimport ru.totalguide.core.client.Controller\r\nimport ru.totalguide.core.client.ControllerBase\r\nimport ru.totalguide.core.data.InMemoryRouteRepository\r\nimport ru.totalguide.core.data.InMemorySightRepository\r\nimport ru.totalguide.core.data.content.sights\r\nimport ru.totalguide.core.repositories.RouteRepository\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\nprivate class SightListController(\r\n private val pager: SightsPager,\r\n private val navigator: Navigator,\r\n private val routeRepository: RouteRepository,\r\n private val presenter: SightListPresenter,\r\n val scope: CoroutineScope\r\n) : ControllerBase(scope) {\r\n\r\n private suspend fun refreshViewState() {\r\n emitViewState(createViewState())\r\n }\r\n\r\n private fun refresh() = launch {\r\n if (isPageLoading()) return@launch\r\n\r\n emitViewState(LoadSightListViewState)\r\n loadFirstPage()\r\n }\r\n\r\n private fun loadFirstPage() = launch {\r\n pager.reload()\r\n refreshViewState()\r\n }\r\n\r\n private fun isPageLoading() = pager.isLoading.value\r\n\r\n private fun loadNextPage() = launch {\r\n if (isPageLoading() || !hasMoreItems()) return@launch\r\n\r\n val state = viewState.value as DisplaySightListViewState\r\n emitViewState(state.copy(isNextPageLoading = true))\r\n\r\n launch {\r\n pager.loadNextPage()\r\n refreshViewState()\r\n\r\n }\r\n }\r\n\r\n private fun hasMoreItems() = pager.items.value.hasMore\r\n\r\n private fun addSightToRoute(sightId: String) = launch {\r\n AddSightToRouteCommand(routeRepository, sightId).execute()\r\n refreshViewState()\r\n }\r\n\r\n private fun removeSightFromRoute(sightId: String) = launch {\r\n RemoveSightFromRouteCommand(routeRepository, sightId).execute()\r\n refreshViewState()\r\n }\r\n\r\n private fun showSightDetails(sightId: String) = navigator.navigateToSightDetails(sightId)\r\n\r\n private fun showRouteEditor() = navigator.navigateToRouteEditor()\r\n\r\n private fun createViewState(): SightListViewState = presenter.present(pager.items.value)\r\n\r\n override fun handle(event: SightListEvent) {\r\n when (event) {\r\n is AddSightToRoute -> addSightToRoute(event.sightId)\r\n is RemoveSightFromRoute -> removeSightFromRoute(event.sightId)\r\n is ShowSightDetails -> showSightDetails(event.sightSlug)\r\n LoadNextPage -> loadNextPage()\r\n RefreshViewState -> refresh()\r\n ShowRouteEditor -> showRouteEditor()\r\n }\r\n }\r\n\r\n override fun createInitialViewState() = EmptySightListViewState\r\n}\r\n\r\nfun sightListController(\r\n initialPage: Int = 1,\r\n itemsPerPage: Int = 15,\r\n history: History = IdleHistory(),\r\n navigator: Navigator,\r\n sightRepository: SightRepository = InMemorySightRepository(sights),\r\n routeRepository: RouteRepository = InMemoryRouteRepository.singleton,\r\n presenter: SightListPresenter = SightListPresenterImpl(\r\n routeRepository = routeRepository,\r\n mapsService = yandexMapsService(),\r\n taxiService = yandexGoService(),\r\n geoLocationService = geoLocationService(),\r\n ),\r\n pager: SightsPager = SightsPager(\r\n query = SightListQuery(\r\n sightRepository = sightRepository,\r\n navigator = navigator\r\n ),\r\n initialPage = initialPage,\r\n itemsPerPage = itemsPerPage,\r\n history = history\r\n ),\r\n scope: CoroutineScope = CoroutineScope(Dispatchers.Default)\r\n): Controller = SightListController(\r\n pager = pager,\r\n navigator = navigator,\r\n routeRepository = routeRepository,\r\n presenter = presenter,\r\n scope = scope,\r\n)","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\ndata class SightListData (\r\n val sightPreviews: List,\r\n val hasMore: Boolean,\r\n)","package ru.totalguide.app.usecases.sightlist\r\n\r\nsealed class SightListEvent {\r\n data class AddSightToRoute(val sightId: String): SightListEvent()\r\n data object LoadNextPage: SightListEvent()\r\n data object RefreshViewState: SightListEvent()\r\n data class RemoveSightFromRoute(val sightId: String): SightListEvent()\r\n data object ShowRouteEditor: SightListEvent()\r\n data class ShowSightDetails(val sightSlug: String): SightListEvent()\r\n}\r\n","/*\r\n * Created by abond 22.09.2023, 08:33\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport ru.totalguide.app.services.GeoLocationService\r\nimport ru.totalguide.app.services.MapsService\r\nimport ru.totalguide.app.services.TaxiService\r\nimport ru.totalguide.app.usecases.sightlist.DisplaySightListViewState.ViewableSightPreview\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.repositories.RouteRepository\r\nimport ru.totalguide.ui.toViewables\r\n\r\ninternal class SightListPresenterImpl(\r\n private val routeRepository: RouteRepository,\r\n private val mapsService: MapsService,\r\n private val taxiService: TaxiService,\r\n private val geoLocationService: GeoLocationService,\r\n) : SightListPresenter {\r\n\r\n override fun present(data: SightListData): SightListViewState =\r\n DisplaySightListViewState(\r\n sights = data.sightPreviews.toViewableSightPreviews(geoLocationService.currantLocation),\r\n hasMoreItems = data.hasMore,\r\n isNextPageLoading = false,\r\n )\r\n\r\n private fun List.toViewableSightPreviews(userCurrentLocation: Location) =\r\n map { sightPreview ->\r\n sightPreview.toViewableSightPreview(userCurrentLocation)\r\n }\r\n\r\n private fun SightPreview.toViewableSightPreview(userCurrentLocation: Location) =\r\n ViewableSightPreview(\r\n id = id,\r\n name = name,\r\n slug = slug,\r\n detailsUrl = detailsUrl,\r\n description = description,\r\n covers = covers.toViewables(),\r\n isAddedToRoute = routeRepository.currentRoute.value.contains(id),\r\n likesCount = likesCount.toString(),\r\n dislikesCount = dislikesCount.toString(),\r\n rating = rating.toString(),\r\n showOnMapUrl = mapsService.createShowOnMapUrl(location),\r\n routeUrl = mapsService.createRouteUrl(from = userCurrentLocation, to = location),\r\n callTaxiUrl = taxiService.createCallUrl(from = userCurrentLocation, to = location),\r\n )\r\n\r\n}","/*\r\n * Created by abond 22.09.2023, 08:33\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport ru.totalguide.app.navigation.Navigator\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\nclass SightListQuery(\r\n private val sightRepository: SightRepository,\r\n private val navigator: Navigator,\r\n) {\r\n\r\n suspend fun execute(pageNumber: Int, itemsPerPage: Int): Result {\r\n val page = sightRepository.getPage(pageNumber, itemsPerPage)\r\n\r\n return Result(page.items.toPreviews(), page.hasMoreItems)\r\n }\r\n\r\n private fun List.toPreviews(): List = map { sight -> sight.toPreview() }\r\n\r\n private fun Sight.toPreview(): SightPreview = SightPreview(\r\n id = id,\r\n name = name,\r\n slug = slug,\r\n detailsUrl = navigator.getSightDetailsUrl(slug),\r\n description = description,\r\n covers = covers,\r\n likesCount = rating.likesCount,\r\n dislikesCount = rating.dislikesCount,\r\n rating = rating.rating,\r\n location = location,\r\n )\r\n\r\n data class Result internal constructor(\r\n val sightPreviews: List,\r\n val hasMore: Boolean,\r\n )\r\n}",null,"package ru.totalguide.app.usecases.sightlist\r\n\r\nimport ru.totalguide.ui.ViewableImage\r\n\r\nsealed interface SightListViewState\r\n\r\ndata object EmptySightListViewState : SightListViewState\r\n\r\ndata object LoadSightListViewState : SightListViewState {\r\n const val message: String = \"Загрузка данных...\"\r\n}\r\n\r\ndata class DisplaySightListViewState internal constructor(\r\n val sights: List,\r\n val hasMoreItems: Boolean,\r\n val isNextPageLoading: Boolean,\r\n) : SightListViewState {\r\n\r\n data class ViewableSightPreview(\r\n val id: String,\r\n val name: String,\r\n val slug: String,\r\n val detailsUrl: String,\r\n val description: String,\r\n val covers: List,\r\n val isAddedToRoute: Boolean,\r\n val likesCount: String,\r\n val dislikesCount: String,\r\n val rating: String,\r\n val showOnMapUrl: String,\r\n val routeUrl: String,\r\n val callTaxiUrl: String,\r\n )\r\n}\r\n","package ru.totalguide.app.usecases.sightlist\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\n\r\ndata class SightPreview(\r\n val id: String,\r\n val name: String,\r\n val slug: String,\r\n val detailsUrl: String,\r\n val description: String,\r\n val covers: List,\r\n val likesCount: Long,\r\n val dislikesCount: Long,\r\n val rating: Long,\r\n val location: Location,\r\n)","/*\r\n * Created by abond 31.10.2023, 07:51\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport kotlinx.coroutines.flow.MutableStateFlow\r\nimport kotlinx.coroutines.flow.StateFlow\r\nimport kotlinx.coroutines.flow.asStateFlow\r\n\r\nclass SightsPager(\r\n private val query: SightListQuery,\r\n private val initialPage: Int = 1,\r\n private val itemsPerPage: Int = 10,\r\n private val history: History = IdleHistory(),\r\n) {\r\n private val currentPage: Int get() = nextPage - 1\r\n private var nextPage = initialPage\r\n private val _items = MutableStateFlow(SightListData(emptyList(), true))\r\n val items: StateFlow\r\n get() = _items.asStateFlow()\r\n private val _isLoading = MutableStateFlow(false)\r\n val isLoading = _isLoading.asStateFlow()\r\n\r\n suspend fun reload() {\r\n nextPage = initialPage\r\n _items.emit(SightListData(emptyList(), true))\r\n loadNextPage()\r\n }\r\n\r\n suspend fun loadNextPage() {\r\n val newPage = loadPage()\r\n if (newPage.sightPreviews.isNotEmpty()) updateQueryParams()\r\n emitNewState(newPage)\r\n }\r\n\r\n private suspend fun emitNewState(newPage: SightListQuery.Result) {\r\n _items.emit(\r\n SightListData(\r\n items.value.sightPreviews + newPage.sightPreviews,\r\n newPage.hasMore\r\n )\r\n )\r\n }\r\n\r\n private fun updateQueryParams() {\r\n history.setQueryParams(\r\n QueryParam(\"page\", currentPage.toString()),\r\n )\r\n }\r\n\r\n private suspend fun loadPage(): SightListQuery.Result {\r\n _isLoading.emit(true)\r\n val data = query.execute(nextPage++, itemsPerPage)\r\n _isLoading.emit(false)\r\n return data\r\n }\r\n}","/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app\r\n\r\nimport emotion.react.ThemeProvider\r\nimport react.FC\r\nimport ru.totalguide.app.navigation.appNavigationHost\r\nimport ru.totalguide.ui.globalStyles\r\nimport ru.totalguide.ui.lightTheme\r\n\r\nval App = FC(\"App\") {\r\n ThemeProvider {\r\n theme = { lightTheme() }\r\n globalStyles()\r\n appNavigationHost()\r\n }\r\n}",null,"/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.navigation\r\n\r\nimport js.core.jso\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.create\r\nimport react.router.NavigateFunction\r\nimport react.router.RouteObject\r\nimport react.router.RouterProvider\r\nimport react.router.dom.createBrowserRouter\r\nimport react.router.useParams\r\nimport remix.run.router.Params\r\nimport remix.run.router.redirectDocument\r\nimport ru.totalguide.app.usecases.sightdetails.sightDetailsView\r\nimport ru.totalguide.app.usecases.sightlist.SightListView\r\n\r\nfun ChildrenBuilder.appNavigationHost() = AppNavigationHost()\r\n\r\nprivate val AppNavigationHost = FC {\r\n RouterProvider { router = appRouter }\r\n}\r\n\r\nprivate const val PARAMS_PREFIX = \":\"\r\nprivate const val PARAM_SLUG = \"slug\"\r\nprivate const val PARAM_SLUG_WITH_PREFIX = \"$PARAMS_PREFIX$PARAM_SLUG\"\r\n\r\nprivate const val PATH_PLACE = \"/places\"\r\nprivate const val PATH_PLACE_VIEW = \"$PATH_PLACE/$PARAM_SLUG_WITH_PREFIX\"\r\nprivate const val PATH_ROOT = \"/\"\r\n\r\nprivate val appRouter = createBrowserRouter(\r\n arrayOf(\r\n route (\r\n path = PATH_ROOT,\r\n redirectTo = PATH_PLACE\r\n ),\r\n route(path = PATH_PLACE) {\r\n SightListView()\r\n },\r\n route(path = PATH_PLACE_VIEW) { params ->\r\n sightDetailsView(params.slug)\r\n },\r\n route (\r\n path = \"*\",\r\n redirectTo = \"/not-found\"\r\n ),\r\n )\r\n)\r\n\r\nprivate val Params.slug\r\n get() = get(PARAM_SLUG).orEmpty()\r\n\r\nprivate fun route(path: String, builder: ChildrenBuilder.(params: Params) -> Unit): RouteObject = jso {\r\n this.path = path\r\n element = FC {\r\n builder(useParams())\r\n }.create()\r\n}\r\n\r\nprivate fun route(path: String, redirectTo: String): RouteObject = jso {\r\n this.path = path\r\n loader = {\r\n val temporaryRedirect = 307\r\n redirectDocument(redirectTo, temporaryRedirect)\r\n }\r\n}\r\n\r\nclass AppNavigator(private val navigate: NavigateFunction): Navigator {\r\n override fun getSightDetailsUrl(slug: String): String =\r\n PATH_PLACE_VIEW.replace(PARAM_SLUG_WITH_PREFIX, slug)\r\n\r\n override fun navigateToSightDetails(sightSlug: String) {\r\n navigate(getSightDetailsUrl(sightSlug))\r\n }\r\n\r\n override fun navigateToRouteEditor() {\r\n TODO(\"Not yet implemented\")\r\n }\r\n}",null,null,"/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.div\r\nimport react.useCallback\r\nimport react.useEffect\r\nimport ru.totalguide.app.usecases.sightlist.DisplaySightListViewState.ViewableSightPreview\r\nimport ru.totalguide.app.usecases.sightlist.SightListEvent.*\r\nimport ru.totalguide.ui.*\r\nimport ru.totalguide.ui.layouts.column\r\nimport ru.totalguide.ui.layouts.commonScreenTemplate\r\nimport ru.totalguide.ui.layouts.row\r\nimport web.cssom.*\r\nimport web.cssom.Overflow.Companion.scroll\r\n\r\nval SightListView = FC(\"SightListView\") {\r\n val controller = useSightListController()\r\n val state = controller.collectViewState()\r\n val loadMoreCallback = useCallback(controller) { controller.handle(LoadNextPage) }\r\n val placeClickCallback = useCallback<(String) -> Unit>(controller) { placeSlug ->\r\n controller.handle(ShowSightDetails(sightSlug = placeSlug))\r\n }\r\n useEffect(controller) { controller.handle(RefreshViewState) }\r\n\r\n title(value = \"Выборг\")\r\n metaDescription(value = \"Достопримечательности Выборга\")\r\n\r\n infiniteScrollLayout(onLoadMore = loadMoreCallback) {\r\n commonScreenTemplate(\r\n topBar = { header() },\r\n content = { content(state = state, onPlaceClick = placeClickCallback) },\r\n footer = { footer() }\r\n )\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.content(\r\n state: SightListViewState,\r\n onPlaceClick: (String) -> Unit,\r\n) {\r\n when (state) {\r\n is EmptySightListViewState -> {}\r\n\r\n is LoadSightListViewState -> loading()\r\n\r\n is DisplaySightListViewState -> placesList(\r\n places = state.sights,\r\n isNextPageLoading = state.isNextPageLoading,\r\n onPlaceClick = onPlaceClick\r\n )\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.loading() {\r\n column(\r\n style = {\r\n height = 100.pct\r\n justifyContent = JustifyContent.center\r\n alignItems = AlignItems.center\r\n }\r\n ) {\r\n spinner(48.rem, 48.rem)\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.placesList(\r\n places: List,\r\n isNextPageLoading: Boolean,\r\n onPlaceClick: (String) -> Unit,\r\n) {\r\n div {\r\n css {\r\n display = Display.grid\r\n gap = 32.rem\r\n gridTemplateColumns = web.cssom.repeat(AutoRepeat.autoFit, minmax(328.rem, 1.fr))\r\n\r\n media(MediaQuery(\"screen and (max-width: 412px) and (orientation: portrait)\")) {\r\n gridTemplateColumns = 1.fr\r\n }\r\n }\r\n for (place in places) {\r\n placeCard(\r\n key = place.id,\r\n name = place.name,\r\n detailsUrl = place.detailsUrl,\r\n description = place.description,\r\n covers = place.covers,\r\n likesCount = place.likesCount,\r\n rating = place.rating,\r\n dislikesCount = place.dislikesCount,\r\n routeUrl = place.routeUrl,\r\n callTaxiUrl = place.callTaxiUrl,\r\n showOnMapUrl = place.showOnMapUrl,\r\n onClick = { onPlaceClick(place.slug) },\r\n )\r\n }\r\n }\r\n if (isNextPageLoading) {\r\n pageLoading()\r\n }\r\n yandexContentLoaded()\r\n}\r\n\r\nprivate fun ChildrenBuilder.pageLoading() {\r\n row(\r\n style = {\r\n justifyContent = JustifyContent.center\r\n paddingTop = 24.rem\r\n }\r\n ) {\r\n spinner()\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.infiniteScrollLayout(\r\n onLoadMore: () -> Unit,\r\n contentBuilder: ChildrenBuilder.() -> Unit,\r\n) {\r\n val scrollListener = useDistanceToPageBottomCallback(distanceToBottom = 1000) { onLoadMore() }\r\n\r\n div {\r\n css {\r\n overflowY = scroll\r\n height = 100.pct\r\n }\r\n onScroll = scrollListener\r\n\r\n contentBuilder()\r\n }\r\n}","/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nimport emotion.react.css\r\nimport kotlinx.browser.window\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.div\r\nimport react.useEffect\r\nimport ru.totalguide.app.usecases.sightdetails.DisplaySightDetailsViewState.ViewableSightDetails\r\nimport ru.totalguide.app.usecases.sightdetails.SightDetailsEvent.RefreshViewState\r\nimport ru.totalguide.ui.*\r\nimport ru.totalguide.ui.layouts.column\r\nimport ru.totalguide.ui.layouts.commonScreenTemplate\r\nimport ru.totalguide.ui.text.h1\r\nimport ru.totalguide.ui.text.p\r\nimport web.cssom.*\r\nimport web.cssom.Display.Companion.block\r\nimport web.cssom.LineStyle.Companion.solid\r\n\r\n\r\nfun ChildrenBuilder.sightDetailsView(slug: String) = SightDetailsViewComponent {\r\n this.slug = slug\r\n}\r\n\r\nprivate external interface SightDetailsViewComponentProps : Props {\r\n var slug: String\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val SightDetailsViewComponent =\r\n FC(\"SightDetailsView\") { props ->\r\n val theme = useTGTheme()\r\n val controller = useSightDetailsController(props.slug)\r\n val state = controller.collectViewState()\r\n useEffect(controller) {\r\n controller.handle(RefreshViewState)\r\n }\r\n\r\n commonScreenTemplate(\r\n topBar = { header() },\r\n content = content(state, theme),\r\n footer = { footer() }\r\n )\r\n }\r\n\r\nprivate fun content(\r\n state: SightDetailsViewState,\r\n theme: TGTheme,\r\n): ChildrenBuilder.() -> Unit = {\r\n when (state) {\r\n is DisplaySightDetailsViewState -> details(state.details, theme)\r\n is EmptySightDetailsViewState -> {}\r\n is LoadingSightDetailsViewState -> loading()\r\n is NotFoundViewState -> window.location.href = \"/not-found\"\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.details(\r\n details: ViewableSightDetails,\r\n theme: TGTheme,\r\n) {\r\n title(value = details.title)\r\n metaDescription(value = details.description)\r\n\r\n heading(details.title)\r\n\r\n div {\r\n css {\r\n marginLeft = (-16).rem\r\n marginRight = (-16).rem\r\n backgroundColor = Color(\"white\")\r\n borderBottom = Border(1.rem, solid, theme.colorScheme.primaryPale)\r\n marginBottom = 24.rem\r\n }\r\n\r\n covers(details.covers)\r\n\r\n placeActions(\r\n likesCount = details.likesCount,\r\n rating = details.rating,\r\n dislikesCount = details.dislikesCount,\r\n routeUrl = details.routeUrl,\r\n callTaxiUrl = details.callTaxiUrl,\r\n showOnMapUrl = details.showOnMapUrl,\r\n )\r\n }\r\n\r\n theses(details.theses)\r\n\r\n yandexContentLoaded()\r\n}\r\n\r\nprivate fun ChildrenBuilder.loading() {\r\n column(\r\n style = {\r\n height = 100.pct\r\n justifyContent = JustifyContent.center\r\n alignItems = AlignItems.center\r\n }\r\n ) {\r\n spinner(48.rem, 48.rem)\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.heading(text: String) {\r\n h1(\r\n text = text,\r\n style = style {\r\n display = block\r\n marginBottom = 16.rem\r\n }\r\n )\r\n}\r\n\r\nprivate fun ChildrenBuilder.theses(theses: List) {\r\n column {\r\n for (thesis in theses) {\r\n thesis(thesis)\r\n }\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.thesis(text: String) {\r\n val theme = useTGTheme()\r\n p(\r\n text = text,\r\n style = style {\r\n padding = Padding(16.rem, 0.rem)\r\n borderBottom = Border(1.rem, solid, theme.colorScheme.primaryPale)\r\n firstChild {\r\n paddingTop = 0.rem\r\n }\r\n lastChild {\r\n paddingBottom = 0.rem\r\n borderBottom = None.none\r\n }\r\n }\r\n )\r\n}\r\n\r\nprivate fun ChildrenBuilder.covers(\r\n covers: List,\r\n) {\r\n when (covers.size) {\r\n 0 -> placeholder()\r\n 1 -> image(\r\n src = covers[0].src,\r\n srcSet = covers[0].srcSet,\r\n )\r\n\r\n else -> slider(images = covers)\r\n }\r\n}",null,null,"/*\r\n * Created by abond 19.10.2023, 16:41\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.providers\r\n\r\nimport io.ktor.client.engine.js.*\r\nimport io.ktor.http.*\r\nimport kotlinx.browser.window\r\nimport ru.totalguide.core.network.ApiClient\r\nimport ru.totalguide.core.network.ktorApiClient\r\n\r\ninternal fun apiClient(): ApiClient = when(window.location.hostname) {\r\n \"totalguide.ru\" -> totalguideClient()\r\n \"dev.totalguide.ru\" -> devTotalguideClient()\r\n else -> localClient()\r\n}\r\n\r\n@Suppress(\"UNUSED\")\r\nprivate fun totalguideClient() = ktorApiClient(\r\n baseUrl = URLBuilder(protocol = URLProtocol.HTTPS, host = \"api.totalguide.ru\").build(),\r\n engine = Js.create()\r\n)\r\n\r\n@Suppress(\"UNUSED\")\r\nprivate fun devTotalguideClient() = ktorApiClient(\r\n baseUrl = URLBuilder(protocol = URLProtocol.HTTPS, host = \"devapi.totalguide.ru\").build(),\r\n engine = Js.create()\r\n)\r\n\r\nprivate fun localClient() = ktorApiClient(\r\n baseUrl = URLBuilder(host = \"localhost\", port = 8090).build(),\r\n engine = Js.create()\r\n)\r\n","/*\r\n * Created by abond 19.10.2023, 16:44\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.providers\r\n\r\nimport ru.totalguide.core.data.InMemorySightRepository\r\nimport ru.totalguide.core.data.content.sights\r\nimport ru.totalguide.core.network.RemoteSightRepository\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\ninternal fun sightRepository(): SightRepository = remoteSightRepository()\r\n\r\n@Suppress(\"unused\")\r\nprivate fun remoteSightRepository() = RemoteSightRepository(apiClient())\r\n\r\n@Suppress(\"unused\")\r\nprivate fun inMemorySightRepository() = InMemorySightRepository(sights = sights)","/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightdetails\r\n\r\nimport react.router.useNavigate\r\nimport react.useState\r\nimport ru.totalguide.app.navigation.AppNavigator\r\nimport ru.totalguide.app.providers.sightRepository\r\nimport ru.totalguide.core.client.Controller\r\nimport ru.totalguide.ui.useMainScope\r\n\r\nfun useSightDetailsController(sightSlug: String): Controller {\r\n val (controller, _) = useState(\r\n sightDetailsController(\r\n sightSlug = sightSlug,\r\n navigator = AppNavigator(navigate = useNavigate()),\r\n sightRepository = sightRepository(),\r\n scope = useMainScope(),\r\n )\r\n )\r\n return controller\r\n}",null,null,null,null,null,null,null,null,null,null,null,"/*\r\n * Created by abond 03.11.2023, 11:01\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport kotlinx.browser.window\r\nimport org.w3c.dom.url.URLSearchParams\r\n\r\nclass HistoryImpl() : History {\r\n private val history = window.history\r\n\r\n override fun setQueryParams(vararg params: QueryParam) {\r\n updateUrl(params.toURLSearchParams())\r\n }\r\n\r\n private fun updateUrl(searchParams: URLSearchParams) {\r\n history.replaceState(data = null, title = window.document.title, url = \"?$searchParams\")\r\n }\r\n\r\n private fun Array.toURLSearchParams() = URLSearchParams().apply {\r\n forEach { param -> set(param.name, param.value) }\r\n }\r\n}","/*\r\n * Created by abond 22.09.2023, 08:39\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.usecases.sightlist\r\n\r\nimport react.router.dom.useSearchParams\r\nimport react.router.useNavigate\r\nimport react.useState\r\nimport ru.totalguide.app.navigation.AppNavigator\r\nimport ru.totalguide.app.providers.sightRepository\r\nimport ru.totalguide.core.client.Controller\r\nimport ru.totalguide.ui.useMainScope\r\n\r\nfun useSightListController(): Controller {\r\n val (controller, _) = useState(\r\n sightListController(\r\n initialPage = usePageParam(),\r\n history = HistoryImpl(),\r\n sightRepository = sightRepository(),\r\n navigator = AppNavigator(\r\n navigate = useNavigate(),\r\n ),\r\n scope = useMainScope(),\r\n )\r\n )\r\n return controller\r\n}\r\n\r\nprivate fun usePageParam(): Int {\r\n val (params, _) = useSearchParams()\r\n return params[\"page\"]?.toIntOrNull() ?: 1\r\n}",null,null,null,null,null,null,null,"/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.services\r\n\r\nimport ru.totalguide.core.entities.Location\r\n\r\ninterface MapsService {\r\n fun createShowOnMapUrl(location: Location, zoom: Int = 16): String\r\n fun createRouteUrl(from: Location, to: Location): String\r\n}","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.app.web\r\n\r\nimport ru.totalguide.app.App\r\nimport ru.totalguide.ui.runApplication\r\nimport web.dom.document\r\n\r\nfun main() {\r\n document.runApplication(App)\r\n}","/*\r\n * Created by abond on 07.06.2023, 15:33\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 07.06.2023, 15:07\r\n */\r\n\r\npackage ru.totalguide.core.client\r\n\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.Deferred\r\nimport kotlinx.coroutines.async\r\nimport kotlinx.coroutines.flow.MutableStateFlow\r\nimport kotlinx.coroutines.flow.StateFlow\r\nimport kotlinx.coroutines.flow.asStateFlow\r\nimport kotlinx.coroutines.launch\r\n\r\nabstract class ControllerBase (\r\n private val scope: CoroutineScope\r\n) : Controller {\r\n private val _viewState by lazy { MutableStateFlow(createInitialViewState()) }\r\n override val viewState: StateFlow\r\n get() = _viewState.asStateFlow()\r\n\r\n protected suspend fun emitViewState(viewState: VS) {\r\n _viewState.emit(viewState)\r\n }\r\n\r\n protected abstract fun createInitialViewState(): VS\r\n\r\n protected fun async(block: suspend CoroutineScope.() -> T): Deferred =\r\n scope.async { block() }\r\n\r\n protected fun launch(block: suspend CoroutineScope.() -> Unit) {\r\n scope.launch { block() }\r\n }\r\n}",null,"/*\r\n * Created by abond 28.09.2023, 16:51\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport ru.totalguide.core.entities.Image\r\n\r\ndata class ViewableImage(\r\n val src: String,\r\n val srcSet: String,\r\n)\r\n\r\nfun Image.toViewable() = ViewableImage(\r\n variants.values.last(),\r\n variants.entries.joinToString(\r\n separator = \",\",\r\n transform = { \"${it.value} ${it.key}\" }\r\n )\r\n)\r\n\r\nfun List.toViewables() = map { it.toViewable() }\r\n","/*\r\n * Created by abond on 27.06.2023, 12:53\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 27.06.2023, 12:53\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport kotlinx.coroutines.launch\r\nimport react.useEffect\r\nimport react.useState\r\nimport ru.totalguide.core.client.Controller\r\n\r\nfun Controller.collectViewState(): VS {\r\n val scope = useMainScope()\r\n val (listVewState, setListVewState) = useState(viewState.value)\r\n\r\n useEffect(this) {\r\n\r\n val collectJob = scope.launch {\r\n viewState.collect { categoriesListVewState ->\r\n setListVewState(categoriesListVewState)\r\n }\r\n }\r\n\r\n cleanup {\r\n collectJob.cancel()\r\n }\r\n }\r\n\r\n return listVewState\r\n}","/*\r\n * Created by abond on 04.07.2023, 15:58\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 04.07.2023, 15:58\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport web.cssom.Color\r\nimport web.cssom.NamedColor\r\n\r\n/**\r\n * Содержит цвета используемые в [TGTheme].\r\n *\r\n * @property primary Основной цвет - наиболее часто используемый в приложении.\r\n * @property onPrimary Цвет текста, значков и другого содержимого, располагающегося поверх основного\r\n * цвета.\r\n * @property primaryLight Светлый вариант основного цвета.\r\n * @property onPrimaryLight Цвет текста, значков и другого содержимого, располагающегося поверх\r\n * светлого варианта основного цвета.\r\n * @property primaryDark Темный вариант основного цвета.\r\n * @property onPrimaryDark Цвет текста, значков и другого содержимого, располагающегося поверх темного\r\n * варианта основного цвета.\r\n * @property primaryPale Бледный вариант основного цвета.\r\n * @property onPrimaryPale Цвет текста, значков и другого содержимого, располагающегося поверх бледного\r\n * варианта основного цвета.\r\n * @property success Цвет успеха используется для обозначения успешного состояния компонентов. Например,\r\n * после успешного добавления достопримечательности в маршрут кнопка добавления/удаления из маршрута\r\n * меняет цвет с primary на success.\r\n * @property onSuccess Цвет текста, значков и другого содержимого, располагающегося поверх цвета успеха.\r\n * @property successLight Светлый вариант цвета успеха.\r\n * @property onSuccessLight Цвет текста, значков и другого содержимого, располагающегося поверх светлого\r\n * варианта цвета успеха.\r\n * @property successDark Темный вариант цвета успеха.\r\n * @property onSuccessDark Цвет текста, значков и другого содержимого, располагающегося поверх темного\r\n * варианта цвета успеха.\r\n * @property successPale Бледный вариант цвета успеха.\r\n * @property onSuccessPale Цвет текста, значков и другого содержимого, располагающегося поверх бледного\r\n * варианта цвета успеха.\r\n * @property error Цвет ошибки используется для обозначения ошибок в компонентах. Например,\r\n * неправильный текст в текстовом поле.\r\n * @property onError Цвет текста, значков и другого содержимого, располагающегося поверх цвета ошибки.\r\n * @property errorLight Светлый вариант цвета ошибки.\r\n * @property onErrorLight Цвет текста, значков и другого содержимого, располагающегося поверх светлого\r\n * варианта цвета ошибки.\r\n * @property errorDark Темный вариант цвета ошибки.\r\n * @property onErrorDark Цвет текста, значков и другого содержимого, располагающегося поверх темного\r\n * варианта цвета ошибки.\r\n * @property errorPale Бледный вариант цвета ошибки.\r\n * @property onErrorPale Цвет текста, значков и другого содержимого, располагающегося поверх бледного\r\n * варианта цвета ошибки.\r\n * @property background Цвет основного фона.\r\n * @property onBackground Цвет текста, значков и другого содержимого, располагающегося поверх цвета\r\n * основного фона.\r\n * @property textBasic Цвет основного текста.\r\n * @property textHeading Цвет заголовков.\r\n * @property textMuted Цвет бледного текста.\r\n */\r\ndata class ColorScheme(\r\n val primary: Color,\r\n val onPrimary: Color,\r\n val primaryLight: Color,\r\n val onPrimaryLight: Color,\r\n val primaryDark: Color,\r\n val onPrimaryDark: Color,\r\n val primaryPale: Color,\r\n val onPrimaryPale: Color,\r\n val success: Color,\r\n val onSuccess: Color,\r\n val successLight: Color,\r\n val onSuccessLight: Color,\r\n val successDark: Color,\r\n val onSuccessDark: Color,\r\n val successPale: Color,\r\n val onSuccessPale: Color,\r\n val white: Color,\r\n val onWhite: Color,\r\n val whiteLight: Color,\r\n val onWhiteLight: Color,\r\n val whiteDark: Color,\r\n val onWhiteDark: Color,\r\n val whitePale: Color,\r\n val onWhitePale: Color,\r\n val error: Color,\r\n val onError: Color,\r\n val errorLight: Color,\r\n val onErrorLight: Color,\r\n val errorDark: Color,\r\n val onErrorDark: Color,\r\n val errorPale: Color,\r\n val onErrorPale: Color,\r\n val background: Color,\r\n val onBackground: Color,\r\n val textBasic: Color,\r\n val textHeading: Color,\r\n val textMuted: Color,\r\n)\r\n\r\ninternal fun lightColorScheme() = ColorScheme(\r\n primary = Primitives.blue.medium,\r\n onPrimary = NamedColor.white,\r\n primaryLight = Primitives.blue.light,\r\n onPrimaryLight = NamedColor.white,\r\n primaryDark = Primitives.blue.dark,\r\n onPrimaryDark = NamedColor.white,\r\n primaryPale = Primitives.blue.pale,\r\n onPrimaryPale = NamedColor.white,\r\n success = Primitives.green.medium,\r\n onSuccess = NamedColor.white,\r\n successLight = Primitives.green.light,\r\n onSuccessLight = NamedColor.white,\r\n successDark = Primitives.green.dark,\r\n onSuccessDark = NamedColor.white,\r\n successPale = Primitives.green.pale,\r\n onSuccessPale = NamedColor.white,\r\n white = Primitives.grey.medium,\r\n onWhite = Primitives.text.dark,\r\n whiteLight = Primitives.grey.light,\r\n onWhiteLight = Primitives.text.dark,\r\n whiteDark = Primitives.grey.dark,\r\n onWhiteDark = Primitives.text.dark,\r\n whitePale = NamedColor.white,\r\n onWhitePale = Primitives.grey.pale,\r\n error = Primitives.red.medium,\r\n onError = NamedColor.white,\r\n errorLight = Primitives.red.light,\r\n onErrorLight = NamedColor.white,\r\n errorDark = Primitives.red.dark,\r\n onErrorDark = NamedColor.white,\r\n errorPale = Primitives.red.pale,\r\n onErrorPale = NamedColor.white,\r\n background = NamedColor.white,\r\n onBackground = Color(\"#1C1B1F\"),\r\n textBasic = Primitives.text.light,\r\n textHeading = Primitives.text.medium,\r\n textMuted = Primitives.text.pale,\r\n)\r\n\r\nprivate object Primitives {\r\n val blue = hues(\r\n dark = Color(\"#0066FF\"),\r\n light = Color(\"#00AAFF\"),\r\n medium = Color(\"#0088FF\"),\r\n pale = Color(\"#D1D9E0\"),\r\n )\r\n\r\n val green = hues(\r\n dark = Color(\"#11BB00\"),\r\n light = Color(\"#55EE00\"),\r\n medium = Color(\"#33CC00\"),\r\n pale = Color(\"#D5E0D1\"),\r\n )\r\n\r\n val grey = hues(\r\n dark = Color(\"#DDDDDD\"),\r\n light = Color(\"#EEEEEE\"),\r\n medium = Color(\"#FFFFFF\"),\r\n pale = Color(\"#DDDDD\"),\r\n )\r\n\r\n val red = hues(\r\n dark = Color(\"#BB0000\"),\r\n light = Color(\"#FF0000\"),\r\n medium = Color(\"#DD0000\"),\r\n pale = Color(\"#DCCBCB\"),\r\n )\r\n\r\n val text = hues(\r\n dark = Color(\"#222233\"),\r\n light = Color(\"#555555\"),\r\n medium = Color(\"#222222\"),\r\n pale = Color(\"#888888\"),\r\n )\r\n}\r\n\r\n/**Набор оттенков основных цветов. */\r\ninterface Hues {\r\n val dark: Color\r\n val light: Color\r\n val medium: Color\r\n val pale: Color\r\n}\r\n\r\nprivate class HuesInstance(\r\n override val dark: Color,\r\n override val light: Color,\r\n override val medium: Color,\r\n override val pale: Color,\r\n) : Hues\r\n\r\nprivate fun hues(dark: Color, light: Color, medium: Color, pale: Color): Hues =\r\n HuesInstance(dark = dark, light = light, medium = medium, pale = pale)\r\n\r\n\r\n// TODO: Добавить проверки на правильность формата текущего цвета и входного параметра и тесты.\r\n/**\r\n * Добавляет прозрачность к текущему непрозрачному цвету.\r\n *\r\n * @param hexAlpha Значение прозрачности в процентах переведенное в систему HEX.\r\n * @return Возвращает копию текущего цвета в формате #RRGGBB с добавленным компонентом прозрачности\r\n * #RRGGBBAA.\r\n */\r\nfun Color.alpha(hexAlpha: String) = Color(\"$this$hexAlpha\")","/*\r\n * Created by abond 30.10.2023, 13:32\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nclass DistanceToPageBottomWatcher(\r\n private val distanceToBottom: Int,\r\n private val callback: () -> Unit\r\n) {\r\n private var lastDistanceToBottom = Int.MAX_VALUE\r\n\r\n fun onScroll(event: ScrollEvent) {\r\n if (wasLineCrossed(event)) {\r\n callback()\r\n }\r\n lastDistanceToBottom = event.distanceToBottom\r\n }\r\n\r\n /**\r\n * Событие должно срабатывать только при пересечении границы расстояния до конца страницы.\r\n */\r\n private fun wasLineCrossed(event: ScrollEvent) =\r\n distanceToBottom in event.distanceToBottom until lastDistanceToBottom\r\n}\r\n\r\ndata class ScrollEvent(\r\n private val clientHeight: Int,\r\n private val scrollHeight: Int,\r\n private val scrollTop: Int,\r\n) {\r\n val distanceToBottom = scrollHeight - clientHeight - scrollTop\r\n}","/*\r\n * Created by abond on 12.08.2023, 13:40\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 12.08.2023, 13:40\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.FC\r\nimport react.Props\r\nimport react.create\r\nimport react.dom.client.Root\r\nimport react.dom.client.createRoot\r\nimport web.dom.Document\r\n\r\nprivate class ReactApplication(\r\n private val root: Root,\r\n private val rootComponent: FC

\r\n) {\r\n fun run() {\r\n root.render(rootComponent.create())\r\n }\r\n}\r\n\r\nfun Document.runApplication(rootComponent: FC

) {\r\n ReactApplication(createRoot(), rootComponent).run()\r\n}\r\n\r\nprivate inline fun Document.createRoot(): Root = createRoot(prepareRootElement())\r\n\r\nprivate inline fun Document.prepareRootElement() = createRootElement().also { rootElement ->\r\n body.appendChild(rootElement)\r\n}\r\n\r\nprivate inline fun Document.createRootElement() = createElement(ROOT_ELEMENT_TAG_NAME).apply {\r\n style.height = ROOT_ELEMENT_HEIGHT\r\n}\r\n\r\nprivate const val ROOT_ELEMENT_HEIGHT = \"100%\"\r\nprivate const val ROOT_ELEMENT_TAG_NAME = \"div\"","/*\r\n * Created by abond on 21.07.2023, 14:57\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 17.07.2023, 16:41\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.Theme\r\nimport emotion.react.useTheme\r\n\r\n/** Содержит значения схемы цветов [colorScheme] и стилей текста [typography]. */\r\ninterface TGTheme : Theme {\r\n val colorScheme: ColorScheme\r\n val typography: Typography\r\n}\r\n\r\nfun useTGTheme(): TGTheme = useTheme() as TGTheme\r\n\r\nfun lightTheme(): TGTheme = LightTheme\r\n\r\n/** Светлая тема. */\r\nprivate object LightTheme : TGTheme {\r\n override val colorScheme: ColorScheme = lightColorScheme()\r\n override val typography = defaultTypography(colorScheme)\r\n}","/*\r\n * Created by abond on 21.07.2023, 15:07\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 21.07.2023, 15:07\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport ru.totalguide.sevices.devicePlatformService\r\nimport web.cssom.Color\r\nimport web.cssom.FontSize\r\nimport web.cssom.FontStyle\r\nimport web.cssom.FontWeight\r\nimport web.cssom.LineHeight\r\nimport web.cssom.None\r\nimport web.cssom.TextTransform\r\nimport web.cssom.rem\r\nimport web.cssom.string\r\n\r\n/**\r\n * Содержит описание основных стилей текста используемых на сайте.\r\n *\r\n * @property buttonText Стиль текста кнопки.\r\n * @property heading1 Стиль самого крупного заголовка.\r\n * @property heading2 Стиль второго по размеру заголовка.\r\n * @property heading3 Стиль третьего по размеру заголовка.\r\n * @property heading4 Стиль четвертого по размеру заголовка.\r\n * @property heading5 Стиль пятого по размеру заголовка.\r\n * @property heading6 Стиль самого мелкого заголовка.\r\n * @property hero Огромный заголовок.\r\n * @property hint Стиль текста подсказки.\r\n * @property paragraph Стиль основного текста.\r\n * @property supheading Стиль текста надзаголовка.\r\n */\r\nclass Typography(\r\n val buttonText: TextStyle,\r\n val heading1: TextStyle,\r\n val heading2: TextStyle,\r\n val heading3: TextStyle,\r\n val heading4: TextStyle,\r\n val heading5: TextStyle,\r\n val heading6: TextStyle,\r\n val hero: TextStyle,\r\n val hint: TextStyle,\r\n val paragraph: TextStyle,\r\n val supheading: TextStyle,\r\n)\r\n\r\ninternal fun defaultTypography(colorScheme: ColorScheme) = mobileTypography(colorScheme)\r\n// if (devicePlatformService.isMobile()) mobileTypography(colorScheme)\r\n// else desktopTypography(colorScheme)\r\n\r\nprivate fun desktopTypography(colorScheme: ColorScheme) = Typography(\r\n buttonText = buttonTextStyle,\r\n heading1 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading1FontSize,\r\n fontWeight = heading1FontWeight,\r\n lineHeight = heading1LineHeight,\r\n ),\r\n heading2 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading2FontSize,\r\n fontWeight = heading2FontWeight,\r\n lineHeight = heading2LineHeight,\r\n ),\r\n heading3 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading3FontSize,\r\n fontWeight = heading3FontWeight,\r\n lineHeight = heading3LineHeight,\r\n ),\r\n heading4 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading4FontSize,\r\n fontWeight = heading4FontWeight,\r\n lineHeight = heading4LineHeight,\r\n ),\r\n heading5 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading5FontSize,\r\n fontWeight = heading5FontWeight,\r\n lineHeight = heading5LineHeight,\r\n ),\r\n heading6 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading6FontSize,\r\n fontWeight = heading6FontWeight,\r\n lineHeight = heading6LineHeight,\r\n ),\r\n hero = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heroFontSize,\r\n fontWeight = heroFontWeight,\r\n lineHeight = heroLineHeight,\r\n ),\r\n hint = hintStyle(color = colorScheme.textMuted),\r\n paragraph = paragraphStyle(color = colorScheme.textBasic),\r\n supheading = supheadingStyle(color = colorScheme.textMuted),\r\n)\r\n\r\nprivate fun mobileTypography(colorScheme: ColorScheme) = Typography(\r\n buttonText = buttonTextStyle,\r\n heading1 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeading1FontSize,\r\n fontWeight = heading1FontWeight,\r\n lineHeight = mobileHeading1LineHeight,\r\n ),\r\n heading2 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeading2FontSize,\r\n fontWeight = heading2FontWeight,\r\n lineHeight = mobileHeading2LineHeight,\r\n ),\r\n heading3 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeading3FontSize,\r\n fontWeight = heading3FontWeight,\r\n lineHeight = mobileHeading3LineHeight,\r\n ),\r\n heading4 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeading4FontSize,\r\n fontWeight = heading4FontWeight,\r\n lineHeight = mobileHeading4LineHeight,\r\n ),\r\n heading5 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeading5FontSize,\r\n fontWeight = heading5FontWeight,\r\n lineHeight = mobileHeading5LineHeight,\r\n ),\r\n heading6 = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = heading6FontSize,\r\n fontWeight = heading6FontWeight,\r\n lineHeight = heading6LineHeight,\r\n ),\r\n hero = headingStyle(\r\n color = colorScheme.textHeading,\r\n fontSize = mobileHeroFontSize,\r\n fontWeight = heroFontWeight,\r\n lineHeight = mobileHeroLineHeight,\r\n ),\r\n hint = hintStyle(color = colorScheme.textMuted),\r\n paragraph = paragraphStyle(color = colorScheme.textBasic),\r\n supheading = supheadingStyle(color = colorScheme.textMuted),\r\n)\r\n\r\nprivate val defaultFontFamily = string(\"Golos Text\")\r\nprivate val currentColor = Color(\"currentColor\")\r\nprivate val fontWeight400 = \"400\".unsafeCast()\r\nprivate val fontWeight500 = \"500\".unsafeCast()\r\nprivate val fontWeight700 = \"700\".unsafeCast()\r\n\r\nprivate val buttonTextColor = currentColor\r\nprivate val buttonTextFontFamily = defaultFontFamily\r\nprivate val buttonTextFontSize = 16.rem\r\nprivate val buttonTextFontStyle = FontStyle.normal\r\nprivate val buttonTextFontWeight = fontWeight700\r\nprivate val buttonTextLineHeight = 24.rem\r\nprivate val buttonTextTextTransform = None.none\r\n\r\nprivate val heading1FontSize = 48.rem\r\nprivate val heading1FontWeight = fontWeight700\r\nprivate val heading1LineHeight = 56.rem\r\nprivate val mobileHeading1FontSize = 24.rem\r\nprivate val mobileHeading1LineHeight = 32.rem\r\n\r\nprivate val heading2FontSize = 40.rem\r\nprivate val heading2FontWeight = fontWeight700\r\nprivate val heading2LineHeight = 48.rem\r\nprivate val mobileHeading2FontSize = 20.rem\r\nprivate val mobileHeading2LineHeight = 24.rem\r\n\r\nprivate val heading3FontSize = 32.rem\r\nprivate val heading3FontWeight = fontWeight700\r\nprivate val heading3LineHeight = 40.rem\r\nprivate val mobileHeading3FontSize = 16.rem\r\nprivate val mobileHeading3LineHeight = 24.rem\r\n\r\nprivate val heading4FontSize = 32.rem\r\nprivate val heading4FontWeight = fontWeight500\r\nprivate val heading4LineHeight = 40.rem\r\nprivate val mobileHeading4FontSize = 24.rem\r\nprivate val mobileHeading4LineHeight = 32.rem\r\n\r\nprivate val heading5FontSize = 24.rem\r\nprivate val heading5FontWeight = fontWeight500\r\nprivate val heading5LineHeight = 32.rem\r\nprivate val mobileHeading5FontSize = 20.rem\r\nprivate val mobileHeading5LineHeight = 24.rem\r\n\r\nprivate val heading6FontSize = 16.rem\r\nprivate val heading6FontWeight = fontWeight500\r\nprivate val heading6LineHeight = 24.rem\r\n\r\nprivate val heroFontSize = 64.rem\r\nprivate val heroFontWeight = fontWeight700\r\nprivate val heroLineHeight = 72.rem\r\nprivate val mobileHeroFontSize = 32.rem\r\nprivate val mobileHeroLineHeight = 40.rem\r\n\r\nprivate val hintFontFamily = defaultFontFamily\r\nprivate val hintFontSize = 12.rem\r\nprivate val hintFontStyle = FontStyle.normal\r\nprivate val hintFontWeight = fontWeight400\r\nprivate val hintLineHeight = 16.rem\r\nprivate val hintTextTransform = None.none\r\n\r\nprivate val paragraphFontFamily = defaultFontFamily\r\nprivate val paragraphFontSize = 16.rem\r\nprivate val paragraphFontStyle = FontStyle.normal\r\nprivate val paragraphFontWeight = fontWeight400\r\nprivate val paragraphLineHeight = 24.rem\r\nprivate val paragraphTextTransform = None.none\r\n\r\nprivate val supheadingFontFamily = defaultFontFamily\r\nprivate val supheadingFontSize = 12.rem\r\nprivate val supheadingFontStyle = FontStyle.normal\r\nprivate val supheadingFontWeight = fontWeight400\r\nprivate val supheadingLineHeight = 16.rem\r\nprivate val supheadingTextTransform = TextTransform.uppercase\r\n\r\nprivate val buttonTextStyle = TextStyle(\r\n color = buttonTextColor,\r\n fontFamily = buttonTextFontFamily,\r\n fontSize = buttonTextFontSize,\r\n fontStyle = buttonTextFontStyle,\r\n fontWeight = buttonTextFontWeight,\r\n lineHeight = buttonTextLineHeight,\r\n textTransform = buttonTextTextTransform,\r\n)\r\n\r\nprivate fun headingStyle(\r\n color: Color,\r\n fontSize: FontSize,\r\n fontWeight: FontWeight,\r\n lineHeight: LineHeight\r\n) = TextStyle(\r\n color = color,\r\n fontFamily = defaultFontFamily,\r\n fontSize = fontSize,\r\n fontStyle = FontStyle.normal,\r\n fontWeight = fontWeight,\r\n lineHeight = lineHeight,\r\n textTransform = None.none,\r\n)\r\n\r\nprivate fun hintStyle(color: Color) = TextStyle(\r\n color = color,\r\n fontFamily = hintFontFamily,\r\n fontSize = hintFontSize,\r\n fontStyle = hintFontStyle,\r\n fontWeight = hintFontWeight,\r\n lineHeight = hintLineHeight,\r\n textTransform = hintTextTransform,\r\n)\r\n\r\nprivate fun paragraphStyle(color: Color) = TextStyle(\r\n color = color,\r\n fontFamily = paragraphFontFamily,\r\n fontSize = paragraphFontSize,\r\n fontStyle = paragraphFontStyle,\r\n fontWeight = paragraphFontWeight,\r\n lineHeight = paragraphLineHeight,\r\n textTransform = paragraphTextTransform,\r\n)\r\n\r\nprivate fun supheadingStyle(color: Color) = TextStyle(\r\n color = color,\r\n fontFamily = supheadingFontFamily,\r\n fontSize = supheadingFontSize,\r\n fontStyle = supheadingFontStyle,\r\n fontWeight = supheadingFontWeight,\r\n lineHeight = supheadingLineHeight,\r\n textTransform = supheadingTextTransform,\r\n)",null,"/*\r\n * Created by abond on 21.07.2023, 13:03\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 21.07.2023, 13:03\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport csstype.PropertiesBuilder\r\nimport web.cssom.Color\r\nimport web.cssom.FontFamily\r\nimport web.cssom.FontSize\r\nimport web.cssom.FontStyle\r\nimport web.cssom.FontWeight\r\nimport web.cssom.LineHeight\r\nimport web.cssom.TextTransform\r\n\r\n/**\r\n * Стиль текста.\r\n *\r\n * @property color Цвет текста.\r\n * @property fontFamily Семейство шрифтов, которое будет использоваться при отображении текста.\r\n * @property fontSize Размер глифов, используемых при рисовании текста.\r\n * @property fontStyle Вариант шрифта, используемый при рисовании букв (например, курсив).\r\n * @property fontWeight Толщина шрифта, используемого при рисовании текста (например, полужирный).\r\n * @property lineHeight Высота строки для абзаца.\r\n * @property textTransform Преобразование регистра текста.\r\n */\r\ndata class TextStyle(\r\n val color: Color,\r\n val fontFamily: FontFamily,\r\n val fontSize: FontSize,\r\n val fontStyle: FontStyle,\r\n val fontWeight: FontWeight,\r\n val lineHeight: LineHeight,\r\n val textTransform: TextTransform,\r\n)\r\n\r\nfun PropertiesBuilder.applyTextStyle(style: TextStyle) {\r\n color = style.color\r\n fontFamily = style.fontFamily\r\n fontSize = style.fontSize\r\n fontStyle = style.fontStyle\r\n fontWeight = style.fontWeight\r\n lineHeight = style.lineHeight\r\n textTransform = style.textTransform\r\n}\r\n",null,null,null,"/*\r\n * Created by abond on 27.06.2023, 10:35\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 27.06.2023, 10:35\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport kotlinx.coroutines.CoroutineScope\r\nimport kotlinx.coroutines.MainScope\r\nimport react.useState\r\n\r\nprivate val scope = MainScope()\r\n\r\nfun useMainScope(): CoroutineScope {\r\n val (mainScope, _) = useState(scope)\r\n return mainScope\r\n}","/*\r\n * Created by abond 15.11.2023, 16:29\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.div\r\nimport web.cssom.None.Companion.none\r\n\r\nfun ChildrenBuilder.yandexContentLoaded() = YandexContentLoadedComponent()\r\n\r\nprivate val YandexContentLoadedComponent = FC(\"YandexContentLoaded\") {\r\n div {\r\n className = contentLoadedStyle\r\n id = \"content_loaded\"\r\n }\r\n}\r\n\r\nprivate val contentLoadedStyle = style {\r\n display = none\r\n}","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.div\r\nimport react.dom.html.ReactHTML.footer\r\nimport react.dom.html.ReactHTML.span\r\nimport ru.totalguide.ApplicationProperties\r\nimport ru.totalguide.ui.icons.Icons\r\nimport ru.totalguide.ui.icons.Studio2iLogo\r\nimport ru.totalguide.ui.layouts.row\r\nimport ru.totalguide.ui.text.p\r\nimport ru.totalguide.ui.text.text\r\nimport web.cssom.*\r\nimport web.cssom.JustifyContent.Companion.flexEnd\r\nimport web.cssom.JustifyContent.Companion.flexStart\r\nimport web.cssom.LineStyle.Companion.solid\r\nimport web.window.WindowTarget.Companion._blank\r\n\r\nfun ChildrenBuilder.footer() = FooterComponent()\r\n\r\nprivate val FooterComponent = FC(\"Footer\") {\r\n val theme = useTGTheme()\r\n val style = useStyle {\r\n backgroundColor = Color(\"#ffffff\") // TODO: добавить цвет в тему\r\n padding = Padding(24.rem, 16.rem)\r\n borderTop = Border(1.rem, solid, theme.colorScheme.whiteDark)\r\n display = Display.grid\r\n gridTemplateColumns = 1.fr\r\n gap = 16.rem\r\n }\r\n\r\n footer {\r\n className = style\r\n\r\n text()\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.text() {\r\n div {\r\n className = textBlockStyle\r\n\r\n project()\r\n devs()\r\n }\r\n}\r\n\r\nprivate val textBlockStyle = style {\r\n display = Display.grid\r\n gridTemplateColumns = repeat(2, 1.fr)\r\n gap = 8.rem\r\n\r\n media(screen and maxWidth414 and orientationPortrait) {\r\n rowGap = 16.rem\r\n gridTemplateColumns = 1.fr\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.project() {\r\n div {\r\n copyright()\r\n// about()\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.devs() {\r\n div {\r\n autograph()\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.copyright() {\r\n p(text = \"© 2019–2023 ТоталГид (v${ApplicationProperties.PROJECT_VERSION})\")\r\n}\r\n\r\n@Suppress(\"unused\")\r\nprivate inline fun ChildrenBuilder.about() {\r\n textLink(\"/\", \"О проекте\")\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.autograph() {\r\n row(autographContainerStyle) {\r\n autographLogo()\r\n autographSignature()\r\n }\r\n}\r\n\r\nprivate val autographContainerStyle = style {\r\n justifyContent = flexEnd\r\n gap = 8.rem\r\n\r\n media(screen and maxWidth414 and orientationPortrait) {\r\n justifyContent = flexStart\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.autographLogo() {\r\n Icons.Special.Studio2iLogo()\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.autographSignature() {\r\n span {\r\n text(\"Проект «\")\r\n textLink(\r\n href = \"https://studio2i.ru\",\r\n text = \"2И\",\r\n target = _blank\r\n )\r\n text(\"»\")\r\n }\r\n}","/*\r\n * Created by abond 04.12.2023, 13:06\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui.icons\r\n\r\nimport react.FC\r\nimport react.dom.svg.FillRule\r\nimport react.dom.svg.ReactSVG.path\r\nimport react.dom.svg.ReactSVG.svg\r\nimport ru.totalguide.ui.style\r\nimport web.cssom.rem\r\n\r\n@Suppress(\"UnusedReceiverParameter\")\r\nval Icons.Special.Studio2iLogo\r\n get() = studio2iLogo\r\n\r\nprivate val studio2iLogo = FC(\"Studio2iLogo\") {\r\n svg {\r\n className = logoStyle\r\n xmlns = \"http://www.w3.org/2000/svg\"\r\n viewBox = \"0 0 $WIDTH $HEIGHT\"\r\n\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M12.0948 5.38934H11.5923C11.3965 5.38934 11.2153 5.49176 11.1141 5.65944L9.15447 8.91245V5.6669C9.15447 5.51365 9.03041 5.38934 8.87707 5.38934H8.34014C8.18675 5.38934 8.06225 5.5137 8.06225 5.6669V10.4062C8.06225 10.5594 8.1867 10.6832 8.34014 10.6832H8.83971C9.03494 10.6832 9.21612 10.5813 9.31727 10.4136L11.277 7.16754V10.4062C11.277 10.5594 11.4015 10.6832 11.5549 10.6832H12.0948C12.2482 10.6832 12.3727 10.5594 12.3727 10.4062V5.6669C12.3727 5.51365 12.2481 5.38934 12.0948 5.38934ZM7.06176 9.83619H5.06264L6.26791 8.56725C6.5976 8.20608 6.83063 7.88983 6.96664 7.61824C7.10255 7.3466 7.17078 7.08009 7.17078 6.81845C7.17078 6.34084 7.01938 5.97136 6.71763 5.70973C6.41532 5.44754 5.99101 5.31677 5.44517 5.31677C5.08804 5.31672 4.76935 5.39283 4.48747 5.54404C4.20603 5.6957 3.98844 5.90466 3.83401 6.17127C3.7349 6.34338 3.66722 6.52687 3.63186 6.7224C3.60098 6.89501 3.73146 7.05472 3.90776 7.05472L4.40275 7.05467C4.53926 7.05467 4.65425 6.95569 4.67866 6.82139C4.70804 6.65973 4.7698 6.52245 4.86447 6.40953C5.00143 6.24589 5.18913 6.16381 5.42674 6.16381C5.64782 6.16376 5.81769 6.23151 5.93667 6.36571C6.05525 6.50001 6.11496 6.6851 6.11496 6.92042C6.11496 7.09253 6.05869 7.27403 5.94569 7.46558C5.83258 7.65699 5.65877 7.88132 5.42326 8.13798L3.9361 9.72119C3.78973 9.87693 3.70855 10.0824 3.70855 10.2958V10.4037C3.70855 10.5579 3.83401 10.6832 3.98894 10.6832H7.06176C7.21615 10.6832 7.3416 10.5579 7.3416 10.4037V10.1162C7.3416 9.96149 7.21615 9.83619 7.06176 9.83619Z\"\r\n fill = COLOR_GREY\r\n }\r\n\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M2.71185 14.9102C1.81462 14.9102 1.08727 14.183 1.08727 13.2859C1.08727 12.3888 1.81462 11.6615 2.71185 11.6615C3.60908 11.6615 4.33642 12.3888 4.33642 13.2859C4.33642 14.183 3.60908 14.9102 2.71185 14.9102ZM10.9389 0.561825C11.1478 0.629798 11.2284 0.723143 11.013 0.962464L10.6919 1.28396C10.538 1.43793 10.3808 1.42899 10.16 1.3414C8.56415 0.823191 6.77788 0.873538 5.12719 1.61623C1.83438 3.09778 0.246203 6.81013 1.34356 10.1658C1.43135 10.3865 1.45166 10.5268 1.29782 10.6808L0.97663 11.0023C0.737524 11.2179 0.632844 11.1542 0.564663 10.9454C-1.00534 6.99364 0.800491 2.46849 4.71755 0.706063C6.76785 -0.216413 9.00095 -0.203653 10.9389 0.561825ZM5.06109 15.4382C4.85218 15.3702 4.77158 15.2768 4.98695 15.0375L5.30814 14.716C5.46203 14.562 5.61915 14.571 5.83998 14.6586C7.43586 15.1768 9.22212 15.1265 10.8728 14.3838C14.1656 12.9022 15.7538 9.18988 14.6565 5.83422C14.5687 5.61352 14.5483 5.47321 14.7022 5.31919L15.0234 4.9977C15.2625 4.78211 15.3672 4.84581 15.4353 5.05465C17.0053 9.00636 15.1995 13.5315 11.2824 15.2939C9.2322 16.2164 6.99906 16.2037 5.06109 15.4382ZM13.2876 4.33594C12.3903 4.33594 11.663 3.60869 11.663 2.71159C11.663 1.81448 12.3903 1.08724 13.2876 1.08724C14.1848 1.08724 14.9121 1.81448 14.9121 2.71159C14.9121 3.60869 14.1848 4.33594 13.2876 4.33594ZM13.2876 3.33223C12.9448 3.33223 12.6668 3.05438 12.6668 2.71159C12.6668 2.36884 12.9448 2.09094 13.2876 2.09094C13.6304 2.09094 13.9083 2.36884 13.9083 2.71159C13.9083 3.05438 13.6304 3.33223 13.2876 3.33223ZM2.71185 13.9065C2.369 13.9065 2.09112 13.6286 2.09112 13.2859C2.09112 12.9431 2.369 12.6652 2.71185 12.6652C3.05464 12.6652 3.33258 12.9431 3.33258 13.2859C3.33258 13.6286 3.05464 13.9065 2.71185 13.9065Z\"\r\n fill = COLOR_GREY\r\n }\r\n }\r\n}\r\n\r\nprivate const val COLOR_GREY = \"#555555\"\r\nprivate const val HEIGHT = 16\r\nprivate const val WIDTH = 16\r\n\r\nprivate val logoStyle = style {\r\n width = WIDTH.rem\r\n height = HEIGHT.rem\r\n}","/*\r\n * Created by abond 16.11.2023, 16:09\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.PropsWithClassName\r\nimport react.dom.html.ReactHTML.a\r\nimport web.cssom.None.Companion.none\r\nimport web.window.WindowTarget\r\n\r\nfun ChildrenBuilder.textLink(\r\n href: String,\r\n text: String,\r\n target: WindowTarget? = null\r\n) = TextLinkComponent {\r\n this.href = href\r\n this.text = text\r\n this.target = target\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val TextLinkComponent = FC(\"TextLink\") { props ->\r\n val theme = useTGTheme()\r\n val style = useStyle(props.className) {\r\n applyTextStyle(theme.typography.paragraph)\r\n textDecoration = none\r\n\r\n color = theme.colorScheme.primary\r\n visited {\r\n color = theme.colorScheme.primary\r\n }\r\n hover {\r\n color = theme.colorScheme.primaryDark\r\n }\r\n }\r\n\r\n a {\r\n className = style\r\n\r\n href = props.href\r\n target = props.target\r\n +props.text\r\n }\r\n}\r\n\r\nprivate external interface TextLinkComponentProps : PropsWithClassName {\r\n var href: String\r\n var text: String\r\n var target: WindowTarget?\r\n}",null,"/*\r\n * Created by abond 17.09.2023, 22:04\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.Global\r\nimport emotion.react.styles\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.html\r\nimport web.cssom.MediaQuery\r\nimport web.cssom.and\r\nimport web.cssom.pct\r\nimport web.cssom.vw\r\n\r\nfun ChildrenBuilder.globalStyles() = GlobalStylesComponent {}\r\n\r\nprivate val GlobalStylesComponent = FC {\r\n Global {\r\n styles {\r\n html {\r\n height= 100.pct\r\n media(screen and maxWidth414) {fontSize = .25.vw}\r\n media(screen and minWidth415 and maxWidth767) {fontSize = .1024.vw}\r\n media(screen and minWidth768 and maxWidth1024) {fontSize = .0902.vw}\r\n media(screen and minWidth1025 and maxWidth1365) {fontSize = .0902.vw}\r\n media(screen and minWidth1366 and maxWidth1920) {fontSize = .0920.vw}\r\n media(screen and minWidth1921 and maxWidth4000) {fontSize = .0921.vw}\r\n }\r\n }\r\n }\r\n}\r\n\r\nval screen = MediaQuery(\"screen\")\r\nval maxWidth414 = MediaQuery(\"(max-width: 414px)\")\r\nval minWidth415 = MediaQuery(\"(min-width: 415px)\")\r\nval maxWidth767 = MediaQuery(\"(max-width: 767px)\")\r\nval minWidth768 = MediaQuery(\"(min-width: 768px)\")\r\nval maxWidth1024 = MediaQuery(\"(max-width: 1024px)\")\r\nval minWidth1025 = MediaQuery(\"(min-width: 1025px)\")\r\nval maxWidth1365 = MediaQuery(\"(max-width: 1365px)\")\r\nval minWidth1366 = MediaQuery(\"(min-width: 1366px)\")\r\nval maxWidth1920 = MediaQuery(\"(max-width: 1920px)\")\r\nval minWidth1921 = MediaQuery(\"(min-width: 1921px)\")\r\nval maxWidth4000 = MediaQuery(\"(max-width: 4000px)\")\r\nval orientationPortrait = MediaQuery(\"(orientation: portrait)\")\r\n",null,null,"/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.header\r\nimport web.cssom.Color\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.header() = HeaderComponent()\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val HeaderComponent = FC(\"Header\") {\r\n header {\r\n css {\r\n backgroundColor = Color(\"#223\") // TODO: добавить цвет в тему\r\n padding = 16.rem\r\n }\r\n logo()\r\n }\r\n}",null,"/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.a\r\nimport ru.totalguide.ui.icons.Icons\r\nimport ru.totalguide.ui.icons.TotalguideLogo\r\n\r\nfun ChildrenBuilder.logo() = LogoComponent()\r\n\r\nprivate val LogoComponent = FC(\"Logo\") {\r\n a {\r\n href = \"/\"\r\n Icons.Special.TotalguideLogo()\r\n }\r\n}","/*\r\n * Created by abond on 07.07.2023, 15:15\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 07.07.2023, 15:15\r\n */\r\n\r\npackage ru.totalguide.ui.icons\r\n\r\nimport emotion.react.css\r\nimport react.FC\r\nimport react.dom.svg.ReactSVG\r\nimport ru.totalguide.ui.icons.Icons.Light\r\nimport ru.totalguide.ui.icons.Icons.Regular\r\nimport ru.totalguide.ui.icons.Icons.Solid\r\nimport ru.totalguide.ui.icons.Icons.Special\r\nimport web.cssom.rem\r\n\r\n/**\r\n * Значки представлены в трех вариантах [Light], [Regular] и [Solid].\r\n *\r\n * [Special] - не стандартные значки в единственном варианте. Например, логотип.\r\n */\r\nobject Icons {\r\n\r\n object Light\r\n\r\n object Regular\r\n\r\n object Solid\r\n\r\n object Special {\r\n object Yandex\r\n }\r\n\r\n internal fun createSvgIcon(path: String) = FC(\"Icon\") {\r\n ReactSVG.svg {\r\n css {\r\n height = IconDimension.rem\r\n width = IconDimension.rem\r\n }\r\n viewBox = \"0 0 $IconDimension $IconDimension\"\r\n fill = \"none\"\r\n xmlns = \"http://www.w3.org/2000/svg\"\r\n\r\n ReactSVG.path {\r\n d = path\r\n fill = \"currentColor\"\r\n }\r\n }\r\n }\r\n\r\n private const val IconDimension = 24\r\n}",null,"package ru.totalguide.ui.icons\r\n\r\nval Icons.Solid.ThumbsDown\r\n get() = solidThumbsDown\r\n\r\nprivate val solidThumbsDown = Icons.createSvgIcon(\r\n \"M4 5.75V13.25C4 13.6875 4.3125 14 4.75 14H7.25C7.65625 14 8 13.6875 8 13.25V5.75C8 5.34375 7.65625 5 7.25 5H4.75C4.3125 5 4 5.34375 4 5.75ZM5.25 12C5.25 11.5938 5.5625 11.25 6 11.25C6.40625 11.25 6.75 11.5938 6.75 12C6.75 12.4375 6.40625 12.75 6 12.75C5.5625 12.75 5.25 12.4375 5.25 12ZM13.75 20C14.5 20 16 19.75 16 17.4688C16 16.1562 15.1875 15.4062 14.9375 14.5H18.125C19.1562 14.5 19.9688 13.6562 20 12.6875C20 12.125 19.75 11.5312 19.375 11.1562C19.6875 10.4375 19.625 9.40625 19.0938 8.6875C19.3438 7.875 19.0938 6.875 18.5625 6.34375C18.7188 5.78125 18.6562 5.3125 18.375 4.9375C17.75 4.03125 16.1562 4 14.8125 4H14.7188C13.2188 4.03125 12 4.5625 11 5C10.5 5.21875 9.84375 5.5 9.34375 5.5C9.15625 5.53125 9 5.6875 9 5.875V12.5625C9 12.6875 9.03125 12.7812 9.09375 12.8438C10.3438 14.0625 10.875 15.3438 11.875 16.375C12.3438 16.8438 12.5 17.5312 12.6875 18.2188C12.8125 18.7812 13.0938 20 13.75 20Z\"\r\n)\r\n\r\nval Icons.Regular.ThumbsDown\r\n get() = regularThumbsDown\r\n\r\nprivate val regularThumbsDown = Icons.createSvgIcon(\r\n \"M18.5625 11.0625C18.6875 10.3438 18.5938 9.65625 18.2812 9.09375C18.375 8.34375 18.1562 7.5625 17.7188 7C17.6875 5.25 16.625 4 14.2188 4C14 4 13.75 4.03125 13.5 4.03125C10.2812 4.03125 9.25 5.25 8 5.25H7.65625C7.46875 5.125 7.25 5 7 5H5C4.4375 5 4 5.46875 4 6V13.5C4 14.0625 4.4375 14.5 5 14.5H7C7.34375 14.5 7.6875 14.3125 7.84375 14H8.0625C8.65625 14.5312 9.5 15.9062 10.2188 16.625C10.6562 17.0625 10.5312 20 12.4688 20C14.25 20 15.4375 19.0312 15.4375 16.75C15.4375 16.1562 15.3125 15.6875 15.1562 15.2812H16.3125C17.8125 15.2812 19 14 19 12.625C19 12 18.8438 11.5312 18.5625 11.0625ZM6 13.25C5.5625 13.25 5.25 12.9375 5.25 12.5C5.25 12.0938 5.5625 11.75 6 11.75C6.40625 11.75 6.75 12.0938 6.75 12.5C6.75 12.9375 6.40625 13.25 6 13.25ZM16.3125 13.7812H13.0625C13.0625 14.9688 13.9375 15.5312 13.9375 16.75C13.9375 17.5 13.9375 18.5 12.4688 18.5C11.875 17.9375 12.1562 16.4375 11.2812 15.5625C10.4375 14.7188 9.21875 12.5 8.3125 12.5H8V6.6875C9.65625 6.6875 11.125 5.53125 13.3438 5.53125H14.5312C15.625 5.53125 16.4375 6.0625 16.1875 7.5625C16.6562 7.84375 17.0312 8.71875 16.625 9.375C17.3125 10 17.2188 10.9688 16.7812 11.4375C17.0938 11.4375 17.5 12.0312 17.5 12.5938C17.4688 13.1875 16.9688 13.7812 16.3125 13.7812Z\"\r\n)\r\n\r\nval Icons.Light.ThumbsDown\r\n get() = lightThumbsDown\r\n\r\nprivate val lightThumbsDown = Icons.createSvgIcon(\r\n \"M19.5 11.0937C19.6875 10.375 19.5938 9.53122 19.2188 8.90622C19.3438 8.18747 19.0938 7.37497 18.625 6.81247C18.6875 5.12497 17.6562 3.99997 15.8125 4.03122C15.7188 3.99997 14.6875 4.03122 14.5312 4.03122C12.125 3.99997 10.0938 5.24997 9 5.24997H8.65625C8.46875 5.12497 8.25 4.99997 8 4.99997H5C4.4375 4.99997 4 5.46872 4 5.99997V14C4 14.5625 4.4375 15 5 15H8C8.53125 15 9 14.5625 9 14V13.625C9 13.625 9.03125 13.6562 9.0625 13.6562C9.75 14 10.8438 15.8125 11.5938 16.5312C11.9062 16.8437 12 17.375 12.125 17.9062C12.2812 18.8437 12.625 20 13.5625 20C15.4375 20 16.1562 18.9375 16.1562 17.0937C16.1562 16.1562 15.7812 15.4687 15.5312 14.9375H17.7188C18.9688 14.9375 20 13.8437 20 12.6562C20 12 19.8125 11.5 19.5 11.0937ZM8 14H5V5.99997H8V14ZM17.7188 13.9375H14.2188C14.2188 15.1875 15.1562 15.7812 15.1562 17.0937C15.1562 17.9062 15.1562 19.0312 13.5625 19.0312C12.9375 18.375 13.25 16.7812 12.3125 15.8437C11.4062 14.9375 10.0625 12.6562 9.125 12.6562H9V6.28122H9.125C10.2188 6.28122 12.3125 5.03122 14.5312 5.03122C14.625 5.03122 15.6875 4.99997 15.8125 5.03122C17 5.03122 17.8438 5.59372 17.5938 7.21872C18.0938 7.49997 18.4688 8.46872 18.0625 9.15622C18.75 9.49997 18.75 11 18.25 11.375C18.75 11.5 19 12.0312 19 12.6562C18.9688 13.2812 18.4375 13.9375 17.7188 13.9375ZM7.25 12.5C7.25 12.0937 6.90625 11.75 6.5 11.75C6.0625 11.75 5.75 12.0937 5.75 12.5C5.75 12.9375 6.0625 13.25 6.5 13.25C6.90625 13.25 7.25 12.9375 7.25 12.5Z\"\r\n)","package ru.totalguide.ui.icons\r\n\r\nval Icons.Solid.ThumbsUp\r\n get() = solidThumbsUp\r\n\r\nprivate val solidThumbsUp = Icons.createSvgIcon(\r\n \"M7.25 11H4.75C4.3125 11 4 11.3438 4 11.75V19.25C4 19.6875 4.3125 20 4.75 20H7.25C7.65625 20 8 19.6875 8 19.25V11.75C8 11.3438 7.65625 11 7.25 11ZM6 18.75C5.5625 18.75 5.25 18.4375 5.25 18C5.25 17.5938 5.5625 17.25 6 17.25C6.40625 17.25 6.75 17.5938 6.75 18C6.75 18.4375 6.40625 18.75 6 18.75ZM16 6.5625C16 4.25 14.5 4 13.75 4C13.0938 4 12.8125 5.25 12.6875 5.8125C12.5 6.5 12.3438 7.1875 11.875 7.65625C10.875 8.6875 10.3438 9.96875 9.09375 11.1875C9.03125 11.2812 9 11.375 9 11.4688V18.1562C9 18.3438 9.15625 18.5 9.34375 18.5312C9.84375 18.5312 10.5 18.8125 11 19.0312C12 19.4688 13.2188 20 14.7188 20H14.8125C16.1562 20 17.75 20 18.375 19.0938C18.6562 18.7188 18.7188 18.25 18.5625 17.6875C19.0938 17.1562 19.3438 16.1562 19.0938 15.3438C19.625 14.625 19.6875 13.5938 19.375 12.875C19.75 12.5 20 11.9062 19.9688 11.3438C19.9688 10.375 19.1562 9.5 18.125 9.5H14.9375C15.1875 8.625 16 7.875 16 6.5625Z\"\r\n)\r\n\r\nval Icons.Regular.ThumbsUp\r\n get() = regularThumbsUp\r\n\r\nprivate val regularThumbsUp = Icons.createSvgIcon(\r\n \"M18.5625 12.9688C18.8438 12.5 19 12 19 11.4062C19 10.0312 17.8125 8.75 16.3125 8.75H15.1562C15.3125 8.34375 15.4375 7.875 15.4375 7.28125C15.4375 5 14.25 4 12.4688 4C10.5312 4 10.6562 6.96875 10.2188 7.40625C9.5 8.125 8.65625 9.5 8.0625 10H5C4.4375 10 4 10.4688 4 11V18.5C4 19.0625 4.4375 19.5 5 19.5H7C7.4375 19.5 7.84375 19.1875 7.9375 18.7812C9.34375 18.8125 10.3125 20 13.5 20C13.75 20 14 20 14.2188 20C16.625 20 17.6875 18.7812 17.7188 17.0312C18.1562 16.4688 18.375 15.6875 18.2812 14.9375C18.5938 14.375 18.6875 13.6875 18.5625 12.9688ZM16.625 14.6562C17.0312 15.3125 16.6562 16.1875 16.1875 16.4688C16.4375 17.9688 15.625 18.5 14.5312 18.5H13.3438C11.125 18.5 9.65625 17.3438 8 17.3438V11.5H8.3125C9.21875 11.5 10.4375 9.3125 11.2812 8.46875C12.1562 7.59375 11.875 6.09375 12.4688 5.5C13.9375 5.5 13.9375 6.53125 13.9375 7.28125C13.9375 8.5 13.0625 9.0625 13.0625 10.25H16.3125C16.9688 10.25 17.4688 10.8438 17.5 11.4375C17.5 12 17.0938 12.5938 16.7812 12.5938C17.2188 13.0625 17.3125 14.0312 16.625 14.6562ZM6.75 17.5C6.75 17.9375 6.40625 18.25 6 18.25C5.5625 18.25 5.25 17.9375 5.25 17.5C5.25 17.0938 5.5625 16.75 6 16.75C6.40625 16.75 6.75 17.0938 6.75 17.5Z\"\r\n)\r\n\r\nval Icons.Light.ThumbsUp\r\n get() = lightThumbsUp\r\n\r\nprivate val lightThumbsUp = Icons.createSvgIcon(\r\n \"M19.5 12.9375C19.8125 12.5312 20 12 20 11.375C19.9688 10.1875 18.9688 9.09375 17.7188 9.09375H15.5312C15.7812 8.5625 16.1562 7.875 16.1562 6.9375C16.1562 5.09375 15.4375 4 13.5625 4C12.625 4 12.2812 5.1875 12.125 6.125C12 6.65625 11.9062 7.1875 11.5938 7.5C10.8438 8.21875 9.75 10 9.0625 10.375C9 10.4062 8.90625 10.4375 8.8125 10.4375C8.625 10.1875 8.3125 10 8 10H5C4.4375 10 4 10.4688 4 11V19C4 19.5625 4.4375 20 5 20H8C8.53125 20 9 19.5625 9 19V18.75C10 18.75 12.125 20.0312 14.5312 20C14.6875 20 15.7188 20.0312 15.8125 20C17.6562 20 18.6875 18.9062 18.625 17.2188C19.0938 16.6562 19.3438 15.8438 19.2188 15.125C19.5938 14.5 19.6875 13.6562 19.5 12.9375ZM5 19V11H8V19H5ZM18.25 12.6562C18.75 13 18.75 14.5 18.0625 14.875C18.4688 15.5625 18.0938 16.5312 17.5938 16.8125C17.8438 18.4375 17 19 15.8125 19C15.6875 19.0312 14.625 19 14.5312 19C12.25 19 10.3125 17.75 9 17.75V11.375C10.1562 11.375 11.25 9.25 12.3125 8.1875C13.25 7.25 12.9375 5.65625 13.5625 5C15.1562 5 15.1562 6.125 15.1562 6.9375C15.1562 8.25 14.2188 8.84375 14.2188 10.0938H17.7188C18.4375 10.0938 18.9688 10.75 19 11.375C19 12 18.75 12.5 18.25 12.6562ZM7.25 17.5C7.25 17.0938 6.90625 16.75 6.5 16.75C6.0625 16.75 5.75 17.0938 5.75 17.5C5.75 17.9375 6.0625 18.25 6.5 18.25C6.90625 18.25 7.25 17.9375 7.25 17.5Z\"\r\n)","/*\r\n * Created by abond 04.12.2023, 13:06\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui.icons\r\n\r\nimport react.FC\r\nimport react.dom.svg.FillRule\r\nimport react.dom.svg.ReactSVG.path\r\nimport react.dom.svg.ReactSVG.svg\r\nimport ru.totalguide.ui.style\r\nimport web.cssom.rem\r\n\r\n@Suppress(\"UnusedReceiverParameter\")\r\nval Icons.Special.TotalguideLogo\r\n get() = totalguideLogo\r\n\r\nprivate val totalguideLogo = FC(\"TotalguideLogo\") {\r\n svg {\r\n className = logoStyle\r\n xmlns = \"http://www.w3.org/2000/svg\"\r\n viewBox = \"0 0 $WIDTH $HEIGHT\"\r\n\r\n path {\r\n d = \"M98.0709 3.7V7.852H92.424V20.5H88.1227V3.7H98.0709Z\"\r\n fill = COLOR_BLUE\r\n }\r\n\r\n path {\r\n d = \"M110.004 20.5V12.052L104.069 20.5H100.729V3.7H105.03V12.148L110.965 3.7H114.281V20.5H110.004Z\"\r\n fill = COLOR_BLUE\r\n }\r\n\r\n path {\r\n d = \"M131.698 16.348H133.5V23.716H129.223V20.5H121.365V23.716H117.064V16.348H118.842C119.611 15.116 119.996 13.34 119.996 11.02V3.7H131.698V16.348ZM123.312 16.348H127.421V7.684H124.273V11.068C124.273 13.308 123.952 15.068 123.312 16.348Z\"\r\n fill = COLOR_BLUE\r\n }\r\n\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M26.0317 24C32.6672 24 38.0464 18.6274 38.0464 12C38.0464 5.37258 32.6672 0 26.0317 0C19.3962 0 14.0171 5.37258 14.0171 12C14.0171 18.6274 19.3962 24 26.0317 24ZM26.0317 19.5C30.1789 19.5 33.5409 16.1421 33.5409 12C33.5409 7.85786 30.1789 4.5 26.0317 4.5C21.8845 4.5 18.5226 7.85786 18.5226 12C18.5226 16.1421 21.8845 19.5 26.0317 19.5Z\"\r\n fill = COLOR_WHITE\r\n }\r\n\r\n path {\r\n d = \"M69.7394 20.5V16.492C70.6365 16.604 71.2853 16.476 71.6858 16.108C72.1023 15.724 72.3105 14.94 72.3105 13.756V3.7H84.2771V20.5H79.9759V7.852H76.6118V13.948C76.6118 15.324 76.4115 16.492 76.011 17.452C75.6266 18.396 75.0899 19.092 74.4011 19.54C73.7283 19.988 73.0074 20.284 72.2384 20.428C71.4695 20.572 70.6365 20.596 69.7394 20.5Z\"\r\n fill = COLOR_WHITE\r\n }\r\n\r\n path {\r\n d = \"M52.1551 3.7V7.852H47.9981V20.5H43.6968V7.852H39.5398V3.7H52.1551Z\"\r\n fill = COLOR_WHITE\r\n }\r\n\r\n path {\r\n d = \"M63.4798 20.5L62.7589 18.076H57.1601L56.4392 20.5H51.7775L57.3283 3.7H62.5666L68.1174 20.5H63.4798ZM58.2654 14.38H61.6535L59.9475 8.668L58.2654 14.38Z\"\r\n fill = COLOR_WHITE\r\n }\r\n\r\n path {\r\n d = \"M12.6154 3.7V7.852H8.45831V20.5H4.15707V7.852H0V3.7H12.6154Z\"\r\n fill = COLOR_WHITE\r\n }\r\n }\r\n}\r\n\r\nprivate const val COLOR_BLUE = \"#0088FF\"\r\nprivate const val COLOR_WHITE = \"white\"\r\nprivate const val HEIGHT = 24\r\nprivate const val WIDTH = 134\r\n\r\nprivate val logoStyle = style {\r\n width = WIDTH.rem\r\n height = HEIGHT.rem\r\n}","/*\r\n * Created by abond 04.12.2023, 13:06\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui.icons\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.div\r\nimport react.dom.svg.FillRule\r\nimport react.dom.svg.ReactSVG.defs\r\nimport react.dom.svg.ReactSVG.linearGradient\r\nimport react.dom.svg.ReactSVG.path\r\nimport react.dom.svg.ReactSVG.stop\r\nimport react.dom.svg.ReactSVG.svg\r\nimport react.dom.svg.SVGAttributes\r\nimport react.memo\r\nimport ru.totalguide.ui.style\r\nimport web.cssom.rem\r\nimport web.svg.SVGSVGElement\r\n\r\n@Suppress(\"UnusedReceiverParameter\")\r\nval Icons.Special.Yandex.Maps\r\n get() = yandexMaps\r\n\r\n@Suppress(\"UnusedReceiverParameter\")\r\nval Icons.Special.Yandex.Navigation\r\n get() = yandexNavigation\r\n\r\n@Suppress(\"UnusedReceiverParameter\")\r\nval Icons.Special.Yandex.Taxi\r\n get() = yandexTaxi\r\n\r\nprivate val yandexMaps = memo(FC(\"YandexMaps\") {\r\n div {\r\n className = logoStyle\r\n\r\n yaSvg {\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M14.5416 9.78557L18.9738 7.75894C18.9738 11.3075 16.5314 14.9737 14.3644 18.467L10.6499 24L12.2749\" +\r\n \" 13.8972L14.5416 9.786V9.78557Z\"\r\n fill = \"#C5141C\"\r\n }\r\n\r\n path {\r\n d = \"M11.5 15.0527C15.6421 15.0527 19 11.683 19 7.52633C19 3.36965 15.6421 0 11.5 0C7.35786 0 4 3.36965\" +\r\n \" 4 7.52633C4 11.683 7.35786 15.0527 11.5 15.0527Z\"\r\n fill = \"#EE0000\"\r\n }\r\n\r\n path {\r\n d = \"M11.5 10.5369C13.1568 10.5369 14.5 9.18901 14.5 7.52634C14.5 5.86367 13.1568 4.51581 11.5 \" +\r\n \"4.51581C9.8431 4.51581 8.49995 5.86367 8.49995 7.52634C8.49995 9.18901 9.8431 10.5369 11.5 10.5369Z\"\r\n fill = \"white\"\r\n }\r\n }\r\n }\r\n})\r\n\r\nprivate val yandexNavigation = memo(FC(\"YandexNavigation\") {\r\n div {\r\n className = logoStyle\r\n\r\n yaSvg {\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M23.9996 -0.000267029L-0.000366211 9.75312L10.5019 13.5035L14.2523 23.9997L23.9996 -0.000267029Z\"\r\n fill = \"url(#yandexNavigationGradient)\"\r\n }\r\n\r\n path {\r\n d = \"M23.9995 -0.000401011L10.1273 13.8778L14.2522 23.9996L23.9995 -0.000401011Z\"\r\n fill = \"#FFCC00\"\r\n }\r\n\r\n path {\r\n d = \"M9.75284 14.2523L14.2521 23.9996L12.7483 11.2508L-0.000556946 9.75302L9.75284 14.2523Z\"\r\n fill = \"#ECA704\"\r\n }\r\n\r\n defs {\r\n linearGradient {\r\n id = \"yandexNavigationGradient\"\r\n x1 = -0.000275846\r\n y1 = 23.9993\r\n x2 = 24.0007\r\n y2 = -0.00176077\r\n gradientUnits = \"userSpaceOnUse\"\r\n\r\n stop {\r\n stopColor = \"#FFCC00\"\r\n }\r\n\r\n stop {\r\n offset = \"1\"\r\n stopColor = \"#FFE992\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n})\r\n\r\nprivate val yandexTaxi = memo(FC(\"YandexTaxi\") {\r\n div {\r\n className = logoStyle\r\n\r\n yaSvg {\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M24 12H12V24H19.0586C21.7881 24 24 21.7877 24 19.0586V12Z\"\r\n fill = \"black\"\r\n }\r\n\r\n path {\r\n fillRule = FillRule.evenodd\r\n clipRule = \"evenodd\"\r\n d = \"M0 12H12V24H4.94143C2.21186 24 0 21.7877 0 19.0586V12Z\"\r\n fill = \"#F2F1ED\"\r\n }\r\n\r\n path {\r\n d = \"M0 12V4.94143C0 2.21229 2.21186 0 4.94143 0H19.0586C21.7881 0 24 2.21229 24 4.94143V12H0Z\"\r\n fill = \"#FFDD33\"\r\n }\r\n }\r\n }\r\n})\r\n\r\nprivate const val HEIGHT = 24\r\nprivate const val WIDTH = 24\r\n\r\nprivate val logoStyle = style {\r\n width = WIDTH.rem\r\n height = HEIGHT.rem\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.yaSvg(crossinline block: SVGAttributes.() -> Unit) {\r\n svg {\r\n className = logoStyle\r\n fill = \"none\"\r\n xmlns = \"http://www.w3.org/2000/svg\"\r\n viewBox = \"0 0 $WIDTH $HEIGHT\"\r\n\r\n block()\r\n }\r\n}","/*\r\n * Created by abond 11.11.2023, 12:51\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport csstype.PropertiesBuilder\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.PropsWithClassName\r\nimport react.dom.html.ReactHTML.img\r\nimport web.cssom.AspectRatio\r\nimport web.cssom.ClassName\r\nimport web.cssom.pct\r\nimport web.html.Loading\r\n\r\nfun ChildrenBuilder.image(\r\n src: String,\r\n srcSet: String,\r\n onClick: OnClickHandler = {},\r\n style: PropertiesBuilder.() -> Unit,\r\n) = image(src, srcSet, onClick, style(style))\r\n\r\nfun ChildrenBuilder.image(\r\n src: String,\r\n srcSet: String,\r\n onClick: OnClickHandler = {},\r\n style: ClassName? = null,\r\n) = ImageComponent {\r\n this.className = style\r\n this.onClick = onClick\r\n this.src = src\r\n this.srcSet = srcSet\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val ImageComponent = FC(\"Image\") { props ->\r\n img {\r\n this.className = defaultStyle.append(props.className)\r\n this.loading = Loading.lazy\r\n this.onClick = { props.onClick() }\r\n this.src = props.src\r\n this.srcSet = props.srcSet\r\n }\r\n}\r\n\r\nprivate external interface ImageComponentProps : PropsWithClassName {\r\n var onClick: OnClickHandler\r\n var src: String\r\n var srcSet: String\r\n}\r\n\r\nprivate val defaultStyle = style {\r\n aspectRatio = \"4/3\".unsafeCast()\r\n width = 100.pct\r\n}",null,"/*\r\n * Created by abond on 26.07.2023, 16:40\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 26.07.2023, 16:40\r\n */\r\n\r\npackage ru.totalguide.ui.layouts\r\n\r\nimport csstype.PropertiesBuilder\r\nimport emotion.css.ClassName\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.PropsWithChildren\r\nimport react.PropsWithClassName\r\nimport react.dom.html.ReactHTML\r\nimport ru.totalguide.ui.style\r\nimport web.cssom.AlignItems\r\nimport web.cssom.ClassName\r\nimport web.cssom.Display\r\nimport web.cssom.FlexDirection\r\nimport web.cssom.JustifyContent\r\n\r\n/**\r\n * Располагает дочерние компоненты вертикально.\r\n *\r\n * Пример:\r\n *\r\n * val style = { backgroundColor = Color(\"#F00\") }\r\n * column(style) {\r\n * // дочерние компоненты...\r\n * }\r\n *\r\n */\r\nfun ChildrenBuilder.column(\r\n style: ClassName? = null,\r\n onClick: () -> Unit = {},\r\n content: ChildrenBuilder.() -> Unit,\r\n) = ColumnComponent {\r\n className = style\r\n this.onClick = onClick\r\n content()\r\n}\r\n\r\n/**\r\n * Располагает дочерние компоненты вертикально.\r\n *\r\n * Пример:\r\n *\r\n * column(style = { backgroundColor = Color(\"#F00\") }) {\r\n * // дочерние компоненты...\r\n * }\r\n *\r\n */\r\nfun ChildrenBuilder.column(\r\n style: PropertiesBuilder.() -> Unit,\r\n onClick: () -> Unit = {},\r\n content: ChildrenBuilder.() -> Unit,\r\n) = column(style(style), onClick, content)\r\n\r\n/** Располагает дочерние компоненты вертикально. */\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val ColumnComponent = FC(\"Column\") { props ->\r\n val userProvidedStyles = props.className\r\n val overridableDefaultStyles = ClassName {\r\n alignItems = AlignItems.stretch\r\n justifyContent = JustifyContent.flexStart\r\n }\r\n\r\n ReactHTML.div {\r\n css(overridableDefaultStyles, userProvidedStyles) {\r\n display = Display.flex\r\n flexDirection = FlexDirection.column\r\n }\r\n onClick = { props.onClick() }\r\n +props.children\r\n }\r\n}\r\n\r\nprivate external interface ColumnComponentProps: PropsWithChildren, PropsWithClassName {\r\n var onClick: () -> Unit\r\n}\r\n\r\n",null,null,"/*\r\n * Created by abond on 26.07.2023, 16:44\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 26.07.2023, 16:44\r\n */\r\n\r\npackage ru.totalguide.ui.layouts\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.dom.html.ReactHTML.div\r\nimport web.cssom.Color\r\nimport web.cssom.Padding\r\nimport web.cssom.number\r\nimport web.cssom.pct\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.commonScreenTemplate(\r\n topBar: ChildrenBuilder.() -> Unit,\r\n content: ChildrenBuilder.() -> Unit,\r\n footer: ChildrenBuilder.() -> Unit = {},\r\n) = FC(\"CommonScreenTemplate\") {\r\n column(style = {\r\n height = 100.pct\r\n }) {\r\n topBar()\r\n div {\r\n css {\r\n flexGrow = number(1.0)\r\n backgroundColor = Color(\"#F5F5F5\")\r\n padding = Padding(24.rem, 16.rem)\r\n }\r\n content()\r\n }\r\n footer()\r\n }\r\n}.invoke()","/*\r\n * Created by abond on 24.07.2023, 16:41\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 24.07.2023, 16:41\r\n */\r\n\r\npackage ru.totalguide.ui.layouts\r\n\r\nimport csstype.PropertiesBuilder\r\nimport emotion.css.ClassName\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.PropsWithChildren\r\nimport react.PropsWithClassName\r\nimport react.dom.html.ReactHTML.div\r\nimport ru.totalguide.ui.style\r\nimport web.cssom.AlignItems\r\nimport web.cssom.ClassName\r\nimport web.cssom.Display\r\nimport web.cssom.FlexDirection\r\nimport web.cssom.JustifyContent\r\n\r\n/**\r\n * Располагает дочерние компоненты горизонтально.\r\n *\r\n * Пример:\r\n *\r\n * val style = { backgroundColor = Color(\"#F00\") }\r\n * row(style) {\r\n * // дочерние компоненты...\r\n * }\r\n *\r\n */\r\nfun ChildrenBuilder.row(\r\n style: ClassName? = null,\r\n content: ChildrenBuilder.() -> Unit,\r\n) = RowComponent {\r\n className = style\r\n content()\r\n}\r\n\r\n/**\r\n * Располагает дочерние компоненты горизонтально.\r\n *\r\n * Пример:\r\n *\r\n * column(style = { backgroundColor = Color(\"#F00\") }) {\r\n * // дочерние компоненты...\r\n * }\r\n *\r\n */\r\nfun ChildrenBuilder.row(\r\n style: PropertiesBuilder.() -> Unit,\r\n content: ChildrenBuilder.() -> Unit,\r\n) = row(style(style), content)\r\n\r\n/** Располагает дочерние компоненты горизонтально. */\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val RowComponent = FC(\"Row\") { props ->\r\n val userProvidedStyles = props.className\r\n val overridableDefaultStyles = ClassName {\r\n alignItems = AlignItems.center\r\n justifyContent = JustifyContent.flexStart\r\n }\r\n\r\n div {\r\n css(overridableDefaultStyles, userProvidedStyles) {\r\n display = Display.flex\r\n flexDirection = FlexDirection.row\r\n }\r\n +props.children\r\n }\r\n}\r\n\r\nprivate external interface RowComponentProps: PropsWithChildren, PropsWithClassName","package ru.totalguide.ui\r\n\r\nimport emotion.css.ClassName\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.PropsWithClassName\r\nimport react.dom.html.ReactHTML\r\nimport react.dom.html.ReactHTML.span\r\nimport react.dom.svg.ReactSVG.svg\r\nimport web.cssom.Color\r\nimport web.cssom.Cursor\r\nimport web.cssom.Display\r\nimport web.cssom.FontStyle\r\nimport web.cssom.FontWeight\r\nimport web.cssom.None\r\nimport web.cssom.rem\r\nimport web.cssom.string\r\n\r\n/**\r\n * Прозрачная кнопка.\r\n *\r\n * @param text Текст.\r\n * @param icon Значок.\r\n * @param isActive Признак активности.\r\n * @param onClick Обработчик нажатия на кнопку.\r\n */\r\nfun ChildrenBuilder.likeButton(\r\n text: String,\r\n icon: FC,\r\n isActive: Boolean = false,\r\n onClick: () -> Unit,\r\n) = LikeButton {\r\n this.onClick = onClick\r\n this.text = text\r\n this.icon = icon\r\n this.isActive = isActive\r\n\r\n// val outlineColor = colors.hoverForeground.alpha(HOVER_COLOR_ALPHA)\r\n// css {\r\n// focus {\r\n// outline = Outline(4.rem, LineStyle.solid, outlineColor)\r\n// }\r\n// }\r\n}\r\nprivate external interface LikeButtonProps : PropsWithClassName {\r\n var isActive: Boolean\r\n var icon: FC\r\n var onClick: () -> Unit\r\n var text: String\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val LikeButton = FC(\"LikeButton\") { props ->\r\n val theme = useTGTheme()\r\n val overridableStyles = ClassName {\r\n border = None.none\r\n outline = None.none\r\n }\r\n\r\n ReactHTML.button {\r\n css(overridableStyles, props.className) {\r\n display = Display.flex\r\n// alignItems = AlignItems.flexStart\r\n columnGap = 4.rem\r\n backgroundColor = Color(\"#FFFFFF\")\r\n color = theme.colorScheme.textBasic\r\n\r\n focus {\r\n// textShadow = TextShadow(0.rem, 4.rem, 8.rem, 0.rem, theme.colorScheme.primary)\r\n }\r\n hover {\r\n color = Color(\"#000000\")\r\n cursor = Cursor.pointer\r\n }\r\n active {\r\n outline = None.none\r\n color = theme.colorScheme.primary\r\n }\r\n disabled {\r\n boxShadow = None.none\r\n }\r\n\r\n svg {\r\n fontSize = 20.rem\r\n }\r\n }\r\n\r\n onClick = { event ->\r\n event.stopPropagation()\r\n props.onClick()\r\n }\r\n disabled = props.isActive\r\n props.icon()\r\n\r\n span {\r\n css {\r\n fontFamily = string(\"Golos Text\")\r\n fontSize = 16.rem\r\n fontStyle = FontStyle.normal\r\n lineHeight = 24.rem\r\n fontWeight = \"400\".unsafeCast()\r\n }\r\n +props.text\r\n }\r\n }\r\n}",null,"/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.a\r\nimport react.dom.html.ReactHTML.span\r\nimport react.memo\r\nimport ru.totalguide.ui.icons.Icons\r\nimport ru.totalguide.ui.icons.Maps\r\nimport ru.totalguide.ui.icons.Navigation\r\nimport ru.totalguide.ui.icons.Taxi\r\nimport ru.totalguide.ui.layouts.row\r\nimport web.cssom.*\r\nimport web.window.WindowTarget.Companion._blank\r\n\r\nfun ChildrenBuilder.locationActions(\r\n createRouteUrl: String,\r\n callTaxiUrl: String,\r\n showOnMapUrl: String\r\n) = LocationActionsComponent {\r\n this.createRouteUrl = createRouteUrl\r\n this.callTaxiUrl = callTaxiUrl\r\n this.showOnMapUrl = showOnMapUrl\r\n}\r\n\r\nprivate val LocationActionsComponent = FC(\"LocationActions\") { props ->\r\n val theme = useTGTheme() //todo: поднять выше\r\n\r\n row(panelStyle) {\r\n locationActionButton(\r\n icon = Icons.Special.Yandex.Navigation,\r\n text = \"Построить маршрут\",\r\n url = props.createRouteUrl,\r\n theme = theme,\r\n )\r\n\r\n locationActionButton(\r\n icon = Icons.Special.Yandex.Taxi,\r\n text = \"Вызвать такси\",\r\n url = props.callTaxiUrl,\r\n theme = theme,\r\n )\r\n\r\n locationActionButton(\r\n icon = Icons.Special.Yandex.Maps,\r\n text = \"Показать на карте\",\r\n url = props.showOnMapUrl,\r\n theme = theme,\r\n )\r\n }\r\n}\r\n\r\nprivate val panelStyle = style {\r\n display = Display.flex\r\n justifyContent = JustifyContent.spaceBetween\r\n columnGap = 18.rem\r\n height = 40.rem\r\n}\r\n\r\nprivate fun ChildrenBuilder.locationActionButton(\r\n icon: FC,\r\n text: String,\r\n url: String,\r\n theme: TGTheme,\r\n) = LocationActionButtonComponent {\r\n this.icon = icon\r\n this.text = text\r\n this.url = url\r\n this.theme = theme\r\n}\r\n\r\nprivate val LocationActionButtonComponent = memo(FC(\"LocationActionButton\") { props ->\r\n a {\r\n className = props.buttonStyle\r\n href = props.url\r\n target = _blank\r\n props.icon()\r\n span {\r\n +props.text\r\n }\r\n }\r\n})\r\n\r\nprivate inline val LocationActionButtonComponentProps.buttonStyle\r\n get() = style {\r\n display = Display.flex\r\n columnGap = 8.rem\r\n alignItems = AlignItems.center\r\n applyTextStyle(theme.typography.hint)\r\n textDecoration = None.none\r\n color = theme.colorScheme.textBasic\r\n active {\r\n color = theme.colorScheme.primary\r\n }\r\n hover {\r\n color = theme.colorScheme.textHeading\r\n }\r\n }\r\n\r\nprivate external interface LocationActionButtonComponentProps : Props {\r\n var icon: FC\r\n var text: String\r\n var url: String\r\n var theme: TGTheme\r\n}\r\n\r\nprivate external interface LocationActionsComponentProps : Props {\r\n var createRouteUrl: String\r\n var callTaxiUrl: String\r\n var showOnMapUrl: String\r\n}","/*\r\n * Created by abond 20.10.2023, 21:05\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport kotlinx.browser.document\r\nimport kotlinx.dom.appendElement\r\nimport org.w3c.dom.Document\r\nimport org.w3c.dom.Element\r\nimport org.w3c.dom.asList\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.useEffect\r\n\r\nfun ChildrenBuilder.metaDescription(value: String) = MetaDescriptionComponent {\r\n this.value = value\r\n}\r\n\r\nprivate external interface MetaDescriptionComponentProps : Props {\r\n var value: String\r\n}\r\n\r\nprivate val MetaDescriptionComponent = FC(\"MetaDescription\") { props ->\r\n useEffect(props.value) {\r\n document\r\n .getOrCreateMetaDescription()\r\n .setContent(props.value)\r\n }\r\n}\r\n\r\nprivate fun Document.getOrCreateMetaDescription() = findMetaDescription() ?: addMetaDescription()\r\n\r\nprivate fun Document.findMetaDescription() = findMetaElements().findDescription()\r\n\r\nprivate fun List.findDescription() =\r\n find { meta -> meta.attributes.getNamedItem(ATTRIBUTE_NAME)?.value == DESCRIPTION }\r\n\r\nprivate fun Document.addMetaDescription(): Element = head!!.appendElement(TAG_META) {\r\n setAttribute(ATTRIBUTE_NAME, DESCRIPTION)\r\n}\r\n\r\nprivate fun Document.findMetaElements() = getElementsByTagName(TAG_META).asList()\r\n\r\nprivate fun Element.setContent(value: String) {\r\n setAttribute(ATTRIBUTE_CONTENT, value)\r\n}\r\n\r\nprivate const val DESCRIPTION = \"description\"\r\nprivate const val ATTRIBUTE_NAME = \"name\"\r\nprivate const val ATTRIBUTE_CONTENT = \"content\"\r\nprivate const val TAG_META = \"meta\"","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.StateSetter\r\nimport react.dom.html.ReactHTML\r\nimport react.useState\r\nimport ru.totalguide.ui.Actions.DISTANCE\r\nimport ru.totalguide.ui.Actions.MAP\r\nimport ru.totalguide.ui.Actions.RATING\r\nimport ru.totalguide.ui.layouts.column\r\nimport ru.totalguide.ui.layouts.row\r\nimport ru.totalguide.ui.text.p\r\nimport web.cssom.Color\r\nimport web.cssom.Cursor\r\nimport web.cssom.Display\r\nimport web.cssom.JustifyContent\r\nimport web.cssom.pct\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.placeActions(\r\n likesCount: String,\r\n rating: String,\r\n dislikesCount: String,\r\n routeUrl: String,\r\n callTaxiUrl: String,\r\n showOnMapUrl: String\r\n) = PlaceActionsComponent {\r\n this.likesCount = likesCount\r\n this.rating = rating\r\n this.dislikesCount = dislikesCount\r\n this.createRouteUrl = routeUrl\r\n this.callTaxiUrl = callTaxiUrl\r\n this.showOnMapUrl = showOnMapUrl\r\n\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val PlaceActionsComponent = FC(\"PlaceActions\") { props ->\r\n val (currentActions, setCurrentActions) = useState(RATING)\r\n column(style = { padding = 16.rem }) {\r\n actionsSwitchButtons(currentActions, setCurrentActions)\r\n actionsSwitch(currentActions, props)\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.actionsSwitch(\r\n currentActions: Actions,\r\n props: PlaceActionsComponentProps\r\n) {\r\n when (currentActions) {\r\n RATING -> rating(props.likesCount, props.rating, props.dislikesCount)\r\n DISTANCE -> distanceActions()\r\n MAP -> locationActions(props.createRouteUrl, props.callTaxiUrl, props.showOnMapUrl)\r\n }\r\n}\r\n\r\nprivate inline fun ChildrenBuilder.actionsSwitchButtons(\r\n currentActions: Actions,\r\n setCurrentActions: StateSetter\r\n) {\r\n row(style = {\r\n width = 100.pct\r\n display = Display.flex\r\n justifyContent = JustifyContent.spaceBetween\r\n paddingBottom = 16.rem\r\n }) {\r\n miniTabButton(\"РЕЙТИНГ\", isActive = currentActions == RATING) {\r\n setCurrentActions(RATING)\r\n }\r\n// miniTabButton(\"СКОЛЬКО ДО МЕСТА\", isActive = currentActions == DISTANCE) {\r\n// setCurrentActions(DISTANCE)\r\n// }\r\n miniTabButton(\"ДОБРАТЬСЯ\", isActive = currentActions == MAP) {\r\n setCurrentActions(MAP)\r\n }\r\n }\r\n}\r\n\r\nprivate external interface PlaceActionsComponentProps : Props {\r\n var likesCount: String\r\n var rating: String\r\n var dislikesCount: String\r\n var createRouteUrl: String\r\n var callTaxiUrl: String\r\n var showOnMapUrl: String\r\n}\r\n\r\nprivate enum class Actions {\r\n RATING,\r\n DISTANCE,\r\n MAP,\r\n}\r\n\r\nprivate fun ChildrenBuilder.miniTabButton(\r\n text: String,\r\n isActive: Boolean,\r\n onClick: () -> Unit,\r\n) = MiniTabButtonComponent {\r\n this.text = text\r\n this.isActive = isActive\r\n this.onClick = onClick\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val MiniTabButtonComponent = FC(\"MiniTabButton\") { props ->\r\n val theme = useTGTheme()\r\n ReactHTML.button {\r\n css {\r\n backgroundColor = Color(\"#FFFFFF\")\r\n cursor = Cursor.pointer\r\n color = theme.colorScheme.textBasic\r\n fontSize =12.rem\r\n\r\n if (props.isActive) color = theme.colorScheme.primary\r\n }\r\n onClick = { event ->\r\n event.stopPropagation()\r\n props.onClick()\r\n }\r\n +props.text\r\n }\r\n}\r\n\r\nprivate external interface MiniTabButtonComponentProps : Props {\r\n var text: String\r\n var isActive: Boolean\r\n var onClick: () -> Unit\r\n}\r\n\r\nprivate fun ChildrenBuilder.distanceActions() = distanceActionsComponent {\r\n}\r\n\r\nprivate val distanceActionsComponent = FC {\r\n p(\"Сколько до места\")\r\n}\r\n\r\nprivate external interface DistanceActionsComponentProps : Props {\r\n}\r\n",null,"/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.span\r\nimport ru.totalguide.ui.icons.Icons\r\nimport ru.totalguide.ui.icons.ThumbsDown\r\nimport ru.totalguide.ui.icons.ThumbsUp\r\nimport ru.totalguide.ui.layouts.row\r\nimport web.cssom.Display\r\nimport web.cssom.FontStyle\r\nimport web.cssom.FontWeight\r\nimport web.cssom.JustifyContent\r\nimport web.cssom.rem\r\nimport web.cssom.string\r\n\r\n\r\nfun ChildrenBuilder.rating(likesCount: String, rating: String, dislikesCount: String) = RatingComponent {\r\n this.likesCount = likesCount\r\n this.rating = rating\r\n this.dislikesCount = dislikesCount\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val RatingComponent = FC(\"Rating\") { props ->\r\n val theme = useTGTheme()\r\n row(style = {\r\n display = Display.flex\r\n justifyContent = JustifyContent.spaceBetween\r\n height = 40.rem\r\n }) {\r\n likeButton(props.likesCount, Icons.Solid.ThumbsUp) {}\r\n span {\r\n css {\r\n fontFamily = string(\"Golos Text\")\r\n fontSize = 32.rem\r\n fontStyle = FontStyle.normal\r\n fontWeight = \"700\".unsafeCast()\r\n lineHeight = 40.rem\r\n color = if (props.rating.isNotBlank() && props.rating.toInt() > 0) { //TODO: вынести расчёт свойства\r\n theme.colorScheme.success\r\n } else {\r\n theme.colorScheme.error\r\n }\r\n\r\n }\r\n +props.rating\r\n }\r\n likeButton(props.dislikesCount, Icons.Solid.ThumbsDown) {}\r\n }\r\n}\r\n\r\nprivate external interface RatingComponentProps : Props {\r\n var likesCount: String\r\n var rating: String\r\n var dislikesCount: String\r\n}\r\n","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.a\r\nimport react.useState\r\nimport ru.totalguide.ui.layouts.column\r\nimport ru.totalguide.ui.text.p\r\nimport web.cssom.BoxShadow\r\nimport web.cssom.Color\r\nimport web.cssom.Cursor.Companion.pointer\r\nimport web.cssom.None.Companion.none\r\nimport web.cssom.Overflow\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.placeCard(\r\n key: String,\r\n name: String,\r\n detailsUrl: String,\r\n description: String,\r\n covers: List,\r\n likesCount: String,\r\n rating: String,\r\n dislikesCount: String,\r\n routeUrl: String,\r\n callTaxiUrl: String,\r\n showOnMapUrl: String,\r\n onClick: OnClickHandler,\r\n) = PlaceCardComponent {\r\n this.key = key\r\n this.name = name\r\n this.detailsUrl = detailsUrl\r\n this.description = description\r\n this.covers = covers\r\n this.likesCount = likesCount\r\n this.rating = rating\r\n this.dislikesCount = dislikesCount\r\n this.routeUrl = routeUrl\r\n this.callTaxiUrl = callTaxiUrl\r\n this.showOnMapUrl = showOnMapUrl\r\n this.onClick = onClick\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val PlaceCardComponent = FC(\"PlaceCard\") { props ->\r\n val theme = useTGTheme()\r\n val placeCardStyle = style {\r\n backgroundColor = Color(\"#FFFFFF\")\r\n borderRadius = 28.rem\r\n boxShadow = BoxShadow(0.rem, 1.rem, 1.rem, 0.rem, theme.colorScheme.primaryDark.alpha(\"40\"))\r\n overflow = Overflow.hidden\r\n }\r\n\r\n column(\r\n style = placeCardStyle,\r\n ) {\r\n covers(\r\n covers = props.covers,\r\n onClick = props.onClick,\r\n )\r\n\r\n description(\r\n name = props.name,\r\n detailsUrl = props.detailsUrl,\r\n description = props.description,\r\n onClick = props.onClick\r\n )\r\n\r\n placeActions(\r\n likesCount = props.likesCount,\r\n rating = props.rating,\r\n dislikesCount = props.dislikesCount,\r\n routeUrl = props.routeUrl,\r\n callTaxiUrl = props.callTaxiUrl,\r\n showOnMapUrl = props.showOnMapUrl,\r\n )\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.covers(\r\n covers: List,\r\n onClick: OnClickHandler,\r\n) {\r\n when (covers.size) {\r\n 0 -> placeholder(onClick = onClick)\r\n 1 -> image(\r\n src = covers[0].src,\r\n srcSet = covers[0].srcSet,\r\n onClick = onClick,\r\n style = {\r\n cursor = pointer\r\n },\r\n )\r\n else -> slider(images = covers, onClick = onClick)\r\n }\r\n}\r\n\r\nprivate external interface PlaceCardComponentProps : Props {\r\n var name: String\r\n var detailsUrl: String\r\n var description: String\r\n var covers: List\r\n var likesCount: String\r\n var rating: String\r\n var dislikesCount: String\r\n var routeUrl: String\r\n var callTaxiUrl: String\r\n var showOnMapUrl: String\r\n var onClick: () -> Unit\r\n}\r\n\r\nprivate fun ChildrenBuilder.description(\r\n name: String,\r\n detailsUrl: String,\r\n description: String,\r\n onClick: () -> Unit,\r\n) {\r\n column(\r\n style = {\r\n padding = 16.rem\r\n cursor = pointer\r\n },\r\n onClick = onClick\r\n ) {\r\n linkedTitle(name, detailsUrl)\r\n p(description)\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.linkedTitle(text: String, url: String) {\r\n val (titleStyle) = useState(useTGTheme().typography.heading2.copy(fontSize = 20.rem))\r\n\r\n a {\r\n css {\r\n applyTextStyle(titleStyle)\r\n marginBottom = 8.rem\r\n textDecoration = none\r\n }\r\n onClick = { event ->\r\n event.preventDefault()\r\n }\r\n\r\n href = url\r\n +text\r\n }\r\n}",null,"package ru.totalguide.ui\r\n\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.div\r\nimport react.useState\r\nimport web.cssom.AlignItems\r\nimport web.cssom.Color\r\nimport web.cssom.Display\r\nimport web.cssom.JustifyContent\r\nimport web.cssom.pct\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.placeholder(onClick: OnClickHandler = {}) = PlaceholderComponent {\r\n this.onClick = onClick\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val PlaceholderComponent = FC(\"Placeholder\") {props ->\r\n val theme = useTGTheme()\r\n val (textStyle) = useState(theme.typography.paragraph)\r\n div {\r\n css {\r\n applyTextStyle(textStyle)\r\n width = 100.pct\r\n height = 232.rem\r\n backgroundColor = Color(\"#999999\")\r\n display = Display.flex\r\n alignItems = AlignItems.center\r\n justifyContent = JustifyContent.center\r\n color = Color(\"#ffffff\")\r\n }\r\n onClick = { props.onClick() }\r\n +\"Нет изображения\"\r\n }\r\n}\r\n\r\nprivate external interface PlaceholderComponentProps: Props {\r\n var onClick: OnClickHandler\r\n}","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport csstype.PropertiesBuilder\r\nimport emotion.react.css\r\nimport purereactcarousel.CarouselContext\r\nimport purereactcarousel.CarouselProvider\r\nimport purereactcarousel.CarouselStoreInterface\r\nimport purereactcarousel.DotGroup\r\nimport purereactcarousel.Image\r\nimport purereactcarousel.Slide\r\nimport purereactcarousel.Slider\r\nimport purereactcarousel.SliderProps\r\nimport purereactcarousel.importStyles\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.button\r\nimport react.useContext\r\nimport react.useEffect\r\nimport react.useState\r\nimport web.cssom.Border\r\nimport web.cssom.Color\r\nimport web.cssom.Display\r\nimport web.cssom.JustifyContent\r\nimport web.cssom.LineStyle\r\nimport web.cssom.Position\r\nimport web.cssom.Position.Companion.relative\r\nimport web.cssom.pct\r\nimport web.cssom.rem\r\n\r\nfun ChildrenBuilder.slider(images: List, onClick: OnClickHandler = {}) =\r\n SliderComponent {\r\n this.images = images\r\n this.onClick = onClick\r\n }\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val SliderComponent = FC(\"Slider\") { props ->\r\n importStyles()\r\n val images = props.images\r\n\r\n CarouselProvider {\r\n infinite = true\r\n naturalSlideWidth = 328\r\n naturalSlideHeight = 248\r\n totalSlides = images.size\r\n css {\r\n position = relative\r\n }\r\n\r\n Slider {\r\n onClick = { props.onClick() }\r\n slides(images)\r\n }\r\n\r\n dots()\r\n }\r\n}\r\n\r\nprivate external interface SliderComponentProps : Props {\r\n var images: List\r\n var onClick: OnClickHandler\r\n}\r\n\r\nprivate fun SliderProps.slides(images: List) {\r\n for (image in images) {\r\n imageSlide(image)\r\n }\r\n}\r\n\r\nprivate inline fun SliderProps.imageSlide(image: ViewableImage) {\r\n Slide {\r\n Image {\r\n image(\r\n src = image.src,\r\n srcSet = image.srcSet,\r\n )\r\n }\r\n }\r\n}\r\n\r\nprivate fun ChildrenBuilder.dots() {\r\n FC(\"Dots\") {\r\n val selectedIndex = useCurrentSlideIndex()\r\n\r\n DotGroup {\r\n css {\r\n position = Position.absolute\r\n bottom = 16.rem\r\n left = 0.rem\r\n display = Display.flex\r\n justifyContent = JustifyContent.center\r\n gap = 4.rem\r\n width = 100.pct\r\n dotStyle(selectedIndex)\r\n }\r\n }\r\n }.invoke()\r\n}\r\n\r\nprivate fun useCurrentSlideIndex(): Int {\r\n val context = useContext(CarouselContext)\r\n val (currentSlideIndex, setCurrentSlideIndex) = useState(context.currentSlideIndex)\r\n useEffect(context) {\r\n fun onStateChanged() {\r\n setCurrentSlideIndex(context.currentSlideIndex)\r\n }\r\n\r\n context.subscribe(::onStateChanged)\r\n cleanup {\r\n context.unsubscribe(::onStateChanged)\r\n }\r\n }\r\n return currentSlideIndex\r\n}\r\n\r\nprivate inline val CarouselStoreInterface.currentSlideIndex: Int\r\n get() = state.currentSlide.toInt() + 1\r\n\r\nprivate fun PropertiesBuilder.dotStyle(selectedIndex: Int) {\r\n button {\r\n border = Border(DOT_BORDER_WIDTH.rem, LineStyle.solid, Color(DOT_COLOR))\r\n width = DOT_SIZE.rem\r\n height = DOT_SIZE.rem\r\n borderRadius = DOT_BORDER_RADIUS.rem\r\n backgroundColor = Color(DOT_COLOR).alpha(DOT_COLOR_ALPHA)\r\n\r\n nthChild(\"$selectedIndex\") {\r\n backgroundColor = Color(DOT_COLOR)\r\n }\r\n }\r\n}\r\n\r\nprivate const val DOT_BORDER_RADIUS = 4\r\nprivate const val DOT_BORDER_WIDTH = 1\r\nprivate const val DOT_COLOR = \"#FFFFFF\"\r\nprivate const val DOT_COLOR_ALPHA = \"10\"\r\nprivate const val DOT_SIZE = 8",null,null,"/*\r\n * Created by abond 09.11.2023, 14:32\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport csstype.Properties\r\nimport emotion.css.keyframes\r\nimport emotion.react.css\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.svg.ReactSVG.circle\r\nimport react.dom.svg.ReactSVG.svg\r\nimport react.dom.svg.SVGAttributes\r\nimport react.dom.svg.StrokeLinecap.Companion.round\r\nimport web.cssom.Animation\r\nimport web.cssom.AnimationIterationCount.Companion.infinite\r\nimport web.cssom.AnimationTimingFunction.Companion.easeInOut\r\nimport web.cssom.AnimationTimingFunction.Companion.linear\r\nimport web.cssom.Height\r\nimport web.cssom.Width\r\nimport web.cssom.deg\r\nimport web.cssom.pct\r\nimport web.cssom.rem\r\nimport web.cssom.rotate\r\nimport web.cssom.s\r\nimport web.svg.SVGCircleElement\r\n\r\nfun ChildrenBuilder.spinner(\r\n height: Height = 24.rem,\r\n width: Width = 24.rem,\r\n) = SpinnerComponent {\r\n this.height = height\r\n this.width = width\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val SpinnerComponent = FC(\"Spinner\") { props ->\r\n val theme = useTGTheme()\r\n val strokeColor = theme.colorScheme.primary.toString()\r\n\r\n svg {\r\n viewBox = \"25 25 50 50\"\r\n\r\n css {\r\n height = props.height\r\n width = props.width\r\n animation = rotateAnimation\r\n animationIterationCount = infinite\r\n }\r\n\r\n circle {\r\n cx = 50.0\r\n cy = 50.0\r\n r = 20.0\r\n\r\n fill = \"none\"\r\n stroke = strokeColor\r\n strokeWidth = 4.0\r\n strokeLinecap = round\r\n\r\n css {\r\n animation = strokeAnimation\r\n animationIterationCount = infinite\r\n }\r\n }\r\n }\r\n}\r\n\r\nprivate external interface SpinnerComponentProps : Props {\r\n var height: Height\r\n var width: Width\r\n}\r\n\r\nprivate val rotateFrames = keyframes {\r\n to {\r\n transform = rotate(360.deg)\r\n }\r\n}\r\n\r\nprivate val rotateAnimation = Animation(rotateFrames, 2.s, linear)\r\n\r\nprivate val strokeFrames = keyframes {\r\n from {\r\n svgProps {\r\n strokeDasharray = \"1, 200\"\r\n strokeDashoffset = 0\r\n }\r\n }\r\n\r\n 50.pct {\r\n svgProps {\r\n strokeDasharray = \"89, 200\"\r\n strokeDashoffset = -35\r\n }\r\n }\r\n\r\n to {\r\n svgProps {\r\n strokeDasharray = \"89, 200\"\r\n strokeDashoffset = -124\r\n }\r\n }\r\n}\r\n\r\nprivate val strokeAnimation = Animation(strokeFrames, 1.5.s, easeInOut)\r\n\r\nprivate fun Properties.svgProps(block: SVGAttributes.() -> Unit) =\r\n unsafeCast>().block()",null,null,null,null,null,"/*\r\n * Created by abond on 25.07.2023, 22:19\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n * Last modified 25.07.2023, 22:19\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport csstype.PropertiesBuilder\r\nimport emotion.css.ClassName\r\nimport react.useState\r\nimport web.cssom.ClassName\r\n\r\n/**\r\n * Создает тиль css [ClassName].\r\n *\r\n * Пример использования:\r\n *\r\n * val style = style {\r\n * color = Color(\"#FFF\")\r\n * }\r\n */\r\nfun style(builder: PropertiesBuilder.() -> Unit) = ClassName { builder() }\r\n\r\n/**\r\n * Использовать только в том случае, если в стиле используются переменные не доступные за пределами\r\n * компонента, например тема полученная с помощью [useTGTheme]. В противном случае эффективнее хранить\r\n * стиль созданный с помощью [style] в приватной переменной на уровне файла с компонентом.\r\n *\r\n * Создает новый state инициализированный объектом стилей, созданным функцией [builder].\r\n *\r\n * Если параметр [append] true, то применяет стили переданные в [styles] после созданного стиля.\r\n * Если параметр [append] false, то применяет созданный стиль после переданных в [styles].\r\n */\r\nfun useStyle(\r\n vararg styles: ClassName? = emptyArray(),\r\n append: Boolean = true,\r\n builder: PropertiesBuilder.() -> Unit,\r\n): ClassName {\r\n val (style) = useState {\r\n if (append) style(builder).append(styles = styles)\r\n else ClassName(classNames = styles, block = builder)\r\n }\r\n return style\r\n}\r\n\r\n@Suppress(\"unused\")\r\nfun ClassName?.append(builder: PropertiesBuilder.() -> Unit): ClassName =\r\n ClassName(this, block = builder)\r\n\r\nfun ClassName?.append(vararg styles: ClassName?): ClassName = ClassName(this, *styles, block = {})",null,"package ru.totalguide.ui.text\r\n\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML\r\nimport ru.totalguide.ui.append\r\nimport ru.totalguide.ui.applyTextStyle\r\nimport ru.totalguide.ui.style\r\nimport ru.totalguide.ui.useTGTheme\r\nimport web.cssom.ClassName\r\n\r\nfun ChildrenBuilder.h1(text: String, style: ClassName? = null) = H1Component {\r\n this.text = text\r\n this.style = style\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val H1Component = FC(\"H1\") { props ->\r\n val style = style {\r\n applyTextStyle(useTGTheme().typography.heading1)\r\n }.append(props.style)\r\n\r\n ReactHTML.h1 {\r\n className = style\r\n +props.text\r\n }\r\n}\r\n\r\nprivate external interface H1ComponentProps : Props {\r\n var text: String\r\n var style: ClassName?\r\n}","package ru.totalguide.ui.text\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.p\r\nimport ru.totalguide.ui.append\r\nimport ru.totalguide.ui.applyTextStyle\r\nimport ru.totalguide.ui.style\r\nimport ru.totalguide.ui.useTGTheme\r\nimport web.cssom.ClassName\r\n\r\nfun ChildrenBuilder.p(text: String, style: ClassName? = null) = PComponent {\r\n this.text = text\r\n this.style = style\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val PComponent = FC(\"P\") { props ->\r\n val style = style {\r\n applyTextStyle(useTGTheme().typography.paragraph)\r\n }.append(props.style)\r\n\r\n p {\r\n className = style\r\n\r\n +props.text\r\n }\r\n}\r\n\r\nprivate external interface PComponentProps : Props {\r\n var text: String\r\n var style: ClassName?\r\n}","/*\r\n * Created by abond 16.11.2023, 13:58\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui.text\r\n\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.dom.html.ReactHTML.span\r\nimport ru.totalguide.ui.applyTextStyle\r\nimport ru.totalguide.ui.useStyle\r\nimport ru.totalguide.ui.useTGTheme\r\nimport web.cssom.ClassName\r\n\r\nfun ChildrenBuilder.text(text: String, style: ClassName? = null) = TextComponent {\r\n this.text = text\r\n this.style = style\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val TextComponent = FC(\"Text\") { props ->\r\n val theme = useTGTheme()\r\n val style = useStyle(props.style) {\r\n applyTextStyle(theme.typography.paragraph)\r\n }\r\n\r\n span {\r\n className = style\r\n +props.text\r\n }\r\n}\r\n\r\nprivate external interface TextComponentProps : Props {\r\n var text: String\r\n var style: ClassName?\r\n}","/*\r\n * Created by abond 20.10.2023, 19:28\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport kotlinx.browser.document\r\nimport react.ChildrenBuilder\r\nimport react.FC\r\nimport react.Props\r\nimport react.useEffect\r\n\r\nfun ChildrenBuilder.title(value: String) = TitleComponent{\r\n this.value = value\r\n}\r\n\r\nprivate external interface TitleComponentProps: Props {\r\n var value: String\r\n}\r\n\r\n@Suppress(\"PrivatePropertyName\")\r\nprivate val TitleComponent = FC(\"Title\") { props ->\r\n useEffect(props.value) {\r\n document.title = props.value\r\n }\r\n}",null,"/*\r\n * Created by abond 30.10.2023, 14:23\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.ui\r\n\r\nimport react.dom.events.UIEvent\r\nimport react.dom.events.UIEventHandler\r\nimport react.useCallback\r\nimport react.useState\r\nimport web.html.HTMLDivElement\r\n\r\nfun useDistanceToPageBottomCallback(\r\n distanceToBottom: Int = 1000,\r\n callback: () -> Unit,\r\n): UIEventHandler {\r\n val (watcher) = useState(DistanceToPageBottomWatcher(\r\n distanceToBottom = distanceToBottom,\r\n callback = callback\r\n ))\r\n return useCallback(watcher) { event ->\r\n watcher.onScroll(event.toScrollEvent())\r\n }\r\n}\r\n\r\nprivate fun UIEvent.toScrollEvent(): ScrollEvent = with(currentTarget) {\r\n ScrollEvent(\r\n clientHeight = clientHeight,\r\n scrollHeight = scrollHeight,\r\n scrollTop = scrollTop.toInt()\r\n )\r\n}","\npackage ru.totalguide\n\nobject ApplicationProperties {\n const val PROJECT_VERSION = \"0.1.2\"\n}\n","package ru.totalguide.core.data\r\n\r\nimport kotlinx.coroutines.flow.MutableStateFlow\r\nimport kotlinx.coroutines.flow.StateFlow\r\nimport kotlinx.coroutines.flow.asStateFlow\r\nimport ru.totalguide.core.entities.Route\r\nimport ru.totalguide.core.repositories.RouteRepository\r\n\r\nclass InMemoryRouteRepository(private var sights: List = listOf()) : RouteRepository {\r\n private val _currentRoute = MutableStateFlow(Route(sights = sights))\r\n override val currentRoute: StateFlow = _currentRoute.asStateFlow()\r\n\r\n override fun save(route: Route) {\r\n sights = route.sights\r\n _currentRoute.tryEmit(Route(sights = sights))\r\n }\r\n\r\n companion object{\r\n val singleton = InMemoryRouteRepository()\r\n }\r\n}\r\n",null,"package ru.totalguide.core.data\r\n\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.repositories.Page\r\nimport ru.totalguide.core.repositories.SightRepository\r\nimport kotlin.math.min\r\n\r\nclass InMemorySightRepository(\r\n\r\n private val sights: List\r\n\r\n) : SightRepository {\r\n\r\n override suspend fun getAll(): List {\r\n return sights.map(Sight::copy)\r\n }\r\n\r\n override fun get(sightId: String): Sight = sights.find { sight -> sight.id == sightId }!!.copy()\r\n override suspend fun getBySlug(slug: String): Sight = sights.find { sight -> sight.slug == slug }!!.copy()\r\n override suspend fun getPage(page: Int, itemsPerPage: Int): Page {\r\n val startIndex = (page - 1) * itemsPerPage\r\n val endIndex = min(startIndex + itemsPerPage, sights.size)\r\n val items = sights.subList(startIndex, endIndex).map(Sight::copy)\r\n val hasMoreItems = endIndex < sights.size\r\n return Page(items, hasMoreItems)\r\n }\r\n}","/*\r\n * Created by abond 12.09.2023, 12:24\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val archiveTheses = listOf(\r\n Thesis(\r\n \"21\",\r\n \"Основан в 1293 году в ходе третьего шведского крестового похода на Карельскую землю. В то время племя Корела — союзники Великого Новгорода.\"\r\n ),\r\n Thesis(\r\n \"22\",\r\n \"Замок и её донжон, башня святого Олафа — главная достопримечательность и общепризнанный символ Выборга.\"\r\n ),\r\n Thesis(\"23\", \"В главном корпусе замка располагается выборгский краеведческий музей.\"),\r\n Thesis(\r\n \"24\",\r\n \"На территории замка регулярно проводятся концерты, выставки и фестивали, в том числе рыцарские турниры.\"\r\n ),\r\n Thesis(\r\n \"25\",\r\n \"Выборгский замок — один из немногочисленных полностью сохранившихся памятников западноевропейского средневекового военного зодчества.\"\r\n ),\r\n)\r\n\r\ninternal val archiveCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/265/conversions/regional-archive-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/263/conversions/regional-archive-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/201/conversions/regional-archive-2048-1368-p.pjpg\")\r\n )\r\n)\r\n\r\ninternal val archive = Sight(\r\n id = \"5\",\r\n name = \"Областной архив\",\r\n slug = \"archive\",\r\n description = \"Изящное функциональное здание на скале напротив замка\",\r\n covers = archiveCovers,\r\n theses = archiveTheses,\r\n rating = Rating(1500, 500, 1000),\r\n location = Location(60.715347, 28.723940)\r\n)","/*\r\n * Created by abond 12.09.2023, 12:23\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val clockTowerTheses = listOf(\r\n Thesis(\r\n \"11\",\r\n \"Основан в 1293 году в ходе третьего шведского крестового похода на Карельскую землю. В то время племя Корела — союзники Великого Новгорода.\"\r\n ),\r\n Thesis(\r\n \"12\",\r\n \"Замок и её донжон, башня святого Олафа — главная достопримечательность и общепризнанный символ Выборга.\"\r\n ),\r\n Thesis(\"13\", \"В главном корпусе замка располагается выборгский краеведческий музей.\"),\r\n Thesis(\r\n \"14\",\r\n \"На территории замка регулярно проводятся концерты, выставки и фестивали, в том числе рыцарские турниры.\"\r\n ),\r\n Thesis(\r\n \"15\",\r\n \"Выборгский замок — один из немногочисленных полностью сохранившихся памятников западноевропейского средневекового военного зодчества.\"\r\n ),\r\n)\r\n\r\ninternal val clockTowerCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/491/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/492/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/208/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/209/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/210/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/207/conversions/clock-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/206/conversions/clock-tower-2048-1368-p.pjpg\")\r\n )\r\n)\r\n\r\ninternal val clockTower = Sight(\r\n id = \"3\",\r\n name = \"Часовая башня\",\r\n slug = \"clock-tower\",\r\n description = \"Доминанта старого Выборга — часовая башня высотой 25 метров. Построена в XV веке.\",\r\n covers = clockTowerCovers,\r\n theses = clockTowerTheses,\r\n rating = Rating(1000, 500, 500),\r\n location = Location(60.713119, 28.731743)\r\n)","/*\r\n * Created by abond 12.09.2023, 12:24\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val hermitageTheses = listOf(\r\n Thesis(\r\n \"16\",\r\n \"Основан в 1293 году в ходе третьего шведского крестового похода на Карельскую землю. В то время племя Корела — союзники Великого Новгорода.\"\r\n ),\r\n Thesis(\r\n \"17\",\r\n \"Замок и её донжон, башня святого Олафа — главная достопримечательность и общепризнанный символ Выборга.\"\r\n ),\r\n Thesis(\"18\", \"В главном корпусе замка располагается выборгский краеведческий музей.\"),\r\n Thesis(\r\n \"19\",\r\n \"На территории замка регулярно проводятся концерты, выставки и фестивали, в том числе рыцарские турниры.\"\r\n ),\r\n Thesis(\r\n \"20\",\r\n \"Выборгский замок — один из немногочисленных полностью сохранившихся памятников западноевропейского средневекового военного зодчества.\"\r\n ),\r\n)\r\n\r\ninternal val hermitageCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/244/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/245/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/247/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/246/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/249/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/250/conversions/hermitage-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/248/conversions/hermitage-2048-1368-p.pjpg\")\r\n )\r\n)\r\n\r\ninternal val hermitage = Sight(\r\n id = \"4\",\r\n name = \"Эрмитаж\",\r\n slug = \"hermitage\",\r\n description = \"Филиал государственного Эрмитажа в Выборге\",\r\n covers = hermitageCovers,\r\n theses = hermitageTheses,\r\n rating = Rating(1500, 2000, -500),\r\n location = Location(60.708605, 28.737303)\r\n)","/*\r\n * Created by abond 12.09.2023, 12:20\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val roundTowerTheses = listOf(\r\n Thesis(\r\n \"6\",\r\n \"Основан в 1293 году в ходе третьего шведского крестового похода на Карельскую землю. В то время племя Корела — союзники Великого Новгорода.\"\r\n ),\r\n Thesis(\r\n \"7\",\r\n \"Замок и её донжон, башня святого Олафа — главная достопримечательность и общепризнанный символ Выборга.\"\r\n ),\r\n Thesis(\"8\", \"В главном корпусе замка располагается выборгский краеведческий музей.\"),\r\n Thesis(\r\n \"9\",\r\n \"На территории замка регулярно проводятся концерты, выставки и фестивали, в том числе рыцарские турниры.\"\r\n ),\r\n Thesis(\r\n \"10\",\r\n \"Выборгский замок — один из немногочисленных полностью сохранившихся памятников западноевропейского средневекового военного зодчества.\"\r\n ),\r\n)\r\n\r\ninternal val roundTowerCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/196/conversions/round-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/195/conversions/round-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/197/conversions/round-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/198/conversions/round-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/27/conversions/round-tower-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/28/conversions/round-tower-2048-1368-p.pjpg\")\r\n )\r\n)\r\n\r\ninternal val roundTower = Sight(\r\n id = \"2\",\r\n name = \"Круглая башня\",\r\n slug = \"round-tower\",\r\n description = \"Боевая башня, также бывшая складом, арсеналом, тюрьмой и рестораном\",\r\n covers = roundTowerCovers,\r\n theses = roundTowerTheses,\r\n rating = Rating(likesCount = 2000, dislikesCount = 500, rating = 1500),\r\n location = Location(latitude = 60.712968, longitude = 28.737380),\r\n)","/*\r\n * Created by abond 12.09.2023, 11:31\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val vyborgCastleTheses = listOf(\r\n Thesis(\r\n \"1\",\r\n \"Основан в 1293 году в ходе третьего шведского крестового похода на Карельскую землю. В то время племя Корела — союзники Великого Новгорода.\"\r\n ),\r\n Thesis(\r\n \"2\",\r\n \"Замок и её донжон, башня святого Олафа — главная достопримечательность и общепризнанный символ Выборга.\"\r\n ),\r\n Thesis(\"3\", \"В главном корпусе замка располагается выборгский краеведческий музей.\"),\r\n Thesis(\r\n \"4\",\r\n \"На территории замка регулярно проводятся концерты, выставки и фестивали, в том числе рыцарские турниры.\"\r\n ),\r\n Thesis(\r\n \"5\",\r\n \"Выборгский замок — один из немногочисленных полностью сохранившихся памятников западноевропейского средневекового военного зодчества.\"\r\n ),\r\n)\r\n\r\ninternal val vyborgCastleCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/151/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/280/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/285/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/279/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/281/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/284/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/286/conversions/vyborg-castle-2048-1368-p.pjpg\")\r\n )\r\n)\r\n\r\ninternal val vyborgCastle = Sight(\r\n id = \"1\",\r\n name = \"Выборгский замок\",\r\n slug = \"vyborg-castle\",\r\n description = \"Главная достопримечательность Выборга. Донжон замка башня Святого Олафа — символ города.\",\r\n covers = vyborgCastleCovers,\r\n theses = vyborgCastleTheses,\r\n rating = Rating(1500, 500, 1000),\r\n location = Location(60.715659, 28.729041),\r\n)","/*\r\n * Created by abond 12.09.2023, 12:24\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.data.content\r\n\r\nimport ru.totalguide.core.entities.Image\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\ninternal val walkFameTheses = listOf(\r\n Thesis(\r\n id = \"01HA73Z43TMS0PBCM99PC0QC3F\",\r\n text = \"Небольшая аллея с именными гранитными плитами и отпечатками ладоней звезд киноиндустрии.\"\r\n ),\r\n Thesis(\r\n id = \"01HA73ZBX3R1EGCZ7RFT9NEM4D\",\r\n text = \"Отпечатками ладоней сопровождаются плиты, которые установлены прижизненно. Первыми отпечатки ладоней оставили Вячеслав Тихонов, Георгий Жженов, Алексей Петенко и Никита Михалков, Станислав Ростоцкий.\"\r\n ),\r\n Thesis(\r\n id = \"01HA73ZPBE5HNY2BSQY7WD7DHB\",\r\n text = \"Аллея находится в южной части Театральной площади, напротив здания кинотеатра «Выборг Палас». В «Выборг Паласе» с 1993 года ежегодно проводится кинофестиваль «Окно в Европу».\"\r\n ),\r\n Thesis(\r\n id = \"01HA73ZX2MR9AG1Y947K0JYS87\",\r\n text = \"Решение об увековечении имён на аллее принимают организаторы кинофестиваля «Окно в Европу».\"\r\n ),\r\n Thesis(\r\n id = \"01HA7404AB069E4J4YYJRP08NP\",\r\n text = \"Аллея основана в 1998 году. Это один из трёх «звёздных бульваров» в России, созданных по подобию голливудской «Аллеи славы». Выборг выбран как город с большой фильмографией.\"\r\n ),\r\n Thesis(\r\n id = \"01HA76SQ4A5Z3NZZYX6TMJT4ME\",\r\n text = \"Изначально плиты располагались в один ряд. В два ряда плиты стали располагаться после реконструкции 2014 года.\"\r\n ),\r\n Thesis(\r\n id = \"01HA76TT51V299DEEST9NTKKYP\",\r\n text = \"На одной из плит изображён драккар — эмблема кинофестиваля «Окно в Европу». Два полноразмерных драккара находятся на набережной возле гостинцы «Дружба» — это копии оригинальных кораблей, которые использовались при съёмках фильма «И на камнях растут деревья» режиссёра Станислава Ростоцкого.\"\r\n ),\r\n)\r\n\r\ninternal val walkFameCovers = listOf(\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\r\n \"800w\" to \"https://totalguide.ru/media/137/conversions/walk-fame-2048-1368-p.pjpg\",\r\n \"2000w\" to \"https://totalguide.ru/media/137/conversions/walk-fame-2048-1368-p.pjpg\",\r\n \"4000w\" to \"https://totalguide.ru/media/137/conversions/walk-fame-2048-1368-p.pjpg\",\r\n )\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\r\n \"800w\" to \"https://totalguide.ru/media/136/conversions/walk-fame-2048-1368-p.pjpg\",\r\n \"2000w\" to \"https://totalguide.ru/media/136/conversions/walk-fame-2048-1368-p.pjpg\",\r\n \"4000w\" to \"https://totalguide.ru/media/136/conversions/walk-fame-2048-1368-p.pjpg\",\r\n )\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/139/conversions/walk-fame-2048-1368-p.pjpg\")\r\n ),\r\n Image(\r\n id = \"\",\r\n variants = mapOf(\"4000w\" to \"https://totalguide.ru/media/138/conversions/walk-fame-2048-1368-p.pjpg\")\r\n ),\r\n)\r\n\r\ninternal val walkFame = Sight(\r\n id = \"01HA73TT9TDE6NWYXEWX1A3KHQ\",\r\n name = \"Аллея актёрской славы\",\r\n slug = \"walk-fame\",\r\n description = \"Небольшая аллея с именными гранитными плитами и отпечатками ладоней звезд киноиндустрии.\",\r\n covers = walkFameCovers,\r\n theses = walkFameTheses,\r\n rating = Rating(likesCount = 0, dislikesCount = 0, rating = 0),\r\n location = Location(latitude = 60.71135196354624, longitude = 28.737561480757932)\r\n)","/*\r\n * Created by abond 28.09.2023, 16:50\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.entities\r\n\r\ndata class Image(\r\n val id: String,\r\n val variants: Map,\r\n)","/*\r\n * Created by abond\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.entities\r\n\r\ndata class Location(\r\n val latitude: Double,\r\n val longitude: Double,\r\n)","/*\r\n * Created by abond 12.09.2023, 09:41\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.entities\r\n\r\ndata class Rating (\r\n val likesCount: Long,\r\n val dislikesCount: Long,\r\n val rating: Long,\r\n)","package ru.totalguide.core.entities\r\n\r\ndata class Route (\r\n val id: String = \"\",\r\n val sights: List = listOf()\r\n) {\r\n fun contains(sightId: String): Boolean = sights.contains(sightId)\r\n}\r\n","package ru.totalguide.core.entities\r\n\r\ndata class Sight(\r\n val id: String = \"\",\r\n val name: String,\r\n val slug: String,\r\n val description: String,\r\n val covers: List,\r\n val theses: List,\r\n val rating: Rating,\r\n val location: Location,\r\n)","/*\r\n * Created by abond 12.09.2023, 10:42\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.entities\r\n\r\ndata class Thesis(\r\n val id: String,\r\n val text: String,\r\n)\r\n\r\nfun List.asTexts() = map { it.text }","/*\r\n * Created by abond 09.10.2023, 14:21\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport kotlinx.serialization.Serializable\r\nimport ru.totalguide.core.entities.Image\r\n\r\n@Serializable\r\ndata class ImageDTO(\r\n val id: String,\r\n val variants: Map,\r\n)\r\n\r\nfun ImageDTO.toEntity(): Image = Image(id, variants)\r\n\r\nfun List.toEntities(): List = map(ImageDTO::toEntity)\r\n\r\nfun Image.toDTO(): ImageDTO = ImageDTO(id, variants)\r\n\r\nfun List.toDTOs(): List = map(Image::toDTO)","/*\r\n * Created by abond 22.09.2023, 07:54\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport io.ktor.client.*\r\nimport io.ktor.client.call.*\r\nimport io.ktor.client.engine.*\r\nimport io.ktor.client.plugins.contentnegotiation.*\r\nimport io.ktor.client.request.*\r\nimport io.ktor.http.*\r\nimport io.ktor.serialization.kotlinx.json.*\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.repositories.NotFoundException\r\nimport ru.totalguide.core.repositories.Page\r\n\r\nprivate const val PLACES = \"places\" //todo: получать значение из одного источника с :backend-api\r\n\r\nprivate class KtorApiClient(\r\n private val baseUrl: Url,\r\n engine: HttpClientEngine,\r\n) : ApiClient {\r\n private val client = HttpClient(engine) {\r\n install(ContentNegotiation) {\r\n json()\r\n }\r\n }\r\n\r\n private val sightsUrl = URLBuilder(baseUrl)\r\n .appendPathSegments(PLACES)\r\n .build()\r\n\r\n private fun createSightUrl(slug: String) = URLBuilder(baseUrl)\r\n .appendPathSegments(PLACES)\r\n .appendPathSegments(slug)\r\n .build()\r\n\r\n override suspend fun getSight(slug: String): Sight {\r\n return client.getSight(slug).toSight()\r\n }\r\n\r\n override suspend fun getAllSights(): List = client.getAllSights().toSights()\r\n\r\n override suspend fun getSights(page: Int, itemsByPage: Int): Page {\r\n return client.get(sightsUrl) {\r\n parameter(\"page\", page.toString())\r\n parameter(\"limit\", itemsByPage.toString())\r\n }.body>().toEntity()\r\n }\r\n\r\n private suspend fun HttpClient.getAllSights(): List = get(sightsUrl).body()\r\n\r\n private suspend fun HttpClient.getSight(slug: String): SightDTO {\r\n val response = get(createSightUrl(slug))\r\n when (response.status) {\r\n HttpStatusCode.NotFound -> throw NotFoundException(response.body().message)\r\n HttpStatusCode.OK -> return response.body()\r\n else -> throw Exception(\"OOOps!\")\r\n }\r\n }\r\n}\r\n\r\nfun ktorApiClient(\r\n baseUrl: Url = localhost,\r\n engine: HttpClientEngine,\r\n): ApiClient = KtorApiClient(baseUrl, engine)\r\n\r\nprivate val localhost = URLBuilder(\r\n protocol = URLProtocol.HTTPS,\r\n host = \"localhost\",\r\n port = 8080,\r\n).build()","/*\r\n * Created by abond 28.12.2023, 14:44\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport kotlinx.serialization.Serializable\r\nimport ru.totalguide.core.repositories.NotFoundException\r\n\r\n\r\n@Serializable\r\ndata class NotFoundError(val message: String)\r\n\r\nfun NotFoundException.toError() = NotFoundError(message ?: \"\")","/*\r\n * Created by abond 25.10.2023, 10:25\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport kotlinx.serialization.Serializable\r\n\r\n@Serializable\r\ndata class PageDTO(\r\n val items: List,\r\n val hasMoreItems: Boolean,\r\n)","/*\r\n * Created by abond 20.09.2023, 15:13\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.repositories.Page\r\nimport ru.totalguide.core.repositories.SightRepository\r\n\r\nclass RemoteSightRepository(private val apiClient: ApiClient): SightRepository {\r\n\r\n override suspend fun getAll(): List = apiClient.getAllSights()\r\n\r\n override fun get(sightId: String): Sight {\r\n TODO(\"Not yet implemented\")\r\n }\r\n\r\n override suspend fun getBySlug(slug: String): Sight = apiClient.getSight(slug)\r\n\r\n override suspend fun getPage(page: Int, itemsPerPage: Int): Page =\r\n apiClient.getSights(page, itemsPerPage)\r\n}","/*\r\n * Created by abond 19.09.2023, 14:06\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport kotlinx.serialization.Serializable\r\nimport kotlinx.serialization.encodeToString\r\nimport kotlinx.serialization.json.Json\r\nimport ru.totalguide.core.entities.Location\r\nimport ru.totalguide.core.entities.Rating\r\nimport ru.totalguide.core.entities.Sight\r\nimport ru.totalguide.core.repositories.Page\r\n\r\n@Serializable\r\ndata class SightDTO(\r\n val id: String,\r\n val slug: String,\r\n val name: String,\r\n val description: String,\r\n val covers: List,\r\n val theses: List,\r\n val likesCount: Long,\r\n val dislikesCount: Long,\r\n val rating: Long,\r\n val latitude: Double,\r\n val longitude: Double,\r\n)\r\n\r\nfun List.toJsonString(): String = Json.encodeToString(this)\r\nfun SightDTO.toJsonString(): String = Json.encodeToString(this)\r\n\r\nfun SightDTO.Companion.fromJsonString(jsonString: String): List =\r\n Json.decodeFromString(jsonString)\r\n\r\nfun SightDTO.toSight(): Sight = Sight(\r\n id = id,\r\n name = name,\r\n slug = slug,\r\n description = description,\r\n covers = covers.toEntities(),\r\n theses = theses.toEntities(),\r\n rating = Rating(likesCount = likesCount, dislikesCount = dislikesCount, rating = rating),\r\n location = Location(latitude = latitude, longitude = longitude)\r\n)\r\n\r\nfun List.toSights(): List = map(SightDTO::toSight)\r\n\r\nfun Sight.toDTO(): SightDTO = SightDTO(\r\n id = id,\r\n name = name,\r\n slug = slug,\r\n description = description,\r\n covers = covers.toDTOs(),\r\n theses = theses.toDTOs(),\r\n likesCount = rating.likesCount,\r\n dislikesCount = rating.dislikesCount,\r\n rating = rating.rating,\r\n latitude = location.latitude,\r\n longitude = location.longitude\r\n)\r\n\r\nfun List.toDTOs(): List = map(Sight::toDTO)\r\n\r\nfun Page.toDTO(): PageDTO {\r\n return PageDTO(items = items.toDTOs(), hasMoreItems = this.hasMoreItems)\r\n}\r\n\r\nfun PageDTO.toEntity(): Page = Page(items = items.toSights(), hasMoreItems = this.hasMoreItems)","/*\r\n * Created by abond 22.09.2023, 10:28\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.network\r\n\r\nimport kotlinx.serialization.Serializable\r\nimport kotlinx.serialization.encodeToString\r\nimport kotlinx.serialization.json.Json\r\nimport ru.totalguide.core.entities.Thesis\r\n\r\n@Serializable\r\ndata class ThesisDTO(\r\n val id: String,\r\n val text: String,\r\n)\r\n\r\nfun List.toJsonString(): String = Json.encodeToString(this)\r\n\r\nfun ThesisDTO.Companion.fromJsonString(jsonString: String): List = Json.decodeFromString(jsonString)\r\n\r\nfun ThesisDTO.toEntity(): Thesis = Thesis(id, text)\r\n\r\nfun List.toEntities(): List = map(ThesisDTO::toEntity)\r\n\r\nfun Thesis.toDTO(): ThesisDTO = ThesisDTO(id, text)\r\n\r\nfun List.toDTOs(): List = map(Thesis::toDTO)","/*\r\n * Created by abond 28.12.2023, 14:07\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.repositories\r\n\r\nclass NotFoundException(message: String, cause: Throwable? = null) : Exception(message, cause)\r\n","/*\r\n * Created by abond 25.10.2023, 09:47\r\n * Copyright (c) 2023 TotalGuide. All rights reserved.\r\n */\r\n\r\npackage ru.totalguide.core.repositories\r\n\r\ndata class Page(\r\n val items: List,\r\n val hasMoreItems: Boolean,\r\n)",null,"package ru.totalguide.core.data.content\r\n\r\nval sights = listOf(\r\n walkFame,\r\n vyborgCastle,\r\n roundTower,\r\n clockTower,\r\n hermitage,\r\n archive,\r\n)"],"names":["root","factory","exports","module","define","amd","this","repository","sightId","GeoLocationServiceImpl","Location","","YandexGoService","YandexMapsService","id","name","description","covers","theses","isAddedToRoute","likesCount","dislikesCount","rating","location","$this$launch","$completion","refreshViewState","addSightToRoute","removeSightFromRoute","sightSlug","navigator","sightRepository","routeRepository","presenter","scope","ControllerBase","SightDetailsQuery","SightDetailsEvent","mapsService","taxiService","geoLocationService","details","title","showOnMapUrl","routeUrl","callTaxiUrl","value","createViewState","refresh","loadFirstPage","isPageLoading","loadNextPage","$sightId","pager","sightPreviews","hasMore","SightListEvent","","userCurrentLocation","ViewableSightPreview","toViewables","toString","toPreview","SightPreview","pageNumber","itemsPerPage","slug","detailsUrl","sights","hasMoreItems","isNextPageLoading","","emitNewState","newPage","SightListData","updateQueryParams","QueryParam","query","initialPage","history","IdleHistory","MutableStateFlow","emptyList","asStateFlow","$this$FC","$this$invoke","theme","globalStyles","appNavigationHost","it","lightTheme","FC","path","redirectTo","$redirectTo","loader","redirectDocument","builder","$builder","element","create","useParams","navigate","router","$this$route","params","$slug","sightDetailsView","createBrowserRouter","window","hostname","ktorApiClient","URLBuilder","RemoteSightRepository","apiClient","useState","SightDetailsController","InMemorySightRepository","SightDetailsPresenterImpl","yandexMapsService","yandexGoService","CoroutineScope","sightDetailsController","AppNavigator","useNavigate","useMainScope","state","$state","$theme","$this$null","metaDescription","text","h1","style","heading","$details","marginLeft","marginRight","backgroundColor","borderBottom","marginBottom","placeholder","image","slider","placeActions","$theses","$this$column","thesis","yandexContentLoaded","column","useTGTheme","p","$this$style","padding","paddingTop","paddingBottom","props","$controller","controller","useSightDetailsController","collectViewState","useEffect","$this$useEffect","content","commonScreenTemplate","$this$commonScreenTemplate","header","footer","height","justifyContent","alignItems","spinner","display","useSearchParams","toIntOrNull","HistoryImpl","SightListPresenterImpl","SightListController","SightsPager","SightListQuery","sightListController","onLoadMore","contentBuilder","$scrollListener","$contentBuilder","$onLoadMore","useDistanceToPageBottomCallback","onScroll","onPlaceClick","places","$places","$onPlaceClick","gap","gridTemplateColumns","place","placeCard","row","pageLoading","placesList","$placeClickCallback","useSightListController","loadMoreCallback","placeSlug","ShowSightDetails","placeClickCallback","infiniteScrollLayout","$this$infiniteScrollLayout","$place","$this$row","currentRoute","newRoute","from","to","trackingId","getTrackingId","zoom","result","other","currentState","AddSightToRouteCommand","RemoveSightFromRouteCommand","event","data","DisplaySightDetailsViewState","ViewableSightDetails","Result","sight","SightDetails","asTexts","showSightDetails","showRouteEditor","DisplaySightListViewState","toViewableSightPreview","toViewableSightPreviews","page","toPreviews","loadPage","replace","updateUrl","searchParams","set","toURLSearchParams","replaceState","document","runApplication","","receiver","$block","lazy","src","srcSet","last","ViewableImage","joinToString","$setListVewState","categoriesListVewState","primary","onPrimary","primaryLight","onPrimaryLight","primaryDark","onPrimaryDark","primaryPale","onPrimaryPale","success","onSuccess","successLight","onSuccessLight","successDark","onSuccessDark","successPale","onSuccessPale","white","onWhite","whiteLight","onWhiteLight","whiteDark","onWhiteDark","whitePale","onWhitePale","error","onError","errorLight","onErrorLight","errorDark","onErrorDark","errorPale","onErrorPale","background","onBackground","textBasic","textHeading","textMuted","hexAlpha","hues","dark","light","medium","pale","HuesInstance","distanceToBottom","callback","MAX_VALUE","clientHeight","scrollHeight","scrollTop","rootComponent","useTheme","colorScheme","ColorScheme","Typography","headingStyle","color","TextStyle","paragraphStyle","supheadingStyle","mobileTypography","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textTransform","buttonText","heading1","heading2","heading3","heading4","heading5","heading6","hero","hint","paragraph","supheading","MainScope","className","$style","useStyle","$this$useStyle","borderTop","href","target","$href","$text","$target","textLink","rowGap","logo","$path","width","viewBox","fill","xmlns","d","fillRule","clipRule","x1","y1","x2","y2","gradientUnits","stopColor","offset","memo","onClick","$onClick","$src","$srcSet","$props","append","aspectRatio","$content","$overridableDefaultStyles","$userProvidedStyles","userProvidedStyles","children","icon","isActive","$icon","$isActive","$overridableStyles","columnGap","stopPropagation","disabled","url","$url","createRouteUrl","$createRouteUrl","$callTaxiUrl","$showOnMapUrl","locationActionButton","LocationActionButtonComponent$lambda$lambda$lambda","applyTextStyle","textDecoration","attributes","getNamedItem","findDescription","asList","getElementsByTagName","findMetaElements","findMetaDescription","head","appendElement","addMetaDescription","getOrCreateMetaDescription","setAttribute","$this$appendElement","$likesCount","$rating","$dislikesCount","$routeUrl","$currentActions","$setCurrentActions","currentActions","setCurrentActions","PlaceActionsComponent$lambda$lambda$lambda","miniTabButton","PlaceActionsComponent$lambda$lambda$lambda$lambda","locationActions","$name","$detailsUrl","$description","$titleStyle","linkedTitle","borderRadius","boxShadow","overflow","$this$image","cursor","preventDefault","$textStyle","likeButton","toInt","images","$images","$context","$setCurrentSlideIndex","context","useContext","CarouselContext","currentSlide","currentSlideIndex","setCurrentSlideIndex","subscribe","unsubscribe","importStyles","infinite","naturalSlideWidth","naturalSlideHeight","totalSlides","Slider","slides","dots","slides$lambda","Image","slides$lambda$lambda","$selectedIndex","selectedIndex","useCurrentSlideIndex","bottom","left","border","alpha","dotStyle","block","$strokeColor","animation","animationIterationCount","cx","cy","r","stroke","strokeWidth","strokeLinecap","$this$to","transform","$this$from","svgProps","$this$svgProps","strokeDasharray","strokeDashoffset","styles","$append","$styles","viewState","launch","wasLineCrossed","render","topBar","$topBar","$footer","$scope","listVewState","setListVewState","$collectJob","collectJob","$value","key","$key","$covers","body","appendChild","ReactApplication","createRoot","$height","$width","toViewable","$watcher","watcher","DistanceToPageBottomWatcher","ScrollEvent","InMemoryRouteRepository","Route","listOf","Thesis","mapOf","Sight","Rating","variants","latitude","longitude","seen1","serializationConstructorMarker","$this$HttpClient","$this$install","json","itemsByPage","baseUrl","engine","HttpClient","appendPathSegments","message","typeSerial0","items","toEntities","Page","toSights","cause","route","startIndex","endIndex","decoder","encoder","toSight","parameter","createSightUrl","NotFoundException","typeParamsSerializers","KtorApiClient"],"sourceRoot":""}