@loafmarkets/ui 0.1.152 → 0.1.154

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.js CHANGED
@@ -8081,13 +8081,38 @@ function GalleryMapSection({
8081
8081
  src: resolvedMapUrl,
8082
8082
  width: "100%",
8083
8083
  height: "100%",
8084
- style: { border: 0, minHeight: 500, pointerEvents: "auto" },
8084
+ style: { border: 0, minHeight: 380, pointerEvents: "auto" },
8085
8085
  allow: "autoplay; fullscreen; web-share; xr-spatial-tracking;",
8086
8086
  title: "Property Location",
8087
8087
  referrerPolicy: "unsafe-url",
8088
8088
  tabIndex: -1
8089
8089
  }
8090
8090
  )
8091
+ ] }),
8092
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbProfile, { children: [
8093
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbProfileTitle, { children: [
8094
+ "Suburb Profile \u2014 ",
8095
+ propertyLocation.split(",")[0]?.trim() || propertyLocation
8096
+ ] }),
8097
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbStatsGrid, { children: [
8098
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbStat, { children: [
8099
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatLabel, { children: "Median House Price" }),
8100
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatValue, { children: "$6.2M" })
8101
+ ] }),
8102
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbStat, { children: [
8103
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatLabel, { children: "5yr Growth" }),
8104
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatValue, { children: "+42%" })
8105
+ ] }),
8106
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbStat, { children: [
8107
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatLabel, { children: "Rental Yield" }),
8108
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatValue, { children: "2.1%" })
8109
+ ] }),
8110
+ /* @__PURE__ */ jsxRuntime.jsxs(SuburbStat, { children: [
8111
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatLabel, { children: "Population" }),
8112
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbStatValue, { children: "30,200" })
8113
+ ] })
8114
+ ] }),
8115
+ /* @__PURE__ */ jsxRuntime.jsx(SuburbDesc, { children: "Premium harbourside suburb on Sydney's Lower North Shore. Known for heritage homes, village atmosphere, and proximity to Taronga Zoo and Balmoral Beach." })
8091
8116
  ] })
8092
8117
  ] }),
8093
8118
  showFullMap && /* @__PURE__ */ jsxRuntime.jsx(FullMapPopup, { onClose: () => setShowFullMap(false) })
@@ -8240,11 +8265,55 @@ var MapPanel = styled9__default.default(PanelBase)`
8240
8265
  min-width: 0; overflow: hidden;
8241
8266
  `;
8242
8267
  var MapFrame = styled9__default.default.div`
8243
- flex: 1; border-radius: 6px; overflow: hidden; min-height: 500px; position: relative;
8268
+ flex: 1; border-radius: 6px; overflow: hidden; min-height: 380px; position: relative;
8244
8269
  `;
8245
8270
  var IframeShield = styled9__default.default.div`
8246
8271
  position: absolute; inset: 0; z-index: 1; cursor: pointer;
8247
8272
  `;
8273
+ var SuburbProfile = styled9__default.default.div`
8274
+ margin-top: 1rem;
8275
+ padding-top: 0.85rem;
8276
+ border-top: 1px solid rgba(255,255,255,0.06);
8277
+ `;
8278
+ var SuburbProfileTitle = styled9__default.default.div`
8279
+ font-size: 0.65rem;
8280
+ color: #D4AF37;
8281
+ text-transform: uppercase;
8282
+ letter-spacing: 0.1em;
8283
+ font-weight: 600;
8284
+ margin-bottom: 0.75rem;
8285
+ `;
8286
+ var SuburbStatsGrid = styled9__default.default.div`
8287
+ display: grid;
8288
+ grid-template-columns: 1fr 1fr;
8289
+ gap: 0.5rem;
8290
+ margin-bottom: 0.75rem;
8291
+ `;
8292
+ var SuburbStat = styled9__default.default.div`
8293
+ background: rgba(255,255,255,0.03);
8294
+ border-radius: 6px;
8295
+ padding: 0.5rem 0.65rem;
8296
+ border: 1px solid rgba(255,255,255,0.04);
8297
+ `;
8298
+ var SuburbStatLabel = styled9__default.default.div`
8299
+ font-size: 0.6rem;
8300
+ color: rgba(255,255,255,0.4);
8301
+ text-transform: uppercase;
8302
+ letter-spacing: 0.06em;
8303
+ margin-bottom: 0.2rem;
8304
+ `;
8305
+ var SuburbStatValue = styled9__default.default.div`
8306
+ font-size: 0.9rem;
8307
+ font-weight: 600;
8308
+ color: #fff;
8309
+ font-variant-numeric: tabular-nums;
8310
+ `;
8311
+ var SuburbDesc = styled9__default.default.p`
8312
+ margin: 0;
8313
+ font-size: 0.75rem;
8314
+ color: rgba(255,255,255,0.45);
8315
+ line-height: 1.5;
8316
+ `;
8248
8317
  var MapHeaderRight = styled9__default.default.div`
8249
8318
  display: flex;
8250
8319
  align-items: center;
@@ -8381,12 +8450,12 @@ var DEFAULT_PROPERTY_INFO = [
8381
8450
  { label: "Status", value: "N/A" }
8382
8451
  ];
8383
8452
  var DEFAULT_DESCRIPTION = "Property description not available.";
8384
- var TOKENHOLDER_PROTECTIONS = [
8385
- { icon: ShieldIcon, title: "SPV Structure", desc: "Each property is held in a dedicated Special Purpose Vehicle, isolating investor assets from platform risk." },
8386
- { icon: LockIcon, title: "Smart Contract Audit", desc: "All token contracts are audited by independent security firms before deployment." },
8387
- { icon: FileCheckIcon, title: "Title Insurance", desc: "Full title insurance coverage protects token holders against title defects and encumbrances." },
8388
- { icon: BuildingIcon, title: "Regulated Exchange", desc: "Trading occurs on a regulated marketplace with KYC/AML compliance and investor protections." }
8389
- ];
8453
+ var ScaleIcon = /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "#D4AF37", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
8454
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3v18" }),
8455
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 7l9-4 9 4" }),
8456
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 7l3 5h-6l3-5z" }),
8457
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 7l3 5h-6l3-5z" })
8458
+ ] });
8390
8459
  function truncateAddress(addr) {
8391
8460
  if (addr.length <= 12) return addr;
8392
8461
  return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
@@ -8524,7 +8593,6 @@ function PropertyOverview({
8524
8593
  { label: "Last Valuation", value: isLoading && resolvedValuation == null ? loadingSkeleton : resolvedValuation ? resolvedValuation >= 1e6 ? `$${(resolvedValuation / 1e6).toFixed(2)}M` : `$${resolvedValuation.toLocaleString()}` : "\u2014" },
8525
8594
  { label: "Number of Offers", value: "\u2014" },
8526
8595
  { label: "Growth (Past 5 Years)", value: "\u2014" },
8527
- { label: "Security Interest in Asset", value: "Yes, secured to Land Registry" },
8528
8596
  { label: "Last Dividend", value: isLoading && monthlyDivPerShare == null ? loadingSkeleton : monthlyDivPerShare != null ? `${(monthlyDivPerShare * 100).toFixed(1)} cents` : "\u2014" },
8529
8597
  { label: "Upcoming Dividend", value: (() => {
8530
8598
  const now = /* @__PURE__ */ new Date();
@@ -8687,12 +8755,99 @@ function PropertyOverview({
8687
8755
  ] })
8688
8756
  ] }),
8689
8757
  /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
8690
- /* @__PURE__ */ jsxRuntime.jsx(SectionHeader, { children: "Tokenholder Protections" }),
8691
- /* @__PURE__ */ jsxRuntime.jsx(ProtectionsGrid, { children: TOKENHOLDER_PROTECTIONS.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCard, { children: [
8692
- /* @__PURE__ */ jsxRuntime.jsx(ProtectionIconWrap, { children: p.icon }),
8693
- /* @__PURE__ */ jsxRuntime.jsx(ProtectionTitle, { children: p.title }),
8694
- /* @__PURE__ */ jsxRuntime.jsx(ProtectionDesc, { children: p.desc })
8695
- ] }, p.title)) })
8758
+ /* @__PURE__ */ jsxRuntime.jsx(SectionHeader, { children: "Tokenholder Security" }),
8759
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityIntro, { children: "Every token issued by Loaf Markets is underpinned by institutional-grade legal and structural protections, independently verified and documented." }),
8760
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityTopRow, { children: [
8761
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityBadge, { children: [
8762
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeIcon, { children: ScaleIcon }),
8763
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityBadgeContent, { children: [
8764
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeLabel, { children: "Legal Structuring by" }),
8765
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeLogo, { children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: "/Baker_McKenzie.png", alt: "Baker McKenzie", style: { height: "28px", filter: "brightness(0) invert(1)", opacity: 0.85 } }) })
8766
+ ] })
8767
+ ] }),
8768
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityBadge, { children: [
8769
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeIcon, { children: FileCheckIcon }),
8770
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityBadgeContent, { children: [
8771
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeLabel, { children: "Independent Valuation by" }),
8772
+ /* @__PURE__ */ jsxRuntime.jsx(SecurityBadgeValuer, { children: "CBRE & Savills" })
8773
+ ] })
8774
+ ] })
8775
+ ] }),
8776
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionsGrid, { children: [
8777
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCard, { children: [
8778
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCardHeader, { children: [
8779
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionIconWrap, { children: ShieldIcon }),
8780
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8781
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionTitle, { children: "Security Interest in Asset" }),
8782
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionStatus, { children: [
8783
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionStatusDot, {}),
8784
+ "Secured & Registered"
8785
+ ] })
8786
+ ] })
8787
+ ] }),
8788
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDesc, { children: "A registered mortgage over the property is held on behalf of token holders, secured against the NSW Land Registry. This ensures token holders have a direct, enforceable claim over the underlying real estate." }),
8789
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionDocs, { children: [
8790
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Mortgage Agreement" }),
8791
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Land Registry Filing" })
8792
+ ] })
8793
+ ] }),
8794
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCard, { children: [
8795
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCardHeader, { children: [
8796
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionIconWrap, { children: LockIcon }),
8797
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8798
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionTitle, { children: "Bankruptcy Remote SPV" }),
8799
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionStatus, { children: [
8800
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionStatusDot, {}),
8801
+ "Active"
8802
+ ] })
8803
+ ] })
8804
+ ] }),
8805
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDesc, { children: "The property is held within a dedicated Special Purpose Vehicle, legally isolated from Loaf Markets' operating entity. In the event of platform insolvency, token holder assets remain protected and ring-fenced." }),
8806
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionDocs, { children: [
8807
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "SPV Constitution" }),
8808
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Legal Opinion" })
8809
+ ] })
8810
+ ] }),
8811
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCard, { children: [
8812
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCardHeader, { children: [
8813
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionIconWrap, { children: FileCheckIcon }),
8814
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8815
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionTitle, { children: "Data Protection & Compliance" }),
8816
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionStatus, { children: [
8817
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionStatusDot, {}),
8818
+ "Compliant"
8819
+ ] })
8820
+ ] })
8821
+ ] }),
8822
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDesc, { children: "All investor data is handled under executed Data Processing Agreements compliant with Australian Privacy Act and GDPR standards. KYC/AML procedures follow AUSTRAC reporting obligations." }),
8823
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionDocs, { children: [
8824
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "DPA Agreement" }),
8825
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Privacy Policy" })
8826
+ ] })
8827
+ ] }),
8828
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCard, { children: [
8829
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionCardHeader, { children: [
8830
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionIconWrap, { children: BuildingIcon }),
8831
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
8832
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionTitle, { children: "Independent Valuation" }),
8833
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionStatus, { children: [
8834
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionStatusDot, {}),
8835
+ "Current"
8836
+ ] })
8837
+ ] })
8838
+ ] }),
8839
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDesc, { children: "Property valuations are conducted by independent, internationally recognised firms (CBRE, Savills) at regular intervals. Reports are available for review in the Documents tab." }),
8840
+ /* @__PURE__ */ jsxRuntime.jsxs(ProtectionDocs, { children: [
8841
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Valuation Report" }),
8842
+ /* @__PURE__ */ jsxRuntime.jsx(ProtectionDocTag, { children: "Methodology" })
8843
+ ] })
8844
+ ] })
8845
+ ] }),
8846
+ /* @__PURE__ */ jsxRuntime.jsxs(SecurityFooter, { children: [
8847
+ "Full documentation including legal opinions, mortgage instruments, SPV constitutions, and valuation reports is available in the ",
8848
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: "Documents" }),
8849
+ " tab."
8850
+ ] })
8696
8851
  ] })
8697
8852
  ] });
8698
8853
  }
@@ -9066,6 +9221,62 @@ var TradingHoursNote = styled9__default.default.div`
9066
9221
  color: rgba(255,255,255,0.35);
9067
9222
  border-top: 1px solid rgba(255,255,255,0.04);
9068
9223
  `;
9224
+ var SecurityIntro = styled9__default.default.p`
9225
+ font-size: 0.85rem;
9226
+ color: rgba(255,255,255,0.5);
9227
+ line-height: 1.6;
9228
+ margin: 0 0 1.5rem;
9229
+ max-width: 720px;
9230
+ `;
9231
+ var SecurityTopRow = styled9__default.default.div`
9232
+ display: flex;
9233
+ gap: 1rem;
9234
+ margin-bottom: 1.25rem;
9235
+ @media (max-width: 768px) { flex-direction: column; }
9236
+ `;
9237
+ var SecurityBadge = styled9__default.default.div`
9238
+ flex: 1;
9239
+ display: flex;
9240
+ align-items: center;
9241
+ gap: 1rem;
9242
+ background: rgba(212,175,55,0.04);
9243
+ border: 1px solid rgba(212,175,55,0.15);
9244
+ border-radius: 10px;
9245
+ padding: 1rem 1.25rem;
9246
+ `;
9247
+ var SecurityBadgeIcon = styled9__default.default.div`
9248
+ width: 40px;
9249
+ height: 40px;
9250
+ border-radius: 8px;
9251
+ background: rgba(212,175,55,0.1);
9252
+ display: flex;
9253
+ align-items: center;
9254
+ justify-content: center;
9255
+ flex-shrink: 0;
9256
+ `;
9257
+ var SecurityBadgeContent = styled9__default.default.div`
9258
+ display: flex;
9259
+ flex-direction: column;
9260
+ gap: 4px;
9261
+ `;
9262
+ var SecurityBadgeLabel = styled9__default.default.span`
9263
+ font-size: 0.72rem;
9264
+ color: rgba(255,255,255,0.45);
9265
+ text-transform: uppercase;
9266
+ letter-spacing: 0.04em;
9267
+ font-weight: 500;
9268
+ `;
9269
+ var SecurityBadgeLogo = styled9__default.default.div`
9270
+ display: flex;
9271
+ align-items: center;
9272
+ height: 28px;
9273
+ `;
9274
+ var SecurityBadgeValuer = styled9__default.default.div`
9275
+ font-size: 1rem;
9276
+ font-weight: 600;
9277
+ color: #fff;
9278
+ letter-spacing: 0.02em;
9279
+ `;
9069
9280
  var ProtectionsGrid = styled9__default.default.div`
9070
9281
  display: grid;
9071
9282
  grid-template-columns: 1fr 1fr;
@@ -9077,6 +9288,14 @@ var ProtectionCard = styled9__default.default.div`
9077
9288
  border: 1px solid rgba(255,255,255,0.06);
9078
9289
  border-radius: 10px;
9079
9290
  padding: 1.25rem;
9291
+ display: flex;
9292
+ flex-direction: column;
9293
+ gap: 0.75rem;
9294
+ `;
9295
+ var ProtectionCardHeader = styled9__default.default.div`
9296
+ display: flex;
9297
+ align-items: flex-start;
9298
+ gap: 0.75rem;
9080
9299
  `;
9081
9300
  var ProtectionIconWrap = styled9__default.default.div`
9082
9301
  width: 36px;
@@ -9086,18 +9305,62 @@ var ProtectionIconWrap = styled9__default.default.div`
9086
9305
  display: flex;
9087
9306
  align-items: center;
9088
9307
  justify-content: center;
9089
- margin-bottom: 0.75rem;
9308
+ flex-shrink: 0;
9090
9309
  `;
9091
9310
  var ProtectionTitle = styled9__default.default.div`
9092
9311
  font-size: 0.92rem;
9093
9312
  font-weight: 600;
9094
9313
  color: #fff;
9095
- margin-bottom: 0.4rem;
9314
+ margin-bottom: 2px;
9315
+ `;
9316
+ var ProtectionStatus = styled9__default.default.div`
9317
+ display: flex;
9318
+ align-items: center;
9319
+ gap: 5px;
9320
+ font-size: 0.72rem;
9321
+ color: #4ade80;
9322
+ font-weight: 500;
9323
+ `;
9324
+ var ProtectionStatusDot = styled9__default.default.span`
9325
+ width: 6px;
9326
+ height: 6px;
9327
+ border-radius: 50%;
9328
+ background: #4ade80;
9329
+ display: inline-block;
9096
9330
  `;
9097
9331
  var ProtectionDesc = styled9__default.default.div`
9098
9332
  font-size: 0.8rem;
9099
9333
  color: rgba(255,255,255,0.5);
9334
+ line-height: 1.6;
9335
+ `;
9336
+ var ProtectionDocs = styled9__default.default.div`
9337
+ display: flex;
9338
+ flex-wrap: wrap;
9339
+ gap: 6px;
9340
+ margin-top: auto;
9341
+ `;
9342
+ var ProtectionDocTag = styled9__default.default.span`
9343
+ font-size: 0.68rem;
9344
+ color: rgba(212,175,55,0.8);
9345
+ background: rgba(212,175,55,0.08);
9346
+ border: 1px solid rgba(212,175,55,0.12);
9347
+ border-radius: 4px;
9348
+ padding: 3px 8px;
9349
+ font-weight: 500;
9350
+ `;
9351
+ var SecurityFooter = styled9__default.default.div`
9352
+ margin-top: 1.25rem;
9353
+ padding: 0.85rem 1rem;
9354
+ background: rgba(255,255,255,0.02);
9355
+ border: 1px solid rgba(255,255,255,0.05);
9356
+ border-radius: 8px;
9357
+ font-size: 0.78rem;
9358
+ color: rgba(255,255,255,0.4);
9100
9359
  line-height: 1.5;
9360
+ strong {
9361
+ color: rgba(212,175,55,0.8);
9362
+ font-weight: 600;
9363
+ }
9101
9364
  `;
9102
9365
  var HoldRatioWrap = styled9__default.default.div`
9103
9366
  display: flex;