@loafmarkets/ui 0.1.360 → 0.1.361

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
@@ -13,6 +13,8 @@ import { MdKingBed, MdBathtub, MdDirectionsCar, MdPool, MdYard, MdFitnessCenter
13
13
  import { BiChevronUp, BiChevronDown, BiX, BiCoin, BiWallet, BiCreditCard, BiCalendar, BiInfoCircle, BiPencil, BiImages, BiVideo, BiMap } from 'react-icons/bi';
14
14
  import { FaChartLine, FaBitcoin } from 'react-icons/fa';
15
15
  import { FiEdit2 } from 'react-icons/fi';
16
+ import { Chart, CategoryScale, LinearScale, PointElement, LineElement, Title as Title$1, Tooltip, Legend } from 'chart.js';
17
+ import { Line } from 'react-chartjs-2';
16
18
 
17
19
  // src/components/button.tsx
18
20
  function cn(...inputs) {
@@ -157,7 +159,7 @@ var PortfolioSummary = React5.forwardRef(
157
159
  onResetAccount,
158
160
  positionsHeading = "Current Positions",
159
161
  emptyPositionsText = "No positions yet. Start trading to build your portfolio!",
160
- formatCurrency: formatCurrency6 = defaultFormatCurrency,
162
+ formatCurrency: formatCurrency5 = defaultFormatCurrency,
161
163
  formatPercent: formatPercent2 = defaultFormatPercent,
162
164
  formatSignedCurrency = defaultFormatSignedCurrency,
163
165
  className,
@@ -195,11 +197,11 @@ var PortfolioSummary = React5.forwardRef(
195
197
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
196
198
  /* @__PURE__ */ jsxs("div", { children: [
197
199
  /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.5px] text-white/50", children: "Available Cash" }),
198
- /* @__PURE__ */ jsx("p", { className: "mt-1 text-[1.25rem] font-semibold text-white", children: formatCurrency6(availableCash) })
200
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-[1.25rem] font-semibold text-white", children: formatCurrency5(availableCash) })
199
201
  ] }),
200
202
  /* @__PURE__ */ jsxs("div", { children: [
201
203
  /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.5px] text-white/50", children: "Portfolio Value" }),
202
- /* @__PURE__ */ jsx("p", { className: "mt-1 text-[1.25rem] font-semibold text-white", children: formatCurrency6(portfolioValue) })
204
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-[1.25rem] font-semibold text-white", children: formatCurrency5(portfolioValue) })
203
205
  ] }),
204
206
  /* @__PURE__ */ jsxs("div", { children: [
205
207
  /* @__PURE__ */ jsx("p", { className: "text-xs uppercase tracking-[0.5px] text-white/50", children: "Total Return" }),
@@ -7843,7 +7845,7 @@ var MiniLiveFeed = () => {
7843
7845
  }, 2e3 + Math.random() * 2e3);
7844
7846
  return () => clearInterval(interval);
7845
7847
  }, []);
7846
- const formatCurrency6 = (amount) => `$${amount.toLocaleString()}`;
7848
+ const formatCurrency5 = (amount) => `$${amount.toLocaleString()}`;
7847
7849
  return /* @__PURE__ */ jsxs(
7848
7850
  "div",
7849
7851
  {
@@ -7933,7 +7935,7 @@ var MiniLiveFeed = () => {
7933
7935
  ] }),
7934
7936
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem", position: "relative", zIndex: 1 }, children: [
7935
7937
  /* @__PURE__ */ jsx("span", { style: { fontSize: "0.75rem", color: "var(--color-text-secondary, #848e9c)" }, children: "bought" }),
7936
- /* @__PURE__ */ jsx("span", { style: { fontSize: "0.8rem", fontWeight: 600, color: "#fff" }, children: formatCurrency6(purchase.amount) })
7938
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.8rem", fontWeight: 600, color: "#fff" }, children: formatCurrency5(purchase.amount) })
7937
7939
  ] })
7938
7940
  ]
7939
7941
  },
@@ -8479,7 +8481,8 @@ function GalleryMapSection({
8479
8481
  autoPlayInterval = 4e3,
8480
8482
  hideMap = false,
8481
8483
  hideGallery = false,
8482
- hideSuburb = false
8484
+ hideSuburb = false,
8485
+ featuresSlot
8483
8486
  }) {
8484
8487
  const [carouselIndex, setCarouselIndex] = useState(0);
8485
8488
  const [showVideo, setShowVideo] = useState(false);
@@ -8572,6 +8575,7 @@ function GalleryMapSection({
8572
8575
  }, children: cat.name }, cat.name);
8573
8576
  }) })
8574
8577
  ] }),
8578
+ featuresSlot,
8575
8579
  !hideMap && /* @__PURE__ */ jsxs(MapPanel, { children: [
8576
8580
  /* @__PURE__ */ jsxs(PanelHeader, { children: [
8577
8581
  /* @__PURE__ */ jsxs("h3", { children: [
@@ -9150,25 +9154,23 @@ function PropertyOverview({
9150
9154
  /* @__PURE__ */ jsx(SectionHeader, { children: "The Asset" }),
9151
9155
  galleryImages.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
9152
9156
  /* @__PURE__ */ jsxs(GallerySpecRow, { children: [
9153
- /* @__PURE__ */ jsxs(GallerySpecLeft, { children: [
9154
- /* @__PURE__ */ jsx(
9155
- GalleryMapSection,
9156
- {
9157
- images: galleryImages.map((img) => ({ src: img.imageUrl, title: img.title, subtitle: img.subtitle })),
9158
- categories: galleryCategories,
9159
- propertyLocation: location,
9160
- videoUrl,
9161
- tokenName,
9162
- onPhotoClick: onPhotosClick,
9163
- hideSuburb: true
9164
- }
9165
- ),
9166
- /* @__PURE__ */ jsx(FeaturesPanel, { children: features.map((item, i) => /* @__PURE__ */ jsxs(AssetFeatureItem, { children: [
9167
- item.icon && /* @__PURE__ */ jsx(AssetFeatureIcon, { children: item.icon }),
9168
- item.value && /* @__PURE__ */ jsx(AssetFeatureValue, { children: item.value }),
9169
- /* @__PURE__ */ jsx(AssetFeatureLabel, { children: item.label })
9170
- ] }, i)) })
9171
- ] }),
9157
+ /* @__PURE__ */ jsx(GallerySpecLeft, { children: /* @__PURE__ */ jsx(
9158
+ GalleryMapSection,
9159
+ {
9160
+ images: galleryImages.map((img) => ({ src: img.imageUrl, title: img.title, subtitle: img.subtitle })),
9161
+ categories: galleryCategories,
9162
+ propertyLocation: location,
9163
+ videoUrl,
9164
+ tokenName,
9165
+ onPhotoClick: onPhotosClick,
9166
+ hideSuburb: true,
9167
+ featuresSlot: /* @__PURE__ */ jsx(FeaturesPanel, { children: features.map((item, i) => /* @__PURE__ */ jsxs(AssetFeatureItem, { children: [
9168
+ item.icon && /* @__PURE__ */ jsx(AssetFeatureIcon, { children: item.icon }),
9169
+ item.value && /* @__PURE__ */ jsx(AssetFeatureValue, { children: item.value }),
9170
+ /* @__PURE__ */ jsx(AssetFeatureLabel, { children: item.label })
9171
+ ] }, i)) })
9172
+ }
9173
+ ) }),
9172
9174
  /* @__PURE__ */ jsxs(StatsColumn, { children: [
9173
9175
  /* @__PURE__ */ jsx(StatsColumnHeader, { children: "Asset Specification" }),
9174
9176
  /* @__PURE__ */ jsxs(StatRow, { children: [
@@ -16300,568 +16302,413 @@ var ActionButton = styled9.button`
16300
16302
  color: ${({ $variant }) => $variant === "danger" ? "#ff8f8f" : "#f4d07f"};
16301
16303
  }
16302
16304
  `;
16303
- var CHART_WIDTH = 1200;
16304
- var CHART_HEIGHT = 200;
16305
- var CHART_PADDING = 10;
16306
- var FALLBACK_RECENT_SALES = [
16307
- {
16308
- imageUrl: "https://images.unsplash.com/photo-1464146072230-91cabc968266?auto=format&fit=crop&w=1200&q=80",
16309
- price: 165e5,
16310
- saleDate: "Nov 2024",
16311
- address: "15 Wentworth Road",
16312
- suburb: "Vaucluse",
16313
- bedrooms: 5,
16314
- bathrooms: 5,
16315
- landSize: "1,420 sqm"
16316
- },
16317
- {
16318
- imageUrl: "https://images.unsplash.com/photo-1505691938895-1758d7feb511?auto=format&fit=crop&w=1200&q=80",
16319
- price: 149e5,
16320
- saleDate: "Sep 2024",
16321
- address: "42 Vaucluse Road",
16322
- suburb: "Vaucluse",
16323
- bedrooms: 4,
16324
- bathrooms: 4,
16325
- landSize: "980 sqm"
16326
- },
16327
- {
16328
- imageUrl: "https://images.unsplash.com/photo-1505693314120-0d443867891c?auto=format&fit=crop&w=1200&q=80",
16329
- price: 1325e4,
16330
- saleDate: "Jun 2024",
16331
- address: "18 Olola Avenue",
16332
- suburb: "Vaucluse",
16333
- bedrooms: 4,
16334
- bathrooms: 3,
16335
- landSize: "860 sqm"
16336
- }
16337
- ];
16305
+ Chart.register(CategoryScale, LinearScale, PointElement, LineElement, Title$1, Tooltip, Legend);
16306
+ var musgraveComparisonData = {
16307
+ labels: ["2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026"],
16308
+ datasets: [
16309
+ {
16310
+ name: "Musgrave",
16311
+ color: "#D4AF37",
16312
+ data: [100, 115, 125, 118, 130, 145, 155, 165, 180, 195, 210, 225, 240, 225, 235, 231, 265, 285, 300, 310, 320]
16313
+ },
16314
+ {
16315
+ name: "ASX 200",
16316
+ color: "#2196f3",
16317
+ data: [100, 113, 110, 69, 89, 93, 83, 95, 101, 109, 98, 110, 118, 114, 137, 129, 136, 146, 150, 166, 170]
16318
+ },
16319
+ {
16320
+ name: "Bank Deposits",
16321
+ color: "#e91e63",
16322
+ data: [100, 107, 114, 119, 124, 131, 137, 142, 146, 150, 154, 157, 160, 163, 164, 165, 167, 174, 182, 190, 198]
16323
+ }
16324
+ ],
16325
+ saleMarkers: [
16326
+ { year: "2006", label: "Purchase", price: "$11.25M", description: "" },
16327
+ { year: "2021", label: "Covid Flash Sale", price: "$13M", description: "Sold at ~50% discount due to Covid uncertainty" },
16328
+ { year: "2026", label: "Offering", price: "$36M", description: "Current offering valuation" }
16329
+ ]
16330
+ };
16338
16331
  function PropertyValuation({
16339
- propertyName,
16340
- tokenPrice,
16341
- totalTokens,
16342
- summary = null,
16343
- history = [],
16344
- loading = false,
16345
- error = null
16332
+ propertyTitle,
16333
+ tokenPriceValue,
16334
+ valSummary,
16335
+ offeringValuationValue,
16336
+ totalUnits
16346
16337
  }) {
16347
- const now = useMemo(() => /* @__PURE__ */ new Date(), []);
16348
- const lastPrice = useMemo(() => {
16349
- const fallback = Number.isFinite(tokenPrice) && tokenPrice > 0 ? tokenPrice : 0;
16350
- if (!summary?.lastPrice || summary.lastPrice <= 0) {
16351
- return fallback;
16352
- }
16353
- return summary.lastPrice;
16354
- }, [summary, tokenPrice]);
16355
- const fairValue = useMemo(() => {
16356
- if (summary?.fairValue && summary.fairValue > 0) {
16357
- return summary.fairValue;
16358
- }
16359
- return lastPrice || 1;
16360
- }, [summary, lastPrice]);
16361
- const tokensOutstanding = useMemo(() => {
16362
- if (summary?.totalTokens && summary.totalTokens > 0) {
16363
- return summary.totalTokens;
16364
- }
16365
- if (totalTokens && totalTokens > 0) {
16366
- return totalTokens;
16338
+ const [hoveredSaleYear, setHoveredSaleYear] = useState(null);
16339
+ const gaugePosition = useMemo(() => {
16340
+ const under = valSummary?.undervaluedThreshold;
16341
+ const over = valSummary?.overvaluedThreshold;
16342
+ const price = tokenPriceValue;
16343
+ if (under != null && over != null && price != null && over > under) {
16344
+ const pct = (price - under) / (over - under) * 100;
16345
+ return Math.max(5, Math.min(95, pct));
16367
16346
  }
16368
- return 5e4;
16369
- }, [summary, totalTokens]);
16370
- const undervaluedThreshold = summary?.undervaluedThreshold ?? fairValue * 0.9;
16371
- const overvaluedThreshold = summary?.overvaluedThreshold ?? fairValue * 1.1;
16372
- const gaugePosition = calculatePositionFromPrice(lastPrice, undervaluedThreshold, fairValue, overvaluedThreshold);
16373
- const valuationStatus = summary?.valuationStatus ?? (lastPrice < fairValue ? "Undervalued" : lastPrice > fairValue ? "Overvalued" : "Fair Value");
16374
- const valuationDelta = summary?.valuationDeltaPercent ?? (lastPrice - fairValue) / fairValue * 100;
16375
- const valuationDeltaFormatted = `${valuationDelta >= 0 ? "+" : ""}${valuationDelta.toFixed(1)}%`;
16376
- const { valuationPath, fairValuePath, axisLabels } = useMemo(() => buildChartPaths(history, fairValue), [history, fairValue]);
16377
- const recentSales = useMemo(() => {
16378
- if (summary?.recentSales?.length) {
16379
- return summary.recentSales;
16347
+ return 50;
16348
+ }, [valSummary?.undervaluedThreshold, valSummary?.overvaluedThreshold, tokenPriceValue]);
16349
+ const chartOptions = useMemo(() => ({
16350
+ responsive: true,
16351
+ maintainAspectRatio: false,
16352
+ onHover: (_event, elements) => {
16353
+ if (elements.length > 0) {
16354
+ const dataIndex = elements[0].index;
16355
+ const year = musgraveComparisonData.labels[dataIndex];
16356
+ if (["2006", "2021", "2026"].includes(year)) {
16357
+ setHoveredSaleYear(year);
16358
+ return;
16359
+ }
16360
+ }
16361
+ setHoveredSaleYear(null);
16362
+ },
16363
+ plugins: {
16364
+ legend: { display: false },
16365
+ tooltip: {
16366
+ mode: "index",
16367
+ intersect: false,
16368
+ backgroundColor: "rgba(30, 32, 38, 0.9)",
16369
+ titleColor: "#f8f9fa",
16370
+ bodyColor: "#f8f9fa",
16371
+ borderColor: "rgba(255, 255, 255, 0.1)",
16372
+ borderWidth: 1,
16373
+ callbacks: {
16374
+ label(context) {
16375
+ return `${context.dataset.label}: ${(context.parsed.y ?? 0).toFixed(0)}`;
16376
+ }
16377
+ }
16378
+ }
16379
+ },
16380
+ scales: {
16381
+ x: {
16382
+ grid: { color: "rgba(255, 255, 255, 0.05)" },
16383
+ ticks: { color: "#848e9c", font: { size: 9 }, maxRotation: 45, minRotation: 45 }
16384
+ },
16385
+ y: {
16386
+ grid: { color: "rgba(255, 255, 255, 0.05)" },
16387
+ ticks: { color: "#848e9c", font: { size: 10 } },
16388
+ min: 50
16389
+ }
16380
16390
  }
16381
- return FALLBACK_RECENT_SALES;
16382
- }, [summary]);
16383
- const areaDemandLabel = summary?.areaDemand ?? "Hot";
16384
- const propertyMoatLabel = summary?.propertyMoat ?? "Wide";
16385
- return /* @__PURE__ */ jsxs(ValuationWrapper, { children: [
16386
- /* @__PURE__ */ jsx(SectionTitle, { children: "Valuation Model" }),
16391
+ }), []);
16392
+ const chartData = useMemo(() => ({
16393
+ labels: musgraveComparisonData.labels,
16394
+ datasets: musgraveComparisonData.datasets.map((dataset, index) => ({
16395
+ label: dataset.name,
16396
+ data: dataset.data,
16397
+ borderColor: dataset.color,
16398
+ backgroundColor: `${dataset.color}20`,
16399
+ borderWidth: index === 0 ? 3 : 2,
16400
+ pointRadius: (ctx) => {
16401
+ if (index === 0) {
16402
+ const year = musgraveComparisonData.labels[ctx.dataIndex];
16403
+ if (["2006", "2021", "2026"].includes(year)) {
16404
+ return hoveredSaleYear === year ? 14 : 8;
16405
+ }
16406
+ }
16407
+ return 1;
16408
+ },
16409
+ pointBackgroundColor: (ctx) => {
16410
+ if (index === 0) {
16411
+ const year = musgraveComparisonData.labels[ctx.dataIndex];
16412
+ if (year === "2006") return "#4CAF50";
16413
+ if (year === "2021") return "#FF5722";
16414
+ if (year === "2026") return "#D4AF37";
16415
+ }
16416
+ return dataset.color;
16417
+ },
16418
+ pointBorderColor: (ctx) => {
16419
+ if (index === 0 && ["2006", "2021", "2026"].includes(musgraveComparisonData.labels[ctx.dataIndex])) return "#fff";
16420
+ return dataset.color;
16421
+ },
16422
+ pointBorderWidth: (ctx) => {
16423
+ if (index === 0 && ["2006", "2021", "2026"].includes(musgraveComparisonData.labels[ctx.dataIndex])) {
16424
+ return hoveredSaleYear === musgraveComparisonData.labels[ctx.dataIndex] ? 4 : 2;
16425
+ }
16426
+ return 0;
16427
+ },
16428
+ pointHoverRadius: 6,
16429
+ tension: 0.3,
16430
+ fill: false
16431
+ }))
16432
+ }), [hoveredSaleYear]);
16433
+ const handleMarkerEnter = useCallback((year) => setHoveredSaleYear(year), []);
16434
+ const handleMarkerLeave = useCallback(() => setHoveredSaleYear(null), []);
16435
+ return /* @__PURE__ */ jsxs("div", { children: [
16436
+ /* @__PURE__ */ jsx(ValuationHeading, { children: "Valuation Model" }),
16387
16437
  /* @__PURE__ */ jsxs(LoafPricingSection, { children: [
16388
- /* @__PURE__ */ jsx(SectionSubheading, { children: "Loaf Pricing Model" }),
16389
- /* @__PURE__ */ jsxs(PricingModelCard, { children: [
16438
+ /* @__PURE__ */ jsx("h2", { style: { color: "#D4AF37", marginBottom: "0" }, children: "Loaf Pricing Model" }),
16439
+ /* @__PURE__ */ jsx(BlurredContent, { children: /* @__PURE__ */ jsxs(PricingModelCard, { children: [
16390
16440
  /* @__PURE__ */ jsxs(PricingModelHeader, { children: [
16391
- /* @__PURE__ */ jsx(PricingModelTitle, { children: propertyName }),
16392
- /* @__PURE__ */ jsx(PricingModelValue, { children: /* @__PURE__ */ jsxs("div", { className: "valuation-info", children: [
16393
- /* @__PURE__ */ jsx("div", { children: "Valuation as of" }),
16394
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("span", { style: { color: "var(--color-accent)" }, children: now.toLocaleDateString("en-US", { day: "2-digit", month: "short", year: "numeric" }) }) }),
16395
- /* @__PURE__ */ jsxs("div", { children: [
16396
- now.toLocaleTimeString("en-AU", { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false, timeZone: "Australia/Sydney" }),
16441
+ /* @__PURE__ */ jsx(PricingModelTitle, { children: propertyTitle }),
16442
+ /* @__PURE__ */ jsxs("div", { style: { textAlign: "right" }, children: [
16443
+ /* @__PURE__ */ jsx("div", { style: { fontSize: "0.75rem", color: "rgba(255,255,255,0.7)" }, children: "Valuation as of" }),
16444
+ /* @__PURE__ */ jsx("div", { style: { color: "#D4AF37", fontWeight: "600" }, children: (valSummary?.valuationAsOf ? new Date(valSummary.valuationAsOf) : /* @__PURE__ */ new Date()).toLocaleDateString("en-US", { day: "2-digit", month: "short", year: "numeric" }) }),
16445
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: "0.75rem", color: "rgba(255,255,255,0.7)" }, children: [
16446
+ (valSummary?.valuationAsOf ? new Date(valSummary.valuationAsOf) : /* @__PURE__ */ new Date()).toLocaleTimeString("en-AU", { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false, timeZone: "Australia/Sydney" }),
16397
16447
  " AEST"
16398
16448
  ] })
16399
- ] }) })
16449
+ ] })
16400
16450
  ] }),
16401
16451
  /* @__PURE__ */ jsxs(PricingModelDetails, { children: [
16402
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [
16403
- /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16404
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Last Price" }),
16405
- /* @__PURE__ */ jsx(PricingDetailValue, { children: formatCurrency5(lastPrice) })
16406
- ] }),
16407
- /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16408
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", width: "100%" }, children: [
16409
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Fair Value" }),
16410
- /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.75rem", color: "#4CAF50", fontWeight: "bold" }, children: [
16411
- "Confidence: ",
16412
- summary?.confidence ?? "High"
16413
- ] })
16414
- ] }),
16415
- /* @__PURE__ */ jsxs(PricingDetailValue, { style: { color: "var(--color-accent)", fontWeight: "bold" }, children: [
16416
- formatCurrency5(fairValue),
16417
- " ",
16418
- /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
16419
- "(",
16420
- formatCurrency5(fairValue * tokensOutstanding, { maximumFractionDigits: 0 }),
16421
- ")"
16422
- ] })
16423
- ] })
16424
- ] })
16452
+ /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16453
+ /* @__PURE__ */ jsx(PricingDetailLabel, { children: "IPO Price" }),
16454
+ /* @__PURE__ */ jsx(PricingDetailValue, { children: tokenPriceValue != null ? `$${tokenPriceValue.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : /* @__PURE__ */ jsx(Skeleton, { width: 90, height: 18 }) })
16425
16455
  ] }),
16426
- /* @__PURE__ */ jsxs(ValuationIndicator, { className: "mobile-only-valuation", children: [
16427
- /* @__PURE__ */ jsxs(ValuationHeader, { children: [
16428
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#4CAF50" }, children: "Undervalued" }),
16429
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "var(--color-accent)" }, children: "Fair Value" }),
16430
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#F44336" }, children: "Overvalued" })
16431
- ] }),
16432
- /* @__PURE__ */ jsxs(ValuationGauge, { children: [
16433
- /* @__PURE__ */ jsx(GaugeBackground, {}),
16434
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
16435
- /* @__PURE__ */ jsxs(GaugePriceTag, { position: gaugePosition, children: [
16436
- /* @__PURE__ */ jsx("span", { children: "Last Price" }),
16437
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(lastPrice) })
16438
- ] }),
16439
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "lastPrice", position: gaugePosition })
16456
+ /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16457
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", width: "100%" }, children: [
16458
+ /* @__PURE__ */ jsx(PricingDetailLabel, { style: { marginBottom: 0 }, children: "Fair Value" }),
16459
+ valSummary?.confidence && /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.75rem", color: "#4CAF50", fontWeight: "bold" }, children: [
16460
+ "Confidence: ",
16461
+ valSummary.confidence
16462
+ ] })
16440
16463
  ] }),
16441
- /* @__PURE__ */ jsxs(ValuationDetails, { children: [
16442
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#4CAF50" }, children: [
16443
- /* @__PURE__ */ jsxs("span", { children: [
16444
- "< ",
16445
- formatCurrency5(undervaluedThreshold)
16446
- ] }),
16447
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16448
- "(",
16449
- formatMillions(undervaluedThreshold * tokensOutstanding),
16450
- ")"
16451
- ] })
16452
- ] }) }),
16453
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "var(--color-accent)" }, children: [
16454
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(fairValue) }),
16455
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16456
- "(",
16457
- formatMillions(fairValue * tokensOutstanding),
16458
- ")"
16459
- ] })
16460
- ] }) }),
16461
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#F44336" }, children: [
16462
- /* @__PURE__ */ jsxs("span", { children: [
16463
- "> ",
16464
- formatCurrency5(overvaluedThreshold)
16465
- ] }),
16466
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16467
- "(",
16468
- formatMillions(overvaluedThreshold * tokensOutstanding),
16469
- ")"
16470
- ] })
16471
- ] }) })
16472
- ] })
16473
- ] }),
16474
- /* @__PURE__ */ jsxs(HiddenMobileChart, { children: [
16475
- /* @__PURE__ */ jsx("h3", { style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
16476
- /* @__PURE__ */ jsx(ChartContainer, { children: /* @__PURE__ */ jsxs(ChartBackground, { children: [
16477
- axisLabels.map((label, index) => /* @__PURE__ */ jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
16478
- /* @__PURE__ */ jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
16479
- valuationPath ? /* @__PURE__ */ jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
16480
- fairValuePath ? /* @__PURE__ */ jsx("path", { d: fairValuePath, fill: "none", stroke: "#FFFFFF", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null
16464
+ /* @__PURE__ */ jsx(PricingDetailValue, { style: { color: "#D4AF37", fontWeight: "bold" }, children: valSummary?.fairValue != null ? /* @__PURE__ */ jsxs(Fragment, { children: [
16465
+ `$${valSummary.fairValue.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`,
16466
+ totalUnits > 0 && /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
16467
+ " ($",
16468
+ (valSummary.fairValue * totalUnits).toLocaleString(),
16469
+ ")"
16481
16470
  ] })
16482
- ] }) })
16471
+ ] }) : /* @__PURE__ */ jsx(Skeleton, { width: 140, height: 18 }) })
16483
16472
  ] }),
16484
16473
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16485
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Valuation" }),
16486
- /* @__PURE__ */ jsxs(ValuationCallout, { children: [
16487
- /* @__PURE__ */ jsx("span", { style: { color: "#4CAF50", fontWeight: 600, fontSize: "16px", letterSpacing: "0.3px" }, children: valuationStatus }),
16488
- /* @__PURE__ */ jsx(ValuationBadge, { children: valuationDeltaFormatted })
16474
+ /* @__PURE__ */ jsx(PricingDetailLabel, { children: "Valuation" }),
16475
+ /* @__PURE__ */ jsxs("div", { style: {
16476
+ display: "flex",
16477
+ alignItems: "center",
16478
+ justifyContent: "space-between",
16479
+ background: "linear-gradient(90deg, rgba(212, 175, 55, 0.05) 0%, rgba(212, 175, 55, 0.1) 100%)",
16480
+ borderRadius: "8px",
16481
+ padding: "10px 16px",
16482
+ border: "1px solid rgba(212, 175, 55, 0.2)"
16483
+ }, children: [
16484
+ /* @__PURE__ */ jsx("span", { style: { color: "#D4AF37", fontWeight: "600" }, children: valSummary?.valuationStatus ?? "Fair Value" }),
16485
+ /* @__PURE__ */ jsx("div", { style: {
16486
+ background: "linear-gradient(135deg, #D4AF37 0%, #B8960C 100%)",
16487
+ color: "white",
16488
+ padding: "5px 12px",
16489
+ borderRadius: "20px",
16490
+ fontSize: "14px",
16491
+ fontWeight: "600"
16492
+ }, children: valSummary?.valuationDeltaPercent != null ? `${valSummary.valuationDeltaPercent.toFixed(1)}%` : valSummary ? "0.0%" : /* @__PURE__ */ jsx(Skeleton, { width: 44, height: 14 }) })
16489
16493
  ] })
16490
16494
  ] }),
16491
16495
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16492
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Area Demand" }),
16493
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
16494
- /* @__PURE__ */ jsx(PricingDetailValue, { children: areaDemandLabel }),
16495
- /* @__PURE__ */ jsxs(AreaDemandChart, { children: [
16496
- /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16497
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(244, 67, 54, 0.2)" }),
16498
- /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(255, 152, 0, 0.15)" }),
16499
- /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(158, 158, 158, 0.15)" }),
16500
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16501
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16502
- /* @__PURE__ */ jsx("line", { x1: "45", y1: "0", x2: "45", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16503
- /* @__PURE__ */ jsx("line", { x1: "90", y1: "0", x2: "90", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16504
- /* @__PURE__ */ jsx("line", { x1: "135", y1: "0", x2: "135", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16505
- /* @__PURE__ */ jsx("path", { d: "M0,35 C10,30 20,25 30,20 C40,15 50,25 60,15 C70,30 80,10 90,25 C100,15 110,5 120,15 C130,10 140,20 150,5 C160,10 170,5 180,5", fill: "none", stroke: "#F44336", strokeWidth: "2" })
16506
- ] }),
16507
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "3px" }, children: "Hot" }),
16508
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "23px" }, children: "Warm" }),
16509
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "43px" }, children: "Cold" }),
16510
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: 0 }, children: "2020" }),
16511
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "45px" }, children: "2021" }),
16512
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "90px" }, children: "2022" }),
16513
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "135px" }, children: "2023" }),
16514
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", right: 0 }, children: "2025" })
16515
- ] })
16496
+ /* @__PURE__ */ jsx(PricingDetailLabel, { children: "Area Demand" }),
16497
+ /* @__PURE__ */ jsx(PricingDetailValue, { style: { color: "#F44336", marginBottom: "0.5rem" }, children: valSummary?.areaDemand ?? (valSummary ? "Hot" : /* @__PURE__ */ jsx(Skeleton, { width: 60, height: 16 })) }),
16498
+ /* @__PURE__ */ jsxs(MiniChartContainer, { children: [
16499
+ /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16500
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(244, 67, 54, 0.2)" }),
16501
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(255, 152, 0, 0.15)" }),
16502
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(158, 158, 158, 0.15)" }),
16503
+ /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16504
+ /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16505
+ /* @__PURE__ */ jsx("path", { d: "M0,35 C10,30 20,25 30,20 C40,15 50,25 60,15 C70,30 80,10 90,25 C100,15 110,5 120,15 C130,10 140,20 150,5 C160,10 170,5 180,5", fill: "none", stroke: "#F44336", strokeWidth: "2" })
16506
+ ] }),
16507
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "3px" }, children: "Hot" }),
16508
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "23px" }, children: "Warm" }),
16509
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "43px" }, children: "Cold" }),
16510
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "0" }, children: "2020" }),
16511
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "25%" }, children: "2021" }),
16512
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "50%" }, children: "2022" }),
16513
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "75%" }, children: "2023" }),
16514
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { right: "0", left: "auto" }, children: "2025" })
16516
16515
  ] })
16517
16516
  ] }),
16518
16517
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16519
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Property Moat" }),
16520
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
16521
- /* @__PURE__ */ jsx(PricingDetailValue, { children: propertyMoatLabel }),
16522
- /* @__PURE__ */ jsxs(AreaDemandChart, { children: [
16523
- /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16524
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(0, 137, 123, 0.2)" }),
16525
- /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(102, 187, 106, 0.15)" }),
16526
- /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(200, 230, 201, 0.15)" }),
16527
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16528
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16529
- /* @__PURE__ */ jsx("line", { x1: "45", y1: "0", x2: "45", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16530
- /* @__PURE__ */ jsx("line", { x1: "90", y1: "0", x2: "90", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16531
- /* @__PURE__ */ jsx("line", { x1: "135", y1: "0", x2: "135", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16532
- /* @__PURE__ */ jsx("path", { d: "M0,15 C10,12 20,8 30,10 C40,5 50,12 60,8 C70,15 80,10 90,5 C100,12 110,8 120,15 C130,10 140,5 150,12 C160,8 170,10 180,5", fill: "none", stroke: "#00897B", strokeWidth: "2" })
16533
- ] }),
16534
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "3px" }, children: "Wide Moat" }),
16535
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "23px" }, children: "Narrow Moat" }),
16536
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "43px" }, children: "No Moat" }),
16537
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: 0 }, children: "2020" }),
16538
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "45px" }, children: "2021" }),
16539
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "90px" }, children: "2022" }),
16540
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "135px" }, children: "2023" }),
16541
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", right: 0 }, children: "2025" })
16542
- ] })
16518
+ /* @__PURE__ */ jsx(PricingDetailLabel, { children: "Property Moat" }),
16519
+ /* @__PURE__ */ jsx(PricingDetailValue, { style: { color: "#00897B", marginBottom: "0.5rem" }, children: valSummary?.propertyMoat ?? (valSummary ? "Wide" : /* @__PURE__ */ jsx(Skeleton, { width: 60, height: 16 })) }),
16520
+ /* @__PURE__ */ jsxs(MiniChartContainer, { children: [
16521
+ /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16522
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(0, 137, 123, 0.2)" }),
16523
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(102, 187, 106, 0.15)" }),
16524
+ /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(200, 230, 201, 0.15)" }),
16525
+ /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16526
+ /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16527
+ /* @__PURE__ */ jsx("path", { d: "M0,15 C10,12 20,8 30,10 C40,5 50,12 60,8 C70,15 80,10 90,5 C100,12 110,8 120,15 C130,10 140,5 150,12 C160,8 170,10 180,5", fill: "none", stroke: "#00897B", strokeWidth: "2" })
16528
+ ] }),
16529
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "3px" }, children: "Wide Moat" }),
16530
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "23px" }, children: "Narrow Moat" }),
16531
+ /* @__PURE__ */ jsx(MiniChartLabel, { style: { top: "43px" }, children: "No Moat" }),
16532
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "0" }, children: "2020" }),
16533
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "25%" }, children: "2021" }),
16534
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "50%" }, children: "2022" }),
16535
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { left: "75%" }, children: "2023" }),
16536
+ /* @__PURE__ */ jsx(MiniChartYearLabel, { style: { right: "0", left: "auto" }, children: "2025" })
16543
16537
  ] })
16544
16538
  ] })
16545
16539
  ] }),
16546
- /* @__PURE__ */ jsxs(ValuationIndicator, { className: "desktop-only-valuation", children: [
16540
+ /* @__PURE__ */ jsxs(ValuationIndicator, { children: [
16547
16541
  /* @__PURE__ */ jsxs(ValuationHeader, { children: [
16548
16542
  /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#4CAF50" }, children: "Undervalued" }),
16549
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "var(--color-accent)" }, children: "Fair Value" }),
16543
+ /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#D4AF37" }, children: "Fair Value" }),
16550
16544
  /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#F44336" }, children: "Overvalued" })
16551
16545
  ] }),
16552
16546
  /* @__PURE__ */ jsxs(ValuationGauge, { children: [
16553
16547
  /* @__PURE__ */ jsx(GaugeBackground, {}),
16554
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
16555
- /* @__PURE__ */ jsxs(GaugePriceTag, { position: gaugePosition, children: [
16556
- /* @__PURE__ */ jsx("span", { children: "Last Price" }),
16557
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(lastPrice) })
16558
- ] }),
16559
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "lastPrice", position: gaugePosition })
16548
+ /* @__PURE__ */ jsx(GaugeIndicator, { $position: gaugePosition }),
16549
+ /* @__PURE__ */ jsxs(GaugePriceTag, { $position: gaugePosition, children: [
16550
+ /* @__PURE__ */ jsx("span", { children: "IPO Price" }),
16551
+ /* @__PURE__ */ jsx("span", { style: { color: "#D4AF37" }, children: tokenPriceValue != null ? `$${tokenPriceValue.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : /* @__PURE__ */ jsx(Skeleton, { width: 60, height: 12 }) })
16552
+ ] })
16560
16553
  ] }),
16561
16554
  /* @__PURE__ */ jsxs(ValuationDetails, { children: [
16562
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#0ecb81" }, children: [
16555
+ /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsx(ValuationValue, { style: { color: "#4CAF50" }, children: valSummary?.undervaluedThreshold != null ? /* @__PURE__ */ jsxs(Fragment, { children: [
16563
16556
  /* @__PURE__ */ jsxs("span", { children: [
16564
16557
  "< ",
16565
- formatCurrency5(undervaluedThreshold)
16558
+ `$${valSummary.undervaluedThreshold.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`
16566
16559
  ] }),
16567
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16568
- "(",
16569
- formatMillions(undervaluedThreshold * tokensOutstanding),
16570
- ")"
16560
+ totalUnits > 0 && /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.8rem", fontWeight: "normal", color: "rgba(255,255,255,0.6)" }, children: [
16561
+ "($",
16562
+ (valSummary.undervaluedThreshold * totalUnits / 1e6).toFixed(1),
16563
+ "m)"
16571
16564
  ] })
16572
- ] }) }),
16573
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#f0b90b" }, children: [
16574
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(fairValue) }),
16575
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16576
- "(",
16577
- formatMillions(fairValue * tokensOutstanding),
16578
- ")"
16565
+ ] }) : /* @__PURE__ */ jsx(Skeleton, { width: 90, height: 16 }) }) }),
16566
+ /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsx(ValuationValue, { style: { color: "#D4AF37" }, children: tokenPriceValue != null ? /* @__PURE__ */ jsxs(Fragment, { children: [
16567
+ /* @__PURE__ */ jsx("span", { children: `$${tokenPriceValue.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` }),
16568
+ totalUnits > 0 && /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.8rem", fontWeight: "normal", color: "rgba(255,255,255,0.6)" }, children: [
16569
+ "($",
16570
+ (tokenPriceValue * totalUnits / 1e6).toFixed(1),
16571
+ "m)"
16579
16572
  ] })
16580
- ] }) }),
16581
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#f6465d" }, children: [
16573
+ ] }) : /* @__PURE__ */ jsx(Skeleton, { width: 90, height: 16 }) }) }),
16574
+ /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsx(ValuationValue, { style: { color: "#F44336" }, children: valSummary?.overvaluedThreshold != null ? /* @__PURE__ */ jsxs(Fragment, { children: [
16582
16575
  /* @__PURE__ */ jsxs("span", { children: [
16583
16576
  "> ",
16584
- formatCurrency5(overvaluedThreshold)
16577
+ `$${valSummary.overvaluedThreshold.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`
16585
16578
  ] }),
16586
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16587
- "(",
16588
- formatMillions(overvaluedThreshold * tokensOutstanding),
16589
- ")"
16579
+ totalUnits > 0 && /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.8rem", fontWeight: "normal", color: "rgba(255,255,255,0.6)" }, children: [
16580
+ "($",
16581
+ (valSummary.overvaluedThreshold * totalUnits / 1e6).toFixed(1),
16582
+ "m)"
16590
16583
  ] })
16591
- ] }) })
16592
- ] })
16593
- ] }),
16594
- /* @__PURE__ */ jsx("h3", { className: "desktop-only-historical-chart", style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
16595
- /* @__PURE__ */ jsx(ChartContainer, { className: "desktop-only-historical-chart", children: /* @__PURE__ */ jsxs(ChartBackground, { children: [
16596
- axisLabels.map((label, index) => /* @__PURE__ */ jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
16597
- /* @__PURE__ */ jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
16598
- valuationPath ? /* @__PURE__ */ jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
16599
- fairValuePath ? /* @__PURE__ */ jsx("path", { d: fairValuePath, fill: "none", stroke: "#FFFFFF", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null
16584
+ ] }) : /* @__PURE__ */ jsx(Skeleton, { width: 90, height: 16 }) }) })
16600
16585
  ] })
16601
- ] }) })
16602
- ] })
16586
+ ] })
16587
+ ] }) })
16603
16588
  ] }),
16604
- /* @__PURE__ */ jsxs(RecentSalesSection, { children: [
16605
- /* @__PURE__ */ jsx(SectionSubheading, { children: "Recent Sales in Comparable Suburbs" }),
16606
- /* @__PURE__ */ jsxs(SwipeIndicator, { children: [
16607
- "Swipe to see more",
16608
- /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z" }) })
16589
+ /* @__PURE__ */ jsx(BlurredContent, { children: /* @__PURE__ */ jsxs(ValuationSection, { children: [
16590
+ /* @__PURE__ */ jsxs(ValuationSectionTitle, { children: [
16591
+ "Returns Comparison (Modelled for ",
16592
+ propertyTitle,
16593
+ ")"
16609
16594
  ] }),
16610
- /* @__PURE__ */ jsx(SalesGrid, { children: recentSales.map((sale, index) => /* @__PURE__ */ jsxs(SaleCard, { children: [
16611
- /* @__PURE__ */ jsxs(SaleImageContainer, { children: [
16612
- /* @__PURE__ */ jsx(
16613
- SaleImage,
16595
+ /* @__PURE__ */ jsxs(MainChartContainer, { children: [
16596
+ /* @__PURE__ */ jsx(Line, { options: chartOptions, data: chartData }),
16597
+ /* @__PURE__ */ jsx(ChartOverlayTitle, { children: "20yr Performance (2006-2026)" }),
16598
+ /* @__PURE__ */ jsx(ChartLegendColumn, { children: musgraveComparisonData.datasets.map((dataset, i) => {
16599
+ const growth = (dataset.data[dataset.data.length - 1] - 100).toFixed(0);
16600
+ return /* @__PURE__ */ jsxs(ChartLegendItem, { style: { color: dataset.color }, children: [
16601
+ /* @__PURE__ */ jsx(ChartLegendDot, { style: { backgroundColor: dataset.color } }),
16602
+ dataset.name,
16603
+ " ",
16604
+ Number(growth) >= 0 ? "+" : "",
16605
+ growth,
16606
+ "%"
16607
+ ] }, i);
16608
+ }) })
16609
+ ] }),
16610
+ /* @__PURE__ */ jsxs(SaleHistoryBox, { children: [
16611
+ /* @__PURE__ */ jsx(SaleHistoryLabel, { children: "Sale History" }),
16612
+ /* @__PURE__ */ jsx(SaleHistoryGrid, { children: musgraveComparisonData.saleMarkers.map((marker, i) => {
16613
+ const displayPrice = marker.year === "2026" && offeringValuationValue ? `$${(offeringValuationValue / 1e6).toFixed(0)}M` : marker.price;
16614
+ return /* @__PURE__ */ jsxs(
16615
+ SaleHistoryItem,
16614
16616
  {
16615
- src: sale.imageUrl ?? "https://images.unsplash.com/photo-1505693314120-0d443867891c?auto=format&fit=crop&w=1200&q=80",
16616
- alt: sale.address ?? "Recent sale"
16617
- }
16618
- ),
16619
- /* @__PURE__ */ jsxs(SoldTag, { children: [
16620
- "SOLD",
16621
- /* @__PURE__ */ jsx(SoldIcon, {})
16622
- ] })
16623
- ] }),
16624
- /* @__PURE__ */ jsxs(SalePriceBar, { children: [
16625
- /* @__PURE__ */ jsxs(SalePriceLeft, { children: [
16626
- /* @__PURE__ */ jsx(SalePriceLabel, { children: "Sale Price" }),
16627
- /* @__PURE__ */ jsx(SalePriceAmount, { children: formatCurrency5(sale.price) })
16628
- ] }),
16629
- /* @__PURE__ */ jsx(SaleDate, { children: sale.saleDate ?? "\u2014" })
16630
- ] }),
16631
- /* @__PURE__ */ jsxs(SaleContent, { children: [
16632
- /* @__PURE__ */ jsx(SaleAddress, { children: sale.address ?? "Private Sale" }),
16633
- /* @__PURE__ */ jsx(SaleSuburb, { children: sale.suburb ?? "" })
16634
- ] }),
16635
- /* @__PURE__ */ jsxs(SaleStatsBar, { children: [
16636
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem" }, children: [
16637
- /* @__PURE__ */ jsxs(SaleStatItem, { children: [
16638
- /* @__PURE__ */ jsx(BedIcon, {}),
16639
- formatBedroomLabel(sale.bedrooms)
16640
- ] }),
16641
- /* @__PURE__ */ jsxs(SaleStatItem, { children: [
16642
- /* @__PURE__ */ jsx(BathIcon, {}),
16643
- formatBathroomLabel(sale.bathrooms)
16644
- ] })
16645
- ] }),
16646
- /* @__PURE__ */ jsx(SaleStatItem, { style: { color: "var(--color-text-secondary)" }, children: sale.landSize ?? "\u2014" })
16647
- ] })
16648
- ] }, `${sale.address ?? sale.suburb ?? "sale"}-${index}`)) })
16649
- ] }),
16650
- loading ? /* @__PURE__ */ jsx(LoadingOverlay, { children: "Loading valuation data\u2026" }) : null,
16651
- error ? /* @__PURE__ */ jsx(ErrorMessage, { children: error }) : null
16617
+ onMouseEnter: () => handleMarkerEnter(marker.year),
16618
+ onMouseLeave: handleMarkerLeave,
16619
+ $active: hoveredSaleYear === marker.year,
16620
+ children: [
16621
+ /* @__PURE__ */ jsx(
16622
+ SaleHistoryDot,
16623
+ {
16624
+ $active: hoveredSaleYear === marker.year,
16625
+ style: {
16626
+ backgroundColor: marker.year === "2006" ? "#4CAF50" : marker.year === "2021" ? "#FF5722" : "#D4AF37",
16627
+ boxShadow: hoveredSaleYear === marker.year ? `0 0 12px ${marker.year === "2006" ? "#4CAF50" : marker.year === "2021" ? "#FF5722" : "#D4AF37"}` : "none"
16628
+ }
16629
+ }
16630
+ ),
16631
+ /* @__PURE__ */ jsxs("div", { children: [
16632
+ /* @__PURE__ */ jsxs("div", { style: { fontSize: "0.8rem", fontWeight: "600", color: "var(--color-text, #f8f9fa)", marginBottom: "2px" }, children: [
16633
+ marker.year,
16634
+ ": ",
16635
+ marker.label,
16636
+ " \u2014 ",
16637
+ displayPrice
16638
+ ] }),
16639
+ marker.description && /* @__PURE__ */ jsx("div", { style: { fontSize: "0.7rem", color: "var(--color-text-secondary, #848e9c)", lineHeight: "1.3" }, children: marker.description })
16640
+ ] })
16641
+ ]
16642
+ },
16643
+ i
16644
+ );
16645
+ }) })
16646
+ ] }),
16647
+ /* @__PURE__ */ jsx("div", { style: { fontSize: "0.8rem", color: "var(--color-text-secondary, #848e9c)", textAlign: "center", marginBottom: "0.5rem" }, children: "Mosman Heritage properties of this calibre are beyond scarce, and have consistently outperformed broader markets with lower volatility" }),
16648
+ /* @__PURE__ */ jsx("div", { style: { fontSize: "0.65rem", color: "var(--color-text-secondary, #848e9c)", textAlign: "center", opacity: 0.7 }, children: "Sources: CoreLogic, Bloomberg, RBA" })
16649
+ ] }) })
16652
16650
  ] });
16653
16651
  }
16654
- function formatCurrency5(value, options) {
16655
- if (value == null || Number.isNaN(value)) {
16656
- return "\u2014";
16657
- }
16658
- const { minimumFractionDigits = 2, maximumFractionDigits = 2, ...rest } = options ?? {};
16659
- const minDigits = Math.max(0, Math.min(20, minimumFractionDigits));
16660
- const maxDigits = Math.max(minDigits, Math.min(20, maximumFractionDigits));
16661
- return value.toLocaleString("en-US", {
16662
- style: "currency",
16663
- currency: "USD",
16664
- minimumFractionDigits: minDigits,
16665
- maximumFractionDigits: maxDigits,
16666
- ...rest
16667
- });
16668
- }
16669
- function formatMillions(value) {
16670
- if (!Number.isFinite(value) || value === 0) {
16671
- return "$0m";
16672
- }
16673
- return `$${(value / 1e6).toFixed(2)}m`;
16674
- }
16675
- function formatBedroomLabel(bedrooms) {
16676
- if (!Number.isFinite(bedrooms)) return "\u2014";
16677
- return `${bedrooms} Bed`;
16678
- }
16679
- function formatBathroomLabel(bathrooms) {
16680
- if (!Number.isFinite(bathrooms)) return "\u2014";
16681
- return `${bathrooms} Bath`;
16682
- }
16683
- function buildChartPaths(history, fallbackValue) {
16684
- if (!history.length) {
16685
- return { valuationPath: null, fairValuePath: null, axisLabels: ["$0", "$0", "$0", "$0", "$0"] };
16686
- }
16687
- const values = history.map((point) => point.valuation);
16688
- const minValue = Math.min(...values);
16689
- const maxValue = Math.max(...values);
16690
- const minTime = Math.min(...history.map((point) => point.timestamp));
16691
- const maxTime = Math.max(...history.map((point) => point.timestamp));
16692
- const adjustedMinValue = minValue === maxValue ? minValue * 0.9 : minValue;
16693
- const adjustedMaxValue = minValue === maxValue ? maxValue * 1.1 : maxValue;
16694
- const valuationSegments = history.map((point, index) => {
16695
- const x = normalize(point.timestamp, minTime, maxTime, CHART_PADDING, CHART_WIDTH - CHART_PADDING);
16696
- const y = mapValueToY(point.valuation, adjustedMinValue, adjustedMaxValue);
16697
- return `${index === 0 ? "M" : "L"} ${x} ${y}`;
16698
- });
16699
- const fairValuePoints = history.filter((point) => Number.isFinite(point.fairValue));
16700
- const fairValueSegments = fairValuePoints.map((point, index) => {
16701
- const x = normalize(point.timestamp, minTime, maxTime, CHART_PADDING, CHART_WIDTH - CHART_PADDING);
16702
- const y = mapValueToY(point.fairValue ?? fallbackValue, adjustedMinValue, adjustedMaxValue);
16703
- return `${index === 0 ? "M" : "L"} ${x} ${y}`;
16704
- });
16705
- const axisLabels = buildAxisLabels(adjustedMinValue, adjustedMaxValue);
16706
- return {
16707
- valuationPath: valuationSegments.length > 1 ? valuationSegments.join(" ") : null,
16708
- fairValuePath: fairValueSegments.length > 1 ? fairValueSegments.join(" ") : null,
16709
- axisLabels
16710
- };
16711
- }
16712
- function normalize(value, min, max, targetMin, targetMax) {
16713
- if (max === min) return (targetMin + targetMax) / 2;
16714
- return targetMin + (value - min) / (max - min) * (targetMax - targetMin);
16715
- }
16716
- function mapValueToY(value, min, max) {
16717
- const normalized = normalize(value, min, max, 0, 1);
16718
- const clamped = Math.min(1, Math.max(0, normalized));
16719
- const drawableHeight = CHART_HEIGHT - CHART_PADDING * 2;
16720
- return CHART_PADDING + (1 - clamped) * drawableHeight;
16721
- }
16722
- function buildAxisLabels(min, max) {
16723
- const steps = 5;
16724
- const labels = [];
16725
- for (let i = 0; i < steps; i += 1) {
16726
- const ratio = i / (steps - 1);
16727
- const value = max - ratio * (max - min);
16728
- labels.push(formatCurrency5(value, { maximumFractionDigits: 0, minimumFractionDigits: 0 }));
16729
- }
16730
- return labels;
16731
- }
16732
- function calculatePositionFromPrice(price, undervaluedPrice, fairValue, overvaluedPrice) {
16733
- if (price <= undervaluedPrice) return 0;
16734
- if (price >= overvaluedPrice) return 100;
16735
- if (price < fairValue) {
16736
- return 50 * (price - undervaluedPrice) / (fairValue - undervaluedPrice);
16737
- }
16738
- return 50 + 50 * (price - fairValue) / (overvaluedPrice - fairValue);
16739
- }
16740
- var ValuationIndicator = styled9.div`
16741
- background-color: rgba(50, 52, 58, 0.95);
16742
- border-radius: 6px;
16743
- padding: 1rem;
16744
- margin-top: 1.5rem;
16745
- margin-bottom: 1.5rem;
16746
-
16747
- &.desktop-only-valuation {
16748
- @media (max-width: 480px) {
16749
- display: none;
16750
- }
16751
- }
16752
-
16753
- &.mobile-only-valuation {
16754
- display: none;
16755
- @media (max-width: 480px) {
16756
- display: block;
16757
- margin-top: 1rem;
16758
- margin-bottom: 1rem;
16759
- }
16760
- }
16761
- `;
16762
- var GaugeIndicator = styled9.div`
16763
- position: absolute;
16764
- left: ${(props) => props.position}%;
16765
- top: 0.35rem;
16766
- transform: translateX(-50%);
16767
- width: 3px;
16768
- height: 36px;
16769
- border-radius: 999px;
16770
- background: ${(props) => props.type === "fairValue" ? "#f0b90b" : "rgba(10, 12, 18, 0.95)"};
16771
- box-shadow: ${(props) => props.type === "lastPrice" ? "0 6px 18px rgba(0, 0, 0, 0.65)" : "0 6px 16px rgba(0, 0, 0, 0.45)"};
16652
+ var BlurredContent = styled9.div`
16653
+ filter: blur(8px);
16654
+ pointer-events: none;
16655
+ user-select: none;
16656
+ overflow: hidden;
16772
16657
  `;
16773
- var GaugePriceTag = styled9.div`
16774
- position: absolute;
16775
- left: ${(props) => props.position}%;
16776
- top: -46px;
16777
- transform: translateX(-50%);
16778
- background: rgba(7, 9, 13, 0.85);
16779
- border: 1px solid rgba(255, 255, 255, 0.1);
16780
- border-radius: 8px;
16781
- padding: 6px 10px;
16782
- font-size: 0.75rem;
16658
+ var ValuationHeading = styled9.h2`
16659
+ font-size: 1.4rem;
16660
+ font-weight: 600;
16783
16661
  color: #fff;
16784
- font-weight: 500;
16785
- display: flex;
16786
- flex-direction: column;
16787
- gap: 2px;
16788
- text-align: center;
16789
- backdrop-filter: blur(6px);
16662
+ margin: 0 0 1.5rem;
16790
16663
 
16791
- span:last-child {
16792
- font-size: 0.95em;
16793
- font-weight: 600;
16794
- letter-spacing: 0.2px;
16795
- color: var(--color-accent);
16796
- }
16797
- `;
16798
- var HiddenMobileChart = styled9.div`
16799
- display: none;
16800
16664
  @media (max-width: 480px) {
16801
- display: block;
16665
+ font-size: 1.15rem;
16666
+ margin-bottom: 1rem;
16802
16667
  }
16803
16668
  `;
16804
- var ValuationWrapper = styled9.div`
16805
- display: flex;
16806
- flex-direction: column;
16807
- gap: 2rem;
16808
- `;
16809
- var LoadingOverlay = styled9.div`
16810
- margin-top: 1rem;
16811
- padding: 0.75rem 1rem;
16812
- border-radius: 8px;
16813
- background: rgba(255, 255, 255, 0.05);
16814
- color: rgba(255, 255, 255, 0.8);
16815
- font-size: 0.9rem;
16816
- `;
16817
- var ErrorMessage = styled9.div`
16818
- margin-top: 1rem;
16819
- padding: 0.75rem 1rem;
16820
- border-radius: 8px;
16821
- background: rgba(244, 67, 54, 0.15);
16822
- color: #ff8a80;
16823
- font-size: 0.9rem;
16824
- border: 1px solid rgba(244, 67, 54, 0.4);
16825
- `;
16826
- var SectionTitle = styled9.h2`
16827
- margin: 0;
16828
- font-size: clamp(1.75rem, 2.5vw, 2.25rem);
16829
- font-weight: 600;
16830
- color: #fff;
16831
- letter-spacing: 0.01em;
16832
- `;
16833
16669
  var LoafPricingSection = styled9.div`
16834
16670
  background-color: rgba(30, 32, 38, 0.95);
16835
16671
  border-radius: 8px;
16836
16672
  padding: 1.25rem;
16837
16673
  margin-bottom: 1.5rem;
16838
- `;
16839
- var SectionSubheading = styled9.h2`
16840
- margin: 0;
16841
- font-size: 1.1rem;
16842
- font-weight: 600;
16843
- color: #fff;
16844
- letter-spacing: 0.02em;
16674
+
16675
+ @media (max-width: 768px) {
16676
+ padding: 1rem;
16677
+ overflow: hidden;
16678
+ }
16679
+
16680
+ @media (max-width: 480px) {
16681
+ padding: 0.75rem;
16682
+ border-radius: 6px;
16683
+ }
16845
16684
  `;
16846
16685
  var PricingModelCard = styled9.div`
16847
16686
  background-color: rgba(40, 42, 48, 0.95);
16848
16687
  border-radius: 8px;
16849
16688
  padding: 1.5rem;
16850
16689
  margin-top: 1rem;
16690
+
16691
+ @media (max-width: 768px) {
16692
+ padding: 1rem;
16693
+ }
16694
+
16695
+ @media (max-width: 480px) {
16696
+ padding: 0.75rem;
16697
+ }
16851
16698
  `;
16852
16699
  var PricingModelHeader = styled9.div`
16853
16700
  display: flex;
16854
16701
  justify-content: space-between;
16855
16702
  align-items: center;
16856
16703
  margin-bottom: 1.5rem;
16704
+ flex-wrap: wrap;
16857
16705
  gap: 1rem;
16858
16706
 
16859
- .valuation-info {
16860
- display: flex;
16707
+ @media (max-width: 480px) {
16861
16708
  flex-direction: column;
16862
- gap: 0.25rem;
16863
- font-size: 0.85rem;
16864
- color: rgba(255, 255, 255, 0.75);
16709
+ align-items: flex-start;
16710
+ gap: 0.5rem;
16711
+ margin-bottom: 1rem;
16865
16712
  }
16866
16713
  `;
16867
16714
  var PricingModelTitle = styled9.h3`
@@ -16869,14 +16716,9 @@ var PricingModelTitle = styled9.h3`
16869
16716
  font-size: 1.2rem;
16870
16717
  font-weight: 600;
16871
16718
  color: #fff;
16872
- `;
16873
- var PricingModelValue = styled9.div`
16874
- font-size: 1.4rem;
16875
- font-weight: 700;
16876
- color: var(--color-primary);
16877
16719
 
16878
- @media (max-width: 768px) {
16879
- font-size: 1.2rem;
16720
+ @media (max-width: 480px) {
16721
+ font-size: 1rem;
16880
16722
  }
16881
16723
  `;
16882
16724
  var PricingModelDetails = styled9.div`
@@ -16884,13 +16726,27 @@ var PricingModelDetails = styled9.div`
16884
16726
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
16885
16727
  gap: 1.5rem;
16886
16728
  margin-bottom: 1.5rem;
16729
+
16730
+ @media (max-width: 768px) {
16731
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
16732
+ gap: 1rem;
16733
+ }
16734
+
16735
+ @media (max-width: 480px) {
16736
+ grid-template-columns: 1fr;
16737
+ gap: 0.75rem;
16738
+ }
16887
16739
  `;
16888
16740
  var PricingModelDetail = styled9.div`
16889
16741
  background-color: rgba(50, 52, 58, 0.95);
16890
16742
  border-radius: 6px;
16891
16743
  padding: 1rem;
16744
+
16745
+ @media (max-width: 480px) {
16746
+ padding: 0.75rem;
16747
+ }
16892
16748
  `;
16893
- var PropertyDetailLabel = styled9.div`
16749
+ var PricingDetailLabel = styled9.div`
16894
16750
  font-size: 0.85rem;
16895
16751
  color: rgba(255, 255, 255, 0.7);
16896
16752
  margin-bottom: 0.5rem;
@@ -16900,6 +16756,35 @@ var PricingDetailValue = styled9.div`
16900
16756
  color: #fff;
16901
16757
  font-weight: 500;
16902
16758
  `;
16759
+ var MiniChartContainer = styled9.div`
16760
+ height: 60px;
16761
+ width: 100%;
16762
+ position: relative;
16763
+ margin-bottom: 15px;
16764
+ `;
16765
+ var MiniChartLabel = styled9.div`
16766
+ position: absolute;
16767
+ right: 5px;
16768
+ font-size: 9px;
16769
+ color: rgba(255, 255, 255, 0.7);
16770
+ `;
16771
+ var MiniChartYearLabel = styled9.div`
16772
+ position: absolute;
16773
+ bottom: -15px;
16774
+ font-size: 9px;
16775
+ color: rgba(255, 255, 255, 0.5);
16776
+ `;
16777
+ var ValuationIndicator = styled9.div`
16778
+ background-color: rgba(50, 52, 58, 0.95);
16779
+ border-radius: 6px;
16780
+ padding: 1rem;
16781
+ margin-top: 1.5rem;
16782
+ margin-bottom: 1.5rem;
16783
+
16784
+ @media (max-width: 480px) {
16785
+ padding: 0.75rem;
16786
+ }
16787
+ `;
16903
16788
  var ValuationHeader = styled9.div`
16904
16789
  display: flex;
16905
16790
  justify-content: space-between;
@@ -16907,277 +16792,219 @@ var ValuationHeader = styled9.div`
16907
16792
  `;
16908
16793
  var ValuationTitle = styled9.div`
16909
16794
  font-size: 0.9rem;
16910
- color: rgba(255, 255, 255, 0.7);
16795
+ font-weight: 500;
16796
+
16797
+ @media (max-width: 480px) {
16798
+ font-size: 0.75rem;
16799
+ }
16911
16800
  `;
16912
16801
  var ValuationGauge = styled9.div`
16913
16802
  position: relative;
16914
16803
  width: 100%;
16915
16804
  padding: 1.1rem 0 2rem;
16916
- margin: 0.75rem 0 1rem;
16917
16805
  `;
16918
16806
  var GaugeBackground = styled9.div`
16919
- width: 100%;
16920
- height: 18px;
16921
- border-radius: 999px;
16922
- background: linear-gradient(90deg, #0ecb81 0%, #4dd482 30%, #f8e36c 50%, #f98b6c 70%, #f6465d 100%);
16923
- position: relative;
16924
- overflow: hidden;
16925
- box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.35), 0 8px 18px rgba(0, 0, 0, 0.25);
16807
+ height: 8px;
16808
+ border-radius: 4px;
16809
+ background: linear-gradient(to right, #4CAF50 0%, #4CAF50 33%, #D4AF37 33%, #D4AF37 66%, #F44336 66%, #F44336 100%);
16810
+ `;
16811
+ var GaugeIndicator = styled9.div`
16812
+ position: absolute;
16813
+ top: 0;
16814
+ left: ${(props) => props.$position}%;
16815
+ transform: translateX(-50%);
16816
+ width: 3px;
16817
+ height: 30px;
16818
+ background: #D4AF37;
16819
+ border-radius: 2px;
16820
+ `;
16821
+ var GaugePriceTag = styled9.div`
16822
+ position: absolute;
16823
+ left: ${(props) => props.$position}%;
16824
+ top: -30px;
16825
+ transform: translateX(-50%);
16826
+ background: rgba(0, 0, 0, 0.8);
16827
+ padding: 4px 8px;
16828
+ border-radius: 4px;
16829
+ font-size: 0.75rem;
16830
+ white-space: nowrap;
16831
+ display: flex;
16832
+ flex-direction: column;
16833
+ align-items: center;
16834
+
16835
+ span:first-child {
16836
+ color: rgba(255, 255, 255, 0.5);
16837
+ font-size: 0.65rem;
16838
+ }
16839
+
16840
+ span:last-child {
16841
+ color: #fff;
16842
+ font-weight: 600;
16843
+ }
16926
16844
  `;
16927
16845
  var ValuationDetails = styled9.div`
16928
16846
  display: flex;
16929
16847
  justify-content: space-between;
16930
16848
  margin-top: 1rem;
16849
+
16850
+ @media (max-width: 480px) {
16851
+ gap: 0.25rem;
16852
+ }
16931
16853
  `;
16932
16854
  var ValuationItem = styled9.div`
16933
16855
  display: flex;
16934
16856
  flex-direction: column;
16857
+
16858
+ &:nth-child(2) {
16859
+ text-align: center;
16860
+ }
16861
+
16862
+ &:last-child {
16863
+ text-align: right;
16864
+ }
16935
16865
  `;
16936
16866
  var ValuationValue = styled9.div`
16937
16867
  font-size: 1rem;
16938
16868
  font-weight: 600;
16939
- color: #fff;
16940
- `;
16941
- var ChartContainer = styled9.div`
16942
- width: 100%;
16943
- height: 301.52px;
16944
- margin-top: 1.5rem;
16945
- background-color: rgba(50, 52, 58, 0.5);
16946
- border-radius: 6px;
16947
- padding: 1rem;
16948
- position: relative;
16949
- `;
16950
- var ChartBackground = styled9.div`
16951
- position: relative;
16952
- height: 100%;
16953
- width: 100%;
16954
- background: rgba(255, 255, 255, 0.03);
16955
- border-radius: 8px;
16956
- `;
16957
- var ValuationSvg = styled9.svg`
16958
- position: absolute;
16959
- top: 10px;
16960
- right: 0;
16961
- bottom: 25px;
16962
- left: 0;
16963
- overflow: visible;
16964
- width: 100%;
16965
- height: calc(100% - 35px);
16966
- `;
16967
- var YAxisLabel = styled9.div`
16968
- position: absolute;
16969
- left: -40px;
16970
- font-size: 10px;
16971
- color: rgba(255, 255, 255, 0.6);
16972
- text-align: right;
16973
- padding-right: 5px;
16974
- `;
16975
- var ValuationCallout = styled9.div`
16976
16869
  display: flex;
16977
- align-items: center;
16978
- justify-content: space-between;
16979
- background: linear-gradient(90deg, rgba(76, 175, 80, 0.05) 0%, rgba(76, 175, 80, 0.1) 100%);
16980
- border-radius: 8px;
16981
- padding: 10px 16px;
16982
- border: 1px solid rgba(76, 175, 80, 0.2);
16983
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
16984
- `;
16985
- var ValuationBadge = styled9.div`
16986
- background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%);
16987
- color: white;
16988
- padding: 5px 12px;
16989
- border-radius: 20px;
16990
- font-size: 14px;
16991
- font-weight: 600;
16992
- box-shadow: 0 2px 4px rgba(76, 175, 80, 0.25);
16993
- `;
16994
- var AreaDemandChart = styled9.div`
16995
- height: 60px;
16996
- width: 100%;
16997
- position: relative;
16998
- `;
16999
- var ChartLabel = styled9.div`
17000
- position: absolute;
17001
- font-size: 9px;
17002
- color: rgba(255, 255, 255, 0.7);
17003
- `;
17004
- var RecentSalesSection = styled9.div`
17005
- background-color: rgba(30, 32, 38, 0.95);
17006
- border-radius: 8px;
17007
- padding: 1.25rem;
17008
- margin-bottom: 1.5rem;
16870
+ flex-direction: column;
16871
+ gap: 0.15rem;
17009
16872
 
17010
- @media (max-width: 768px) {
17011
- position: relative;
16873
+ @media (max-width: 480px) {
16874
+ font-size: 0.85rem;
17012
16875
  }
17013
16876
  `;
17014
- var SalesGrid = styled9.div`
17015
- display: grid;
17016
- grid-template-columns: repeat(3, 1fr);
17017
- gap: 1.5rem;
17018
- margin-top: 1rem;
16877
+ var ValuationSection = styled9.section`
16878
+ background-color: var(--color-card, rgba(30, 35, 41, 0.8));
16879
+ border-radius: 12px;
16880
+ padding: 1.5rem;
16881
+ margin-bottom: 1.5rem;
17019
16882
 
17020
16883
  @media (max-width: 768px) {
17021
- display: flex;
17022
- overflow-x: auto;
17023
- scroll-snap-type: x mandatory;
17024
- scroll-behavior: smooth;
17025
- -webkit-overflow-scrolling: touch;
17026
- gap: 1rem;
17027
- padding-bottom: 1rem;
17028
-
17029
- &::-webkit-scrollbar {
17030
- display: none;
17031
- }
17032
- scrollbar-width: none;
16884
+ overflow: hidden;
16885
+ box-sizing: border-box;
16886
+ padding: 1rem;
17033
16887
  }
17034
- `;
17035
- var SaleCard = styled9.div`
17036
- background-color: var(--color-card, #1e2329);
17037
- border-radius: var(--border-radius, 8px);
17038
- overflow: hidden;
17039
- transition: transform 0.2s ease, box-shadow 0.2s ease;
17040
- border: 1px solid rgba(255, 255, 255, 0.05);
17041
16888
 
17042
- &:hover {
17043
- transform: translateY(-4px);
17044
- box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
16889
+ @media (max-width: 480px) {
16890
+ padding: 0.75rem;
16891
+ border-radius: 8px;
17045
16892
  }
16893
+ `;
16894
+ var ValuationSectionTitle = styled9.h2`
16895
+ font-size: 0.9rem;
16896
+ font-weight: 600;
16897
+ padding-bottom: 0.75rem;
16898
+ margin-bottom: 1rem;
16899
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
16900
+ color: var(--color-text, #f8f9fa);
16901
+ display: flex;
16902
+ align-items: center;
16903
+ gap: 0.5rem;
16904
+ `;
16905
+ var MainChartContainer = styled9.div`
16906
+ position: relative;
16907
+ height: 450px;
16908
+ margin-bottom: 1rem;
17046
16909
 
17047
16910
  @media (max-width: 768px) {
17048
- min-width: 280px;
17049
- width: 85%;
17050
- scroll-snap-align: start;
17051
- flex-shrink: 0;
17052
- margin-right: 0.5rem;
17053
-
17054
- &:last-child {
17055
- margin-right: 1rem;
17056
- }
16911
+ height: 350px;
17057
16912
  }
17058
- `;
17059
- var SaleImageContainer = styled9.div`
17060
- position: relative;
17061
- width: 100%;
17062
- height: 200px;
17063
- overflow: hidden;
17064
- `;
17065
- var SaleImage = styled9.img`
17066
- width: 100%;
17067
- height: 100%;
17068
- object-fit: cover;
17069
- object-position: center;
17070
- transition: transform 0.3s ease;
17071
16913
 
17072
- ${SaleCard}:hover & {
17073
- transform: scale(1.05);
16914
+ @media (max-width: 480px) {
16915
+ height: 260px;
17074
16916
  }
17075
16917
  `;
17076
- var SoldTag = styled9.div`
16918
+ var ChartOverlayTitle = styled9.div`
17077
16919
  position: absolute;
17078
- top: 1rem;
17079
- right: 1rem;
17080
- background-color: var(--color-accent, #f0b90b);
17081
- color: var(--color-background, #0b0e11);
17082
- font-weight: 600;
17083
- font-size: 0.75rem;
17084
- padding: 0.25rem 0.5rem;
16920
+ left: 10px;
16921
+ top: 10px;
16922
+ font-size: 0.9rem;
16923
+ font-weight: 500;
16924
+ color: #f8f9fa;
16925
+ background-color: rgba(30, 32, 38, 0.7);
16926
+ padding: 2px 8px;
17085
16927
  border-radius: 4px;
17086
- display: flex;
17087
- align-items: center;
17088
- gap: 4px;
17089
- `;
17090
- var SoldIcon = styled9.div`
17091
- display: none;
17092
- `;
17093
- var SalePriceBar = styled9.div`
17094
- display: flex;
17095
- justify-content: space-between;
17096
- align-items: center;
17097
- padding: 0.75rem 1rem;
17098
- background: linear-gradient(90deg, rgba(240, 185, 11, 0.1) 0%, rgba(240, 185, 11, 0.05) 100%);
17099
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
16928
+ z-index: 10;
16929
+
16930
+ @media (max-width: 480px) {
16931
+ font-size: 0.7rem;
16932
+ padding: 2px 6px;
16933
+ }
17100
16934
  `;
17101
- var SalePriceLeft = styled9.div`
16935
+ var ChartLegendColumn = styled9.div`
16936
+ position: absolute;
16937
+ right: 10px;
16938
+ top: 40px;
17102
16939
  display: flex;
17103
16940
  flex-direction: column;
16941
+ gap: 6px;
16942
+ z-index: 10;
17104
16943
  `;
17105
- var SalePriceLabel = styled9.span`
16944
+ var ChartLegendItem = styled9.div`
17106
16945
  font-size: 0.7rem;
17107
- color: rgba(255, 255, 255, 0.5);
17108
- text-transform: uppercase;
17109
- letter-spacing: 0.5px;
16946
+ font-weight: 500;
16947
+ display: flex;
16948
+ align-items: center;
16949
+ background-color: rgba(30, 32, 38, 0.7);
16950
+ padding: 2px 6px;
16951
+ border-radius: 4px;
17110
16952
  `;
17111
- var SalePriceAmount = styled9.span`
17112
- font-size: 1.1rem;
17113
- font-weight: 700;
17114
- color: var(--color-accent, #f0b90b);
16953
+ var ChartLegendDot = styled9.span`
16954
+ display: inline-block;
16955
+ width: 8px;
16956
+ height: 8px;
16957
+ border-radius: 50%;
16958
+ margin-right: 6px;
16959
+ flex-shrink: 0;
17115
16960
  `;
17116
- var SaleContent = styled9.div`
17117
- padding: 1rem;
16961
+ var SaleHistoryBox = styled9.div`
16962
+ margin-bottom: 1rem;
16963
+ padding: 0.75rem;
16964
+ background: rgba(255, 255, 255, 0.03);
16965
+ border-radius: 8px;
16966
+ border: 1px solid rgba(255, 255, 255, 0.05);
17118
16967
  `;
17119
- var SaleAddress = styled9.h3`
17120
- margin: 0;
17121
- margin-bottom: 0.25rem;
17122
- font-size: 1rem;
16968
+ var SaleHistoryLabel = styled9.div`
16969
+ font-size: 0.7rem;
17123
16970
  font-weight: 600;
17124
- color: var(--color-text, #eaecef);
17125
- `;
17126
- var SaleSuburb = styled9.div`
17127
- font-size: 0.8rem;
17128
16971
  color: var(--color-text-secondary, #848e9c);
17129
- margin-bottom: 0.5rem;
17130
- `;
17131
- var SaleStatsBar = styled9.div`
17132
- display: flex;
17133
- justify-content: space-between;
17134
- align-items: center;
17135
- padding: 0.75rem 1rem;
17136
- background-color: rgba(0, 0, 0, 0.3);
17137
- border-top: 1px solid rgba(255, 255, 255, 0.05);
16972
+ text-transform: uppercase;
16973
+ letter-spacing: 0.1em;
16974
+ margin-bottom: 0.75rem;
17138
16975
  `;
17139
- var SaleStatItem = styled9.div`
16976
+ var SaleHistoryGrid = styled9.div`
17140
16977
  display: flex;
17141
- align-items: center;
17142
- gap: 0.25rem;
17143
- font-size: 0.8rem;
17144
- color: var(--color-text-secondary, #848e9c);
16978
+ flex-wrap: wrap;
16979
+ gap: 1rem;
17145
16980
 
17146
- svg {
17147
- width: 14px;
17148
- height: 14px;
17149
- opacity: 0.7;
16981
+ @media (max-width: 480px) {
16982
+ flex-direction: column;
16983
+ gap: 0.75rem;
17150
16984
  }
17151
16985
  `;
17152
- var SaleDate = styled9.div`
17153
- font-size: 0.75rem;
17154
- color: var(--color-text-secondary, #848e9c);
17155
- `;
17156
- var SwipeIndicator = styled9.div`
17157
- display: none;
17158
-
17159
- @media (max-width: 768px) {
17160
- display: flex;
17161
- align-items: center;
17162
- justify-content: center;
17163
- margin-top: 0.75rem;
17164
- color: rgba(255, 255, 255, 0.6);
17165
- font-size: 0.8rem;
17166
-
17167
- svg {
17168
- margin-left: 0.25rem;
17169
- animation: swipeAnimation 1.5s infinite;
17170
- }
16986
+ var SaleHistoryItem = styled9.div`
16987
+ display: flex;
16988
+ align-items: flex-start;
16989
+ gap: 0.5rem;
16990
+ flex: 1 1 200px;
16991
+ transition: transform 0.2s ease;
16992
+ transform: ${(props) => props.$active ? "scale(1.05)" : "scale(1)"};
16993
+ cursor: pointer;
17171
16994
 
17172
- @keyframes swipeAnimation {
17173
- 0% { transform: translateX(0); }
17174
- 50% { transform: translateX(5px); }
17175
- 100% { transform: translateX(0); }
17176
- }
16995
+ @media (max-width: 480px) {
16996
+ flex: 1 1 auto;
17177
16997
  }
17178
16998
  `;
17179
- var BedIcon = () => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M7 14c1.66 0 3-1.34 3-3S8.66 8 7 8s-3 1.34-3 3 1.34 3 3 3zm0-4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm12-3h-8v8H3V5H1v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4zm2 8h-8V9h6c1.1 0 2 .9 2 2v4z" }) });
17180
- var BathIcon = () => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M7 7c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm5 14H4v-2c0-2.21 1.79-4 4-4h2c2.21 0 4 1.79 4 4v2zm6-8h-2v-2h-2v2h-2v2h2v2h2v-2h2v-2z" }) });
16999
+ var SaleHistoryDot = styled9.div`
17000
+ width: ${(props) => props.$active ? "16px" : "12px"};
17001
+ height: ${(props) => props.$active ? "16px" : "12px"};
17002
+ border-radius: 50%;
17003
+ border: ${(props) => props.$active ? "3px solid #fff" : "2px solid #fff"};
17004
+ flex-shrink: 0;
17005
+ margin-top: 2px;
17006
+ transition: all 0.2s ease;
17007
+ `;
17181
17008
  var fadeIn = keyframes`
17182
17009
  from { opacity: 0; }
17183
17010
  to { opacity: 1; }