@loafmarkets/ui 0.1.213 → 0.1.215

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -8557,7 +8557,7 @@ function PropertyOverview({
8557
8557
  { label: "Location", value: location || "\u2014" }
8558
8558
  ];
8559
8559
  const vol24hDollar = volume24h != null && tokenPriceValue ? volume24h * tokenPriceValue : null;
8560
- const holdRatio = (() => {
8560
+ (() => {
8561
8561
  if (!tokenMarketCap || tokenMarketCap <= 0 || vol24hDollar == null) return null;
8562
8562
  const turnover = vol24hDollar / (tokenMarketCap / 2);
8563
8563
  const holdPct = Math.max(0, Math.min(100, (1 - turnover) * 100));
@@ -8631,40 +8631,32 @@ function PropertyOverview({
8631
8631
  ] }),
8632
8632
  /* @__PURE__ */ jsxs(Section, { children: [
8633
8633
  /* @__PURE__ */ jsx(SectionHeader, { children: "Statistics" }),
8634
- /* @__PURE__ */ jsxs(StatsTabbedCard, { children: [
8635
- /* @__PURE__ */ jsxs(StatsTabBar, { children: [
8636
- /* @__PURE__ */ jsx(StatsTab, { $active: statsTab === "token", onClick: () => setStatsTab("token"), children: "Token Performance" }),
8637
- /* @__PURE__ */ jsx(StatsTab, { $active: statsTab === "property", onClick: () => setStatsTab("property"), children: "Property Fundamentals" })
8634
+ /* @__PURE__ */ jsxs(StatsDesktop, { children: [
8635
+ /* @__PURE__ */ jsxs(StatsRowSection, { children: [
8636
+ /* @__PURE__ */ jsx(StatsRowLabel, { children: "Token Performance" }),
8637
+ /* @__PURE__ */ jsx(StatsHRow, { children: tokenStats.map((item) => /* @__PURE__ */ jsxs(StatsHCell, { children: [
8638
+ /* @__PURE__ */ jsx(StatsHCellLabel, { children: item.label }),
8639
+ item.label === "Holders" && holderCount != null ? /* @__PURE__ */ jsx(StatValueClickable, { onClick: () => setShowHolders(true), children: item.value }) : /* @__PURE__ */ jsx(StatsHCellValue, { $gold: !!item.gold, children: item.value })
8640
+ ] }, item.label)) })
8638
8641
  ] }),
8639
- statsTab === "token" && /* @__PURE__ */ jsxs(StatsTabContent, { children: [
8640
- tokenStats.map((item) => /* @__PURE__ */ jsxs(StatRow, { $gold: !!item.gold, children: [
8641
- /* @__PURE__ */ jsx(StatLabel, { children: item.label }),
8642
- item.label === "Holders" && holderCount != null ? /* @__PURE__ */ jsx(StatValueClickable, { onClick: () => setShowHolders(true), children: item.value }) : /* @__PURE__ */ jsx(StatValue, { $gold: !!item.gold, children: item.value })
8643
- ] }, item.label)),
8644
- holdRatio && /* @__PURE__ */ jsxs(HoldRatioWrap, { children: [
8645
- /* @__PURE__ */ jsxs(HoldRatioTitle, { children: [
8646
- /* @__PURE__ */ jsx(HoldRatioTitleText, { children: "Holding Ratio" }),
8647
- /* @__PURE__ */ jsx(HoldRatioInfo, { "data-tip": "Proportion of token holders vs active traders over the last 24 hours, measured by trading volume against market capitalisation.", children: "?" })
8648
- ] }),
8649
- /* @__PURE__ */ jsxs(HoldRatioHeader, { children: [
8650
- /* @__PURE__ */ jsxs("div", { children: [
8651
- /* @__PURE__ */ jsx(HoldRatioLabel, { $side: "hold", children: "Holding " }),
8652
- /* @__PURE__ */ jsxs(HoldRatioValue, { $side: "hold", children: [
8653
- holdRatio.holdPct.toFixed(1),
8654
- "%"
8655
- ] })
8656
- ] }),
8657
- /* @__PURE__ */ jsxs("div", { children: [
8658
- /* @__PURE__ */ jsxs(HoldRatioValue, { $side: "trade", children: [
8659
- holdRatio.tradePct,
8660
- "%"
8661
- ] }),
8662
- /* @__PURE__ */ jsx(HoldRatioLabel, { $side: "trade", children: " Trading" })
8663
- ] })
8664
- ] }),
8665
- /* @__PURE__ */ jsx(HoldRatioTrack, { children: /* @__PURE__ */ jsx(HoldRatioFill, { $pct: holdRatio.holdPct }) })
8666
- ] })
8642
+ /* @__PURE__ */ jsxs(StatsRowSection, { children: [
8643
+ /* @__PURE__ */ jsx(StatsRowLabel, { children: "Property Fundamentals" }),
8644
+ /* @__PURE__ */ jsx(StatsHRow, { children: propertyStats.map((item) => /* @__PURE__ */ jsxs(StatsHCell, { children: [
8645
+ /* @__PURE__ */ jsx(StatsHCellLabel, { children: item.label }),
8646
+ /* @__PURE__ */ jsx(StatsHCellValue, { children: item.value })
8647
+ ] }, item.label)) }),
8648
+ /* @__PURE__ */ jsx(DividendHistoryBtn, { onClick: () => setShowDividendHistory(true), children: "See Dividend History \u2192" })
8649
+ ] })
8650
+ ] }),
8651
+ /* @__PURE__ */ jsx(StatsMobile, { children: /* @__PURE__ */ jsxs(StatsTabbedCard, { children: [
8652
+ /* @__PURE__ */ jsxs(StatsTabBar, { children: [
8653
+ /* @__PURE__ */ jsx(StatsTab, { $active: statsTab === "token", onClick: () => setStatsTab("token"), children: "Token" }),
8654
+ /* @__PURE__ */ jsx(StatsTab, { $active: statsTab === "property", onClick: () => setStatsTab("property"), children: "Property" })
8667
8655
  ] }),
8656
+ statsTab === "token" && /* @__PURE__ */ jsx(StatsTabContent, { children: tokenStats.map((item) => /* @__PURE__ */ jsxs(StatRow, { $gold: !!item.gold, children: [
8657
+ /* @__PURE__ */ jsx(StatLabel, { children: item.label }),
8658
+ item.label === "Holders" && holderCount != null ? /* @__PURE__ */ jsx(StatValueClickable, { onClick: () => setShowHolders(true), children: item.value }) : /* @__PURE__ */ jsx(StatValue, { $gold: !!item.gold, children: item.value })
8659
+ ] }, item.label)) }),
8668
8660
  statsTab === "property" && /* @__PURE__ */ jsxs(StatsTabContent, { children: [
8669
8661
  propertyStats.map((item) => /* @__PURE__ */ jsxs(StatRow, { children: [
8670
8662
  /* @__PURE__ */ jsx(StatLabel, { children: item.label }),
@@ -8672,7 +8664,7 @@ function PropertyOverview({
8672
8664
  ] }, item.label)),
8673
8665
  /* @__PURE__ */ jsx(DividendHistoryBtn, { onClick: () => setShowDividendHistory(true), children: "See Dividend History \u2192" })
8674
8666
  ] })
8675
- ] })
8667
+ ] }) })
8676
8668
  ] }),
8677
8669
  showDividendHistory && /* @__PURE__ */ jsx(
8678
8670
  DividendHistoryPopup,
@@ -8693,37 +8685,39 @@ function PropertyOverview({
8693
8685
  onClose: () => setShowHolders(false)
8694
8686
  }
8695
8687
  ),
8696
- galleryImages.length > 0 && /* @__PURE__ */ jsx(GalleryBreakout, { children: /* @__PURE__ */ jsx(
8697
- GalleryMapSection,
8698
- {
8699
- images: galleryImages.map((img) => ({ src: img.imageUrl, title: img.title, subtitle: img.subtitle })),
8700
- categories: galleryCategories2,
8701
- propertyLocation: location,
8702
- videoUrl,
8703
- tokenName,
8704
- onPhotoClick: onPhotosClick
8705
- }
8706
- ) }),
8707
8688
  /* @__PURE__ */ jsxs(Section, { children: [
8708
- /* @__PURE__ */ jsx(SectionHeader, { children: "Investment Profile" }),
8709
- /* @__PURE__ */ jsxs(InvestmentNarrativesRow, { children: [
8710
- /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8711
- /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { d: "M22 12h-4l-3 9L9 3l-3 9H2" }) }) }),
8712
- /* @__PURE__ */ jsx(NarrativeTitle, { children: "Generational Compounding" }),
8713
- /* @__PURE__ */ jsx(NarrativeDesc, { children: "Acquired in 1976 for \xA340,000, compounded through every market cycle to a current valuation exceeding A$20M." })
8714
- ] }),
8715
- /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8716
- /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" }) }) }),
8717
- /* @__PURE__ */ jsx(NarrativeTitle, { children: "Permanent Scarcity" }),
8718
- /* @__PURE__ */ jsx(NarrativeDesc, { children: "Heritage harbour-front estates in Mosman cannot be replicated. Sustained global demand into this safe-haven supports long-term price growth." })
8719
- ] }),
8720
- /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8721
- /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
8722
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
8723
- /* @__PURE__ */ jsx("path", { d: "M12 6v6l4 2" })
8724
- ] }) }),
8725
- /* @__PURE__ */ jsx(NarrativeTitle, { children: "Liquidity Premium" }),
8726
- /* @__PURE__ */ jsx(NarrativeDesc, { children: "Listed assets historically trade at a 20\u201330% premium to unlisted counterparts. First individual property admitted to a continuously traded market." })
8689
+ /* @__PURE__ */ jsx(SectionHeader, { children: "The Asset" }),
8690
+ galleryImages.length > 0 && /* @__PURE__ */ jsxs(AssetBentoGrid, { children: [
8691
+ /* @__PURE__ */ jsx(AssetBentoGallery, { children: /* @__PURE__ */ jsx(
8692
+ GalleryMapSection,
8693
+ {
8694
+ images: galleryImages.map((img) => ({ src: img.imageUrl, title: img.title, subtitle: img.subtitle })),
8695
+ categories: galleryCategories2,
8696
+ propertyLocation: location,
8697
+ videoUrl,
8698
+ tokenName,
8699
+ onPhotoClick: onPhotosClick
8700
+ }
8701
+ ) }),
8702
+ /* @__PURE__ */ jsxs(AssetBentoNarratives, { children: [
8703
+ /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8704
+ /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { d: "M22 12h-4l-3 9L9 3l-3 9H2" }) }) }),
8705
+ /* @__PURE__ */ jsx(NarrativeTitle, { children: "Generational Compounding" }),
8706
+ /* @__PURE__ */ jsx(NarrativeDesc, { children: "Acquired in 1976 for \xA340,000, compounded through every market cycle to a current valuation exceeding A$20M." })
8707
+ ] }),
8708
+ /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8709
+ /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" }) }) }),
8710
+ /* @__PURE__ */ jsx(NarrativeTitle, { children: "Permanent Scarcity" }),
8711
+ /* @__PURE__ */ jsx(NarrativeDesc, { children: "Heritage harbour-front estates in Mosman cannot be replicated. Sustained global demand supports long-term price growth." })
8712
+ ] }),
8713
+ /* @__PURE__ */ jsxs(NarrativeCard, { children: [
8714
+ /* @__PURE__ */ jsx(NarrativeIcon, { children: /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
8715
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
8716
+ /* @__PURE__ */ jsx("path", { d: "M12 6v6l4 2" })
8717
+ ] }) }),
8718
+ /* @__PURE__ */ jsx(NarrativeTitle, { children: "Liquidity Premium" }),
8719
+ /* @__PURE__ */ jsx(NarrativeDesc, { children: "Listed assets historically trade at a 20\u201330% premium to unlisted counterparts. First individual property admitted to a continuously traded market." })
8720
+ ] })
8727
8721
  ] })
8728
8722
  ] }),
8729
8723
  /* @__PURE__ */ jsxs(StatsGrid, { children: [
@@ -9142,7 +9136,24 @@ var Wrapper = styled9.div`
9142
9136
  flex-direction: column;
9143
9137
  gap: 1.5rem;
9144
9138
  `;
9145
- var GalleryBreakout = styled9.div`
9139
+ var AssetBentoGrid = styled9.div`
9140
+ display: flex;
9141
+ flex-direction: column;
9142
+ gap: 0.75rem;
9143
+ margin-bottom: 1.25rem;
9144
+ `;
9145
+ var AssetBentoGallery = styled9.div`
9146
+ border-radius: 12px;
9147
+ overflow: hidden;
9148
+ border: 1px solid rgba(255,255,255,0.06);
9149
+ `;
9150
+ var AssetBentoNarratives = styled9.div`
9151
+ display: grid;
9152
+ grid-template-columns: repeat(3, 1fr);
9153
+ gap: 0.75rem;
9154
+ @media (max-width: 768px) { grid-template-columns: 1fr; }
9155
+ `;
9156
+ styled9.div`
9146
9157
  width: 100vw;
9147
9158
  position: relative;
9148
9159
  left: 50%;
@@ -9333,6 +9344,60 @@ var ChainLogoImg = styled9.img`
9333
9344
  width: auto;
9334
9345
  vertical-align: middle;
9335
9346
  `;
9347
+ var StatsDesktop = styled9.div`
9348
+ display: flex;
9349
+ flex-direction: column;
9350
+ gap: 1.5rem;
9351
+ @media (max-width: 768px) { display: none; }
9352
+ `;
9353
+ var StatsMobile = styled9.div`
9354
+ display: none;
9355
+ @media (max-width: 768px) { display: block; }
9356
+ `;
9357
+ var StatsRowSection = styled9.div`
9358
+ display: flex;
9359
+ flex-direction: column;
9360
+ gap: 0.5rem;
9361
+ `;
9362
+ var StatsRowLabel = styled9.div`
9363
+ font-size: 0.65rem;
9364
+ color: #D4AF37;
9365
+ text-transform: uppercase;
9366
+ letter-spacing: 0.12em;
9367
+ font-weight: 600;
9368
+ `;
9369
+ var StatsHRow = styled9.div`
9370
+ display: flex;
9371
+ gap: 0;
9372
+ background: rgba(255,255,255,0.025);
9373
+ border: 1px solid rgba(255,255,255,0.06);
9374
+ border-radius: 10px;
9375
+ overflow: hidden;
9376
+ `;
9377
+ var StatsHCell = styled9.div`
9378
+ flex: 1;
9379
+ display: flex;
9380
+ flex-direction: column;
9381
+ align-items: center;
9382
+ gap: 6px;
9383
+ padding: 1rem 0.75rem;
9384
+ border-right: 1px solid rgba(255,255,255,0.04);
9385
+ &:last-child { border-right: none; }
9386
+ transition: background 0.15s;
9387
+ &:hover { background: rgba(255,255,255,0.03); }
9388
+ `;
9389
+ var StatsHCellLabel = styled9.span`
9390
+ font-size: 0.7rem;
9391
+ color: rgba(255,255,255,0.4);
9392
+ font-weight: 400;
9393
+ white-space: nowrap;
9394
+ `;
9395
+ var StatsHCellValue = styled9.span`
9396
+ font-size: 0.92rem;
9397
+ font-weight: 500;
9398
+ color: ${(p) => p.$gold ? "#D4AF37" : "#fff"};
9399
+ font-variant-numeric: tabular-nums;
9400
+ `;
9336
9401
  var StatsTabbedCard = styled9.div`
9337
9402
  background: rgba(255,255,255,0.025);
9338
9403
  border: 1px solid rgba(255,255,255,0.06);
@@ -9417,7 +9482,7 @@ var StatValue = styled9.span`
9417
9482
  color: ${(p) => p.$gold ? "#D4AF37" : "#fff"};
9418
9483
  font-variant-numeric: tabular-nums;
9419
9484
  `;
9420
- var InvestmentNarrativesRow = styled9.div`
9485
+ styled9.div`
9421
9486
  display: grid;
9422
9487
  grid-template-columns: repeat(3, 1fr);
9423
9488
  gap: 0.75rem;
@@ -9744,7 +9809,7 @@ var SecurityDocLink = styled9.a`
9744
9809
  color: rgba(212,175,55,0.9);
9745
9810
  }
9746
9811
  `;
9747
- var HoldRatioWrap = styled9.div`
9812
+ styled9.div`
9748
9813
  display: flex;
9749
9814
  flex-direction: column;
9750
9815
  gap: 6px;
@@ -9752,19 +9817,19 @@ var HoldRatioWrap = styled9.div`
9752
9817
  margin-top: 0.5rem;
9753
9818
  border-top: 1px solid rgba(255,255,255,0.04);
9754
9819
  `;
9755
- var HoldRatioTitle = styled9.div`
9820
+ styled9.div`
9756
9821
  display: flex;
9757
9822
  align-items: center;
9758
9823
  gap: 5px;
9759
9824
  `;
9760
- var HoldRatioTitleText = styled9.span`
9825
+ styled9.span`
9761
9826
  font-size: 0.65rem;
9762
9827
  font-weight: 600;
9763
9828
  text-transform: uppercase;
9764
9829
  letter-spacing: 0.06em;
9765
9830
  color: rgba(255,255,255,0.4);
9766
9831
  `;
9767
- var HoldRatioInfo = styled9.span`
9832
+ styled9.span`
9768
9833
  position: relative;
9769
9834
  display: inline-flex;
9770
9835
  align-items: center;
@@ -9807,32 +9872,32 @@ var HoldRatioInfo = styled9.span`
9807
9872
  opacity: 1;
9808
9873
  }
9809
9874
  `;
9810
- var HoldRatioHeader = styled9.div`
9875
+ styled9.div`
9811
9876
  display: flex;
9812
9877
  align-items: center;
9813
9878
  justify-content: space-between;
9814
9879
  `;
9815
- var HoldRatioLabel = styled9.span`
9880
+ styled9.span`
9816
9881
  font-size: 0.7rem;
9817
9882
  font-weight: 600;
9818
9883
  text-transform: uppercase;
9819
9884
  letter-spacing: 0.05em;
9820
9885
  color: ${(p) => p.$side === "trade" ? "rgba(246, 70, 93, 0.6)" : "rgba(14, 203, 129, 0.6)"};
9821
9886
  `;
9822
- var HoldRatioValue = styled9.span`
9887
+ styled9.span`
9823
9888
  font-size: 0.75rem;
9824
9889
  font-weight: 600;
9825
9890
  font-variant-numeric: tabular-nums;
9826
9891
  color: ${(p) => p.$side === "trade" ? "rgba(246, 70, 93, 0.7)" : "rgba(14, 203, 129, 0.7)"};
9827
9892
  `;
9828
- var HoldRatioTrack = styled9.div`
9893
+ styled9.div`
9829
9894
  height: 6px;
9830
9895
  border-radius: 3px;
9831
9896
  background: rgba(246, 70, 93, 0.15);
9832
9897
  overflow: hidden;
9833
9898
  position: relative;
9834
9899
  `;
9835
- var HoldRatioFill = styled9.div`
9900
+ styled9.div`
9836
9901
  height: 100%;
9837
9902
  width: ${(p) => p.$pct}%;
9838
9903
  border-radius: 3px;