@loafmarkets/ui 0.1.359 → 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,24 +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
- }
9164
- ),
9165
- /* @__PURE__ */ jsx(FeaturesPanel, { children: features.map((item, i) => /* @__PURE__ */ jsxs(AssetFeatureItem, { children: [
9166
- item.icon && /* @__PURE__ */ jsx(AssetFeatureIcon, { children: item.icon }),
9167
- item.value && /* @__PURE__ */ jsx(AssetFeatureValue, { children: item.value }),
9168
- /* @__PURE__ */ jsx(AssetFeatureLabel, { children: item.label })
9169
- ] }, i)) })
9170
- ] }),
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
+ ) }),
9171
9174
  /* @__PURE__ */ jsxs(StatsColumn, { children: [
9172
9175
  /* @__PURE__ */ jsx(StatsColumnHeader, { children: "Asset Specification" }),
9173
9176
  /* @__PURE__ */ jsxs(StatRow, { children: [
@@ -16299,568 +16302,413 @@ var ActionButton = styled9.button`
16299
16302
  color: ${({ $variant }) => $variant === "danger" ? "#ff8f8f" : "#f4d07f"};
16300
16303
  }
16301
16304
  `;
16302
- var CHART_WIDTH = 1200;
16303
- var CHART_HEIGHT = 200;
16304
- var CHART_PADDING = 10;
16305
- var FALLBACK_RECENT_SALES = [
16306
- {
16307
- imageUrl: "https://images.unsplash.com/photo-1464146072230-91cabc968266?auto=format&fit=crop&w=1200&q=80",
16308
- price: 165e5,
16309
- saleDate: "Nov 2024",
16310
- address: "15 Wentworth Road",
16311
- suburb: "Vaucluse",
16312
- bedrooms: 5,
16313
- bathrooms: 5,
16314
- landSize: "1,420 sqm"
16315
- },
16316
- {
16317
- imageUrl: "https://images.unsplash.com/photo-1505691938895-1758d7feb511?auto=format&fit=crop&w=1200&q=80",
16318
- price: 149e5,
16319
- saleDate: "Sep 2024",
16320
- address: "42 Vaucluse Road",
16321
- suburb: "Vaucluse",
16322
- bedrooms: 4,
16323
- bathrooms: 4,
16324
- landSize: "980 sqm"
16325
- },
16326
- {
16327
- imageUrl: "https://images.unsplash.com/photo-1505693314120-0d443867891c?auto=format&fit=crop&w=1200&q=80",
16328
- price: 1325e4,
16329
- saleDate: "Jun 2024",
16330
- address: "18 Olola Avenue",
16331
- suburb: "Vaucluse",
16332
- bedrooms: 4,
16333
- bathrooms: 3,
16334
- landSize: "860 sqm"
16335
- }
16336
- ];
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
+ };
16337
16331
  function PropertyValuation({
16338
- propertyName,
16339
- tokenPrice,
16340
- totalTokens,
16341
- summary = null,
16342
- history = [],
16343
- loading = false,
16344
- error = null
16332
+ propertyTitle,
16333
+ tokenPriceValue,
16334
+ valSummary,
16335
+ offeringValuationValue,
16336
+ totalUnits
16345
16337
  }) {
16346
- const now = useMemo(() => /* @__PURE__ */ new Date(), []);
16347
- const lastPrice = useMemo(() => {
16348
- const fallback = Number.isFinite(tokenPrice) && tokenPrice > 0 ? tokenPrice : 0;
16349
- if (!summary?.lastPrice || summary.lastPrice <= 0) {
16350
- return fallback;
16351
- }
16352
- return summary.lastPrice;
16353
- }, [summary, tokenPrice]);
16354
- const fairValue = useMemo(() => {
16355
- if (summary?.fairValue && summary.fairValue > 0) {
16356
- return summary.fairValue;
16357
- }
16358
- return lastPrice || 1;
16359
- }, [summary, lastPrice]);
16360
- const tokensOutstanding = useMemo(() => {
16361
- if (summary?.totalTokens && summary.totalTokens > 0) {
16362
- return summary.totalTokens;
16363
- }
16364
- if (totalTokens && totalTokens > 0) {
16365
- 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));
16366
16346
  }
16367
- return 5e4;
16368
- }, [summary, totalTokens]);
16369
- const undervaluedThreshold = summary?.undervaluedThreshold ?? fairValue * 0.9;
16370
- const overvaluedThreshold = summary?.overvaluedThreshold ?? fairValue * 1.1;
16371
- const gaugePosition = calculatePositionFromPrice(lastPrice, undervaluedThreshold, fairValue, overvaluedThreshold);
16372
- const valuationStatus = summary?.valuationStatus ?? (lastPrice < fairValue ? "Undervalued" : lastPrice > fairValue ? "Overvalued" : "Fair Value");
16373
- const valuationDelta = summary?.valuationDeltaPercent ?? (lastPrice - fairValue) / fairValue * 100;
16374
- const valuationDeltaFormatted = `${valuationDelta >= 0 ? "+" : ""}${valuationDelta.toFixed(1)}%`;
16375
- const { valuationPath, fairValuePath, axisLabels } = useMemo(() => buildChartPaths(history, fairValue), [history, fairValue]);
16376
- const recentSales = useMemo(() => {
16377
- if (summary?.recentSales?.length) {
16378
- 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
+ }
16379
16390
  }
16380
- return FALLBACK_RECENT_SALES;
16381
- }, [summary]);
16382
- const areaDemandLabel = summary?.areaDemand ?? "Hot";
16383
- const propertyMoatLabel = summary?.propertyMoat ?? "Wide";
16384
- return /* @__PURE__ */ jsxs(ValuationWrapper, { children: [
16385
- /* @__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" }),
16386
16437
  /* @__PURE__ */ jsxs(LoafPricingSection, { children: [
16387
- /* @__PURE__ */ jsx(SectionSubheading, { children: "Loaf Pricing Model" }),
16388
- /* @__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: [
16389
16440
  /* @__PURE__ */ jsxs(PricingModelHeader, { children: [
16390
- /* @__PURE__ */ jsx(PricingModelTitle, { children: propertyName }),
16391
- /* @__PURE__ */ jsx(PricingModelValue, { children: /* @__PURE__ */ jsxs("div", { className: "valuation-info", children: [
16392
- /* @__PURE__ */ jsx("div", { children: "Valuation as of" }),
16393
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("span", { style: { color: "var(--color-accent)" }, children: now.toLocaleDateString("en-US", { day: "2-digit", month: "short", year: "numeric" }) }) }),
16394
- /* @__PURE__ */ jsxs("div", { children: [
16395
- 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" }),
16396
16447
  " AEST"
16397
16448
  ] })
16398
- ] }) })
16449
+ ] })
16399
16450
  ] }),
16400
16451
  /* @__PURE__ */ jsxs(PricingModelDetails, { children: [
16401
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [
16402
- /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16403
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Last Price" }),
16404
- /* @__PURE__ */ jsx(PricingDetailValue, { children: formatCurrency5(lastPrice) })
16405
- ] }),
16406
- /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16407
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", width: "100%" }, children: [
16408
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Fair Value" }),
16409
- /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.75rem", color: "#4CAF50", fontWeight: "bold" }, children: [
16410
- "Confidence: ",
16411
- summary?.confidence ?? "High"
16412
- ] })
16413
- ] }),
16414
- /* @__PURE__ */ jsxs(PricingDetailValue, { style: { color: "var(--color-accent)", fontWeight: "bold" }, children: [
16415
- formatCurrency5(fairValue),
16416
- " ",
16417
- /* @__PURE__ */ jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
16418
- "(",
16419
- formatCurrency5(fairValue * tokensOutstanding, { maximumFractionDigits: 0 }),
16420
- ")"
16421
- ] })
16422
- ] })
16423
- ] })
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 }) })
16424
16455
  ] }),
16425
- /* @__PURE__ */ jsxs(ValuationIndicator, { className: "mobile-only-valuation", children: [
16426
- /* @__PURE__ */ jsxs(ValuationHeader, { children: [
16427
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#4CAF50" }, children: "Undervalued" }),
16428
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "var(--color-accent)" }, children: "Fair Value" }),
16429
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#F44336" }, children: "Overvalued" })
16430
- ] }),
16431
- /* @__PURE__ */ jsxs(ValuationGauge, { children: [
16432
- /* @__PURE__ */ jsx(GaugeBackground, {}),
16433
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
16434
- /* @__PURE__ */ jsxs(GaugePriceTag, { position: gaugePosition, children: [
16435
- /* @__PURE__ */ jsx("span", { children: "Last Price" }),
16436
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(lastPrice) })
16437
- ] }),
16438
- /* @__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
+ ] })
16439
16463
  ] }),
16440
- /* @__PURE__ */ jsxs(ValuationDetails, { children: [
16441
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#4CAF50" }, children: [
16442
- /* @__PURE__ */ jsxs("span", { children: [
16443
- "< ",
16444
- formatCurrency5(undervaluedThreshold)
16445
- ] }),
16446
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16447
- "(",
16448
- formatMillions(undervaluedThreshold * tokensOutstanding),
16449
- ")"
16450
- ] })
16451
- ] }) }),
16452
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "var(--color-accent)" }, children: [
16453
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(fairValue) }),
16454
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16455
- "(",
16456
- formatMillions(fairValue * tokensOutstanding),
16457
- ")"
16458
- ] })
16459
- ] }) }),
16460
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#F44336" }, children: [
16461
- /* @__PURE__ */ jsxs("span", { children: [
16462
- "> ",
16463
- formatCurrency5(overvaluedThreshold)
16464
- ] }),
16465
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16466
- "(",
16467
- formatMillions(overvaluedThreshold * tokensOutstanding),
16468
- ")"
16469
- ] })
16470
- ] }) })
16471
- ] })
16472
- ] }),
16473
- /* @__PURE__ */ jsxs(HiddenMobileChart, { children: [
16474
- /* @__PURE__ */ jsx("h3", { style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
16475
- /* @__PURE__ */ jsx(ChartContainer, { children: /* @__PURE__ */ jsxs(ChartBackground, { children: [
16476
- axisLabels.map((label, index) => /* @__PURE__ */ jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
16477
- /* @__PURE__ */ jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
16478
- valuationPath ? /* @__PURE__ */ jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
16479
- 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
+ ")"
16480
16470
  ] })
16481
- ] }) })
16471
+ ] }) : /* @__PURE__ */ jsx(Skeleton, { width: 140, height: 18 }) })
16482
16472
  ] }),
16483
16473
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16484
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Valuation" }),
16485
- /* @__PURE__ */ jsxs(ValuationCallout, { children: [
16486
- /* @__PURE__ */ jsx("span", { style: { color: "#4CAF50", fontWeight: 600, fontSize: "16px", letterSpacing: "0.3px" }, children: valuationStatus }),
16487
- /* @__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 }) })
16488
16493
  ] })
16489
16494
  ] }),
16490
16495
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16491
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Area Demand" }),
16492
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
16493
- /* @__PURE__ */ jsx(PricingDetailValue, { children: areaDemandLabel }),
16494
- /* @__PURE__ */ jsxs(AreaDemandChart, { children: [
16495
- /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16496
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(244, 67, 54, 0.2)" }),
16497
- /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(255, 152, 0, 0.15)" }),
16498
- /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(158, 158, 158, 0.15)" }),
16499
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16500
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16501
- /* @__PURE__ */ jsx("line", { x1: "45", y1: "0", x2: "45", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16502
- /* @__PURE__ */ jsx("line", { x1: "90", y1: "0", x2: "90", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16503
- /* @__PURE__ */ jsx("line", { x1: "135", y1: "0", x2: "135", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16504
- /* @__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" })
16505
- ] }),
16506
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "3px" }, children: "Hot" }),
16507
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "23px" }, children: "Warm" }),
16508
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "43px" }, children: "Cold" }),
16509
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: 0 }, children: "2020" }),
16510
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "45px" }, children: "2021" }),
16511
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "90px" }, children: "2022" }),
16512
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "135px" }, children: "2023" }),
16513
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", right: 0 }, children: "2025" })
16514
- ] })
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" })
16515
16515
  ] })
16516
16516
  ] }),
16517
16517
  /* @__PURE__ */ jsxs(PricingModelDetail, { children: [
16518
- /* @__PURE__ */ jsx(PropertyDetailLabel, { children: "Property Moat" }),
16519
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
16520
- /* @__PURE__ */ jsx(PricingDetailValue, { children: propertyMoatLabel }),
16521
- /* @__PURE__ */ jsxs(AreaDemandChart, { children: [
16522
- /* @__PURE__ */ jsxs("svg", { width: "100%", height: "60", viewBox: "0 0 180 60", preserveAspectRatio: "none", children: [
16523
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "180", height: "20", fill: "rgba(0, 137, 123, 0.2)" }),
16524
- /* @__PURE__ */ jsx("rect", { x: "0", y: "20", width: "180", height: "20", fill: "rgba(102, 187, 106, 0.15)" }),
16525
- /* @__PURE__ */ jsx("rect", { x: "0", y: "40", width: "180", height: "20", fill: "rgba(200, 230, 201, 0.15)" }),
16526
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "20", x2: "180", y2: "20", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16527
- /* @__PURE__ */ jsx("line", { x1: "0", y1: "40", x2: "180", y2: "40", stroke: "rgba(255,255,255,0.1)", strokeWidth: "1" }),
16528
- /* @__PURE__ */ jsx("line", { x1: "45", y1: "0", x2: "45", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16529
- /* @__PURE__ */ jsx("line", { x1: "90", y1: "0", x2: "90", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16530
- /* @__PURE__ */ jsx("line", { x1: "135", y1: "0", x2: "135", y2: "60", stroke: "rgba(255,255,255,0.05)", strokeWidth: "1" }),
16531
- /* @__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" })
16532
- ] }),
16533
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "3px" }, children: "Wide Moat" }),
16534
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "23px" }, children: "Narrow Moat" }),
16535
- /* @__PURE__ */ jsx(ChartLabel, { style: { top: "43px" }, children: "No Moat" }),
16536
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: 0 }, children: "2020" }),
16537
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "45px" }, children: "2021" }),
16538
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "90px" }, children: "2022" }),
16539
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", left: "135px" }, children: "2023" }),
16540
- /* @__PURE__ */ jsx(ChartLabel, { style: { bottom: "-15px", right: 0 }, children: "2025" })
16541
- ] })
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" })
16542
16537
  ] })
16543
16538
  ] })
16544
16539
  ] }),
16545
- /* @__PURE__ */ jsxs(ValuationIndicator, { className: "desktop-only-valuation", children: [
16540
+ /* @__PURE__ */ jsxs(ValuationIndicator, { children: [
16546
16541
  /* @__PURE__ */ jsxs(ValuationHeader, { children: [
16547
16542
  /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#4CAF50" }, children: "Undervalued" }),
16548
- /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "var(--color-accent)" }, children: "Fair Value" }),
16543
+ /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#D4AF37" }, children: "Fair Value" }),
16549
16544
  /* @__PURE__ */ jsx(ValuationTitle, { style: { color: "#F44336" }, children: "Overvalued" })
16550
16545
  ] }),
16551
16546
  /* @__PURE__ */ jsxs(ValuationGauge, { children: [
16552
16547
  /* @__PURE__ */ jsx(GaugeBackground, {}),
16553
- /* @__PURE__ */ jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
16554
- /* @__PURE__ */ jsxs(GaugePriceTag, { position: gaugePosition, children: [
16555
- /* @__PURE__ */ jsx("span", { children: "Last Price" }),
16556
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(lastPrice) })
16557
- ] }),
16558
- /* @__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
+ ] })
16559
16553
  ] }),
16560
16554
  /* @__PURE__ */ jsxs(ValuationDetails, { children: [
16561
- /* @__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: [
16562
16556
  /* @__PURE__ */ jsxs("span", { children: [
16563
16557
  "< ",
16564
- formatCurrency5(undervaluedThreshold)
16558
+ `$${valSummary.undervaluedThreshold.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`
16565
16559
  ] }),
16566
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16567
- "(",
16568
- formatMillions(undervaluedThreshold * tokensOutstanding),
16569
- ")"
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)"
16570
16564
  ] })
16571
- ] }) }),
16572
- /* @__PURE__ */ jsx(ValuationItem, { children: /* @__PURE__ */ jsxs(ValuationValue, { style: { color: "#f0b90b" }, children: [
16573
- /* @__PURE__ */ jsx("span", { children: formatCurrency5(fairValue) }),
16574
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16575
- "(",
16576
- formatMillions(fairValue * tokensOutstanding),
16577
- ")"
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)"
16578
16572
  ] })
16579
- ] }) }),
16580
- /* @__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: [
16581
16575
  /* @__PURE__ */ jsxs("span", { children: [
16582
16576
  "> ",
16583
- formatCurrency5(overvaluedThreshold)
16577
+ `$${valSummary.overvaluedThreshold.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`
16584
16578
  ] }),
16585
- /* @__PURE__ */ jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
16586
- "(",
16587
- formatMillions(overvaluedThreshold * tokensOutstanding),
16588
- ")"
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)"
16589
16583
  ] })
16590
- ] }) })
16591
- ] })
16592
- ] }),
16593
- /* @__PURE__ */ jsx("h3", { className: "desktop-only-historical-chart", style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
16594
- /* @__PURE__ */ jsx(ChartContainer, { className: "desktop-only-historical-chart", children: /* @__PURE__ */ jsxs(ChartBackground, { children: [
16595
- axisLabels.map((label, index) => /* @__PURE__ */ jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
16596
- /* @__PURE__ */ jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
16597
- valuationPath ? /* @__PURE__ */ jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
16598
- 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 }) }) })
16599
16585
  ] })
16600
- ] }) })
16601
- ] })
16586
+ ] })
16587
+ ] }) })
16602
16588
  ] }),
16603
- /* @__PURE__ */ jsxs(RecentSalesSection, { children: [
16604
- /* @__PURE__ */ jsx(SectionSubheading, { children: "Recent Sales in Comparable Suburbs" }),
16605
- /* @__PURE__ */ jsxs(SwipeIndicator, { children: [
16606
- "Swipe to see more",
16607
- /* @__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
+ ")"
16608
16594
  ] }),
16609
- /* @__PURE__ */ jsx(SalesGrid, { children: recentSales.map((sale, index) => /* @__PURE__ */ jsxs(SaleCard, { children: [
16610
- /* @__PURE__ */ jsxs(SaleImageContainer, { children: [
16611
- /* @__PURE__ */ jsx(
16612
- 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,
16613
16616
  {
16614
- src: sale.imageUrl ?? "https://images.unsplash.com/photo-1505693314120-0d443867891c?auto=format&fit=crop&w=1200&q=80",
16615
- alt: sale.address ?? "Recent sale"
16616
- }
16617
- ),
16618
- /* @__PURE__ */ jsxs(SoldTag, { children: [
16619
- "SOLD",
16620
- /* @__PURE__ */ jsx(SoldIcon, {})
16621
- ] })
16622
- ] }),
16623
- /* @__PURE__ */ jsxs(SalePriceBar, { children: [
16624
- /* @__PURE__ */ jsxs(SalePriceLeft, { children: [
16625
- /* @__PURE__ */ jsx(SalePriceLabel, { children: "Sale Price" }),
16626
- /* @__PURE__ */ jsx(SalePriceAmount, { children: formatCurrency5(sale.price) })
16627
- ] }),
16628
- /* @__PURE__ */ jsx(SaleDate, { children: sale.saleDate ?? "\u2014" })
16629
- ] }),
16630
- /* @__PURE__ */ jsxs(SaleContent, { children: [
16631
- /* @__PURE__ */ jsx(SaleAddress, { children: sale.address ?? "Private Sale" }),
16632
- /* @__PURE__ */ jsx(SaleSuburb, { children: sale.suburb ?? "" })
16633
- ] }),
16634
- /* @__PURE__ */ jsxs(SaleStatsBar, { children: [
16635
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem" }, children: [
16636
- /* @__PURE__ */ jsxs(SaleStatItem, { children: [
16637
- /* @__PURE__ */ jsx(BedIcon, {}),
16638
- formatBedroomLabel(sale.bedrooms)
16639
- ] }),
16640
- /* @__PURE__ */ jsxs(SaleStatItem, { children: [
16641
- /* @__PURE__ */ jsx(BathIcon, {}),
16642
- formatBathroomLabel(sale.bathrooms)
16643
- ] })
16644
- ] }),
16645
- /* @__PURE__ */ jsx(SaleStatItem, { style: { color: "var(--color-text-secondary)" }, children: sale.landSize ?? "\u2014" })
16646
- ] })
16647
- ] }, `${sale.address ?? sale.suburb ?? "sale"}-${index}`)) })
16648
- ] }),
16649
- loading ? /* @__PURE__ */ jsx(LoadingOverlay, { children: "Loading valuation data\u2026" }) : null,
16650
- 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
+ ] }) })
16651
16650
  ] });
16652
16651
  }
16653
- function formatCurrency5(value, options) {
16654
- if (value == null || Number.isNaN(value)) {
16655
- return "\u2014";
16656
- }
16657
- const { minimumFractionDigits = 2, maximumFractionDigits = 2, ...rest } = options ?? {};
16658
- const minDigits = Math.max(0, Math.min(20, minimumFractionDigits));
16659
- const maxDigits = Math.max(minDigits, Math.min(20, maximumFractionDigits));
16660
- return value.toLocaleString("en-US", {
16661
- style: "currency",
16662
- currency: "USD",
16663
- minimumFractionDigits: minDigits,
16664
- maximumFractionDigits: maxDigits,
16665
- ...rest
16666
- });
16667
- }
16668
- function formatMillions(value) {
16669
- if (!Number.isFinite(value) || value === 0) {
16670
- return "$0m";
16671
- }
16672
- return `$${(value / 1e6).toFixed(2)}m`;
16673
- }
16674
- function formatBedroomLabel(bedrooms) {
16675
- if (!Number.isFinite(bedrooms)) return "\u2014";
16676
- return `${bedrooms} Bed`;
16677
- }
16678
- function formatBathroomLabel(bathrooms) {
16679
- if (!Number.isFinite(bathrooms)) return "\u2014";
16680
- return `${bathrooms} Bath`;
16681
- }
16682
- function buildChartPaths(history, fallbackValue) {
16683
- if (!history.length) {
16684
- return { valuationPath: null, fairValuePath: null, axisLabels: ["$0", "$0", "$0", "$0", "$0"] };
16685
- }
16686
- const values = history.map((point) => point.valuation);
16687
- const minValue = Math.min(...values);
16688
- const maxValue = Math.max(...values);
16689
- const minTime = Math.min(...history.map((point) => point.timestamp));
16690
- const maxTime = Math.max(...history.map((point) => point.timestamp));
16691
- const adjustedMinValue = minValue === maxValue ? minValue * 0.9 : minValue;
16692
- const adjustedMaxValue = minValue === maxValue ? maxValue * 1.1 : maxValue;
16693
- const valuationSegments = history.map((point, index) => {
16694
- const x = normalize(point.timestamp, minTime, maxTime, CHART_PADDING, CHART_WIDTH - CHART_PADDING);
16695
- const y = mapValueToY(point.valuation, adjustedMinValue, adjustedMaxValue);
16696
- return `${index === 0 ? "M" : "L"} ${x} ${y}`;
16697
- });
16698
- const fairValuePoints = history.filter((point) => Number.isFinite(point.fairValue));
16699
- const fairValueSegments = fairValuePoints.map((point, index) => {
16700
- const x = normalize(point.timestamp, minTime, maxTime, CHART_PADDING, CHART_WIDTH - CHART_PADDING);
16701
- const y = mapValueToY(point.fairValue ?? fallbackValue, adjustedMinValue, adjustedMaxValue);
16702
- return `${index === 0 ? "M" : "L"} ${x} ${y}`;
16703
- });
16704
- const axisLabels = buildAxisLabels(adjustedMinValue, adjustedMaxValue);
16705
- return {
16706
- valuationPath: valuationSegments.length > 1 ? valuationSegments.join(" ") : null,
16707
- fairValuePath: fairValueSegments.length > 1 ? fairValueSegments.join(" ") : null,
16708
- axisLabels
16709
- };
16710
- }
16711
- function normalize(value, min, max, targetMin, targetMax) {
16712
- if (max === min) return (targetMin + targetMax) / 2;
16713
- return targetMin + (value - min) / (max - min) * (targetMax - targetMin);
16714
- }
16715
- function mapValueToY(value, min, max) {
16716
- const normalized = normalize(value, min, max, 0, 1);
16717
- const clamped = Math.min(1, Math.max(0, normalized));
16718
- const drawableHeight = CHART_HEIGHT - CHART_PADDING * 2;
16719
- return CHART_PADDING + (1 - clamped) * drawableHeight;
16720
- }
16721
- function buildAxisLabels(min, max) {
16722
- const steps = 5;
16723
- const labels = [];
16724
- for (let i = 0; i < steps; i += 1) {
16725
- const ratio = i / (steps - 1);
16726
- const value = max - ratio * (max - min);
16727
- labels.push(formatCurrency5(value, { maximumFractionDigits: 0, minimumFractionDigits: 0 }));
16728
- }
16729
- return labels;
16730
- }
16731
- function calculatePositionFromPrice(price, undervaluedPrice, fairValue, overvaluedPrice) {
16732
- if (price <= undervaluedPrice) return 0;
16733
- if (price >= overvaluedPrice) return 100;
16734
- if (price < fairValue) {
16735
- return 50 * (price - undervaluedPrice) / (fairValue - undervaluedPrice);
16736
- }
16737
- return 50 + 50 * (price - fairValue) / (overvaluedPrice - fairValue);
16738
- }
16739
- var ValuationIndicator = styled9.div`
16740
- background-color: rgba(50, 52, 58, 0.95);
16741
- border-radius: 6px;
16742
- padding: 1rem;
16743
- margin-top: 1.5rem;
16744
- margin-bottom: 1.5rem;
16745
-
16746
- &.desktop-only-valuation {
16747
- @media (max-width: 480px) {
16748
- display: none;
16749
- }
16750
- }
16751
-
16752
- &.mobile-only-valuation {
16753
- display: none;
16754
- @media (max-width: 480px) {
16755
- display: block;
16756
- margin-top: 1rem;
16757
- margin-bottom: 1rem;
16758
- }
16759
- }
16760
- `;
16761
- var GaugeIndicator = styled9.div`
16762
- position: absolute;
16763
- left: ${(props) => props.position}%;
16764
- top: 0.35rem;
16765
- transform: translateX(-50%);
16766
- width: 3px;
16767
- height: 36px;
16768
- border-radius: 999px;
16769
- background: ${(props) => props.type === "fairValue" ? "#f0b90b" : "rgba(10, 12, 18, 0.95)"};
16770
- 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;
16771
16657
  `;
16772
- var GaugePriceTag = styled9.div`
16773
- position: absolute;
16774
- left: ${(props) => props.position}%;
16775
- top: -46px;
16776
- transform: translateX(-50%);
16777
- background: rgba(7, 9, 13, 0.85);
16778
- border: 1px solid rgba(255, 255, 255, 0.1);
16779
- border-radius: 8px;
16780
- padding: 6px 10px;
16781
- font-size: 0.75rem;
16658
+ var ValuationHeading = styled9.h2`
16659
+ font-size: 1.4rem;
16660
+ font-weight: 600;
16782
16661
  color: #fff;
16783
- font-weight: 500;
16784
- display: flex;
16785
- flex-direction: column;
16786
- gap: 2px;
16787
- text-align: center;
16788
- backdrop-filter: blur(6px);
16662
+ margin: 0 0 1.5rem;
16789
16663
 
16790
- span:last-child {
16791
- font-size: 0.95em;
16792
- font-weight: 600;
16793
- letter-spacing: 0.2px;
16794
- color: var(--color-accent);
16795
- }
16796
- `;
16797
- var HiddenMobileChart = styled9.div`
16798
- display: none;
16799
16664
  @media (max-width: 480px) {
16800
- display: block;
16665
+ font-size: 1.15rem;
16666
+ margin-bottom: 1rem;
16801
16667
  }
16802
16668
  `;
16803
- var ValuationWrapper = styled9.div`
16804
- display: flex;
16805
- flex-direction: column;
16806
- gap: 2rem;
16807
- `;
16808
- var LoadingOverlay = styled9.div`
16809
- margin-top: 1rem;
16810
- padding: 0.75rem 1rem;
16811
- border-radius: 8px;
16812
- background: rgba(255, 255, 255, 0.05);
16813
- color: rgba(255, 255, 255, 0.8);
16814
- font-size: 0.9rem;
16815
- `;
16816
- var ErrorMessage = styled9.div`
16817
- margin-top: 1rem;
16818
- padding: 0.75rem 1rem;
16819
- border-radius: 8px;
16820
- background: rgba(244, 67, 54, 0.15);
16821
- color: #ff8a80;
16822
- font-size: 0.9rem;
16823
- border: 1px solid rgba(244, 67, 54, 0.4);
16824
- `;
16825
- var SectionTitle = styled9.h2`
16826
- margin: 0;
16827
- font-size: clamp(1.75rem, 2.5vw, 2.25rem);
16828
- font-weight: 600;
16829
- color: #fff;
16830
- letter-spacing: 0.01em;
16831
- `;
16832
16669
  var LoafPricingSection = styled9.div`
16833
16670
  background-color: rgba(30, 32, 38, 0.95);
16834
16671
  border-radius: 8px;
16835
16672
  padding: 1.25rem;
16836
16673
  margin-bottom: 1.5rem;
16837
- `;
16838
- var SectionSubheading = styled9.h2`
16839
- margin: 0;
16840
- font-size: 1.1rem;
16841
- font-weight: 600;
16842
- color: #fff;
16843
- 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
+ }
16844
16684
  `;
16845
16685
  var PricingModelCard = styled9.div`
16846
16686
  background-color: rgba(40, 42, 48, 0.95);
16847
16687
  border-radius: 8px;
16848
16688
  padding: 1.5rem;
16849
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
+ }
16850
16698
  `;
16851
16699
  var PricingModelHeader = styled9.div`
16852
16700
  display: flex;
16853
16701
  justify-content: space-between;
16854
16702
  align-items: center;
16855
16703
  margin-bottom: 1.5rem;
16704
+ flex-wrap: wrap;
16856
16705
  gap: 1rem;
16857
16706
 
16858
- .valuation-info {
16859
- display: flex;
16707
+ @media (max-width: 480px) {
16860
16708
  flex-direction: column;
16861
- gap: 0.25rem;
16862
- font-size: 0.85rem;
16863
- color: rgba(255, 255, 255, 0.75);
16709
+ align-items: flex-start;
16710
+ gap: 0.5rem;
16711
+ margin-bottom: 1rem;
16864
16712
  }
16865
16713
  `;
16866
16714
  var PricingModelTitle = styled9.h3`
@@ -16868,14 +16716,9 @@ var PricingModelTitle = styled9.h3`
16868
16716
  font-size: 1.2rem;
16869
16717
  font-weight: 600;
16870
16718
  color: #fff;
16871
- `;
16872
- var PricingModelValue = styled9.div`
16873
- font-size: 1.4rem;
16874
- font-weight: 700;
16875
- color: var(--color-primary);
16876
16719
 
16877
- @media (max-width: 768px) {
16878
- font-size: 1.2rem;
16720
+ @media (max-width: 480px) {
16721
+ font-size: 1rem;
16879
16722
  }
16880
16723
  `;
16881
16724
  var PricingModelDetails = styled9.div`
@@ -16883,13 +16726,27 @@ var PricingModelDetails = styled9.div`
16883
16726
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
16884
16727
  gap: 1.5rem;
16885
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
+ }
16886
16739
  `;
16887
16740
  var PricingModelDetail = styled9.div`
16888
16741
  background-color: rgba(50, 52, 58, 0.95);
16889
16742
  border-radius: 6px;
16890
16743
  padding: 1rem;
16744
+
16745
+ @media (max-width: 480px) {
16746
+ padding: 0.75rem;
16747
+ }
16891
16748
  `;
16892
- var PropertyDetailLabel = styled9.div`
16749
+ var PricingDetailLabel = styled9.div`
16893
16750
  font-size: 0.85rem;
16894
16751
  color: rgba(255, 255, 255, 0.7);
16895
16752
  margin-bottom: 0.5rem;
@@ -16899,6 +16756,35 @@ var PricingDetailValue = styled9.div`
16899
16756
  color: #fff;
16900
16757
  font-weight: 500;
16901
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
+ `;
16902
16788
  var ValuationHeader = styled9.div`
16903
16789
  display: flex;
16904
16790
  justify-content: space-between;
@@ -16906,277 +16792,219 @@ var ValuationHeader = styled9.div`
16906
16792
  `;
16907
16793
  var ValuationTitle = styled9.div`
16908
16794
  font-size: 0.9rem;
16909
- color: rgba(255, 255, 255, 0.7);
16795
+ font-weight: 500;
16796
+
16797
+ @media (max-width: 480px) {
16798
+ font-size: 0.75rem;
16799
+ }
16910
16800
  `;
16911
16801
  var ValuationGauge = styled9.div`
16912
16802
  position: relative;
16913
16803
  width: 100%;
16914
16804
  padding: 1.1rem 0 2rem;
16915
- margin: 0.75rem 0 1rem;
16916
16805
  `;
16917
16806
  var GaugeBackground = styled9.div`
16918
- width: 100%;
16919
- height: 18px;
16920
- border-radius: 999px;
16921
- background: linear-gradient(90deg, #0ecb81 0%, #4dd482 30%, #f8e36c 50%, #f98b6c 70%, #f6465d 100%);
16922
- position: relative;
16923
- overflow: hidden;
16924
- 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
+ }
16925
16844
  `;
16926
16845
  var ValuationDetails = styled9.div`
16927
16846
  display: flex;
16928
16847
  justify-content: space-between;
16929
16848
  margin-top: 1rem;
16849
+
16850
+ @media (max-width: 480px) {
16851
+ gap: 0.25rem;
16852
+ }
16930
16853
  `;
16931
16854
  var ValuationItem = styled9.div`
16932
16855
  display: flex;
16933
16856
  flex-direction: column;
16857
+
16858
+ &:nth-child(2) {
16859
+ text-align: center;
16860
+ }
16861
+
16862
+ &:last-child {
16863
+ text-align: right;
16864
+ }
16934
16865
  `;
16935
16866
  var ValuationValue = styled9.div`
16936
16867
  font-size: 1rem;
16937
16868
  font-weight: 600;
16938
- color: #fff;
16939
- `;
16940
- var ChartContainer = styled9.div`
16941
- width: 100%;
16942
- height: 301.52px;
16943
- margin-top: 1.5rem;
16944
- background-color: rgba(50, 52, 58, 0.5);
16945
- border-radius: 6px;
16946
- padding: 1rem;
16947
- position: relative;
16948
- `;
16949
- var ChartBackground = styled9.div`
16950
- position: relative;
16951
- height: 100%;
16952
- width: 100%;
16953
- background: rgba(255, 255, 255, 0.03);
16954
- border-radius: 8px;
16955
- `;
16956
- var ValuationSvg = styled9.svg`
16957
- position: absolute;
16958
- top: 10px;
16959
- right: 0;
16960
- bottom: 25px;
16961
- left: 0;
16962
- overflow: visible;
16963
- width: 100%;
16964
- height: calc(100% - 35px);
16965
- `;
16966
- var YAxisLabel = styled9.div`
16967
- position: absolute;
16968
- left: -40px;
16969
- font-size: 10px;
16970
- color: rgba(255, 255, 255, 0.6);
16971
- text-align: right;
16972
- padding-right: 5px;
16973
- `;
16974
- var ValuationCallout = styled9.div`
16975
16869
  display: flex;
16976
- align-items: center;
16977
- justify-content: space-between;
16978
- background: linear-gradient(90deg, rgba(76, 175, 80, 0.05) 0%, rgba(76, 175, 80, 0.1) 100%);
16979
- border-radius: 8px;
16980
- padding: 10px 16px;
16981
- border: 1px solid rgba(76, 175, 80, 0.2);
16982
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
16983
- `;
16984
- var ValuationBadge = styled9.div`
16985
- background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%);
16986
- color: white;
16987
- padding: 5px 12px;
16988
- border-radius: 20px;
16989
- font-size: 14px;
16990
- font-weight: 600;
16991
- box-shadow: 0 2px 4px rgba(76, 175, 80, 0.25);
16992
- `;
16993
- var AreaDemandChart = styled9.div`
16994
- height: 60px;
16995
- width: 100%;
16996
- position: relative;
16997
- `;
16998
- var ChartLabel = styled9.div`
16999
- position: absolute;
17000
- font-size: 9px;
17001
- color: rgba(255, 255, 255, 0.7);
17002
- `;
17003
- var RecentSalesSection = styled9.div`
17004
- background-color: rgba(30, 32, 38, 0.95);
17005
- border-radius: 8px;
17006
- padding: 1.25rem;
17007
- margin-bottom: 1.5rem;
16870
+ flex-direction: column;
16871
+ gap: 0.15rem;
17008
16872
 
17009
- @media (max-width: 768px) {
17010
- position: relative;
16873
+ @media (max-width: 480px) {
16874
+ font-size: 0.85rem;
17011
16875
  }
17012
16876
  `;
17013
- var SalesGrid = styled9.div`
17014
- display: grid;
17015
- grid-template-columns: repeat(3, 1fr);
17016
- gap: 1.5rem;
17017
- 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;
17018
16882
 
17019
16883
  @media (max-width: 768px) {
17020
- display: flex;
17021
- overflow-x: auto;
17022
- scroll-snap-type: x mandatory;
17023
- scroll-behavior: smooth;
17024
- -webkit-overflow-scrolling: touch;
17025
- gap: 1rem;
17026
- padding-bottom: 1rem;
17027
-
17028
- &::-webkit-scrollbar {
17029
- display: none;
17030
- }
17031
- scrollbar-width: none;
16884
+ overflow: hidden;
16885
+ box-sizing: border-box;
16886
+ padding: 1rem;
17032
16887
  }
17033
- `;
17034
- var SaleCard = styled9.div`
17035
- background-color: var(--color-card, #1e2329);
17036
- border-radius: var(--border-radius, 8px);
17037
- overflow: hidden;
17038
- transition: transform 0.2s ease, box-shadow 0.2s ease;
17039
- border: 1px solid rgba(255, 255, 255, 0.05);
17040
16888
 
17041
- &:hover {
17042
- transform: translateY(-4px);
17043
- box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
16889
+ @media (max-width: 480px) {
16890
+ padding: 0.75rem;
16891
+ border-radius: 8px;
17044
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;
17045
16909
 
17046
16910
  @media (max-width: 768px) {
17047
- min-width: 280px;
17048
- width: 85%;
17049
- scroll-snap-align: start;
17050
- flex-shrink: 0;
17051
- margin-right: 0.5rem;
17052
-
17053
- &:last-child {
17054
- margin-right: 1rem;
17055
- }
16911
+ height: 350px;
17056
16912
  }
17057
- `;
17058
- var SaleImageContainer = styled9.div`
17059
- position: relative;
17060
- width: 100%;
17061
- height: 200px;
17062
- overflow: hidden;
17063
- `;
17064
- var SaleImage = styled9.img`
17065
- width: 100%;
17066
- height: 100%;
17067
- object-fit: cover;
17068
- object-position: center;
17069
- transition: transform 0.3s ease;
17070
16913
 
17071
- ${SaleCard}:hover & {
17072
- transform: scale(1.05);
16914
+ @media (max-width: 480px) {
16915
+ height: 260px;
17073
16916
  }
17074
16917
  `;
17075
- var SoldTag = styled9.div`
16918
+ var ChartOverlayTitle = styled9.div`
17076
16919
  position: absolute;
17077
- top: 1rem;
17078
- right: 1rem;
17079
- background-color: var(--color-accent, #f0b90b);
17080
- color: var(--color-background, #0b0e11);
17081
- font-weight: 600;
17082
- font-size: 0.75rem;
17083
- 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;
17084
16927
  border-radius: 4px;
17085
- display: flex;
17086
- align-items: center;
17087
- gap: 4px;
17088
- `;
17089
- var SoldIcon = styled9.div`
17090
- display: none;
17091
- `;
17092
- var SalePriceBar = styled9.div`
17093
- display: flex;
17094
- justify-content: space-between;
17095
- align-items: center;
17096
- padding: 0.75rem 1rem;
17097
- background: linear-gradient(90deg, rgba(240, 185, 11, 0.1) 0%, rgba(240, 185, 11, 0.05) 100%);
17098
- 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
+ }
17099
16934
  `;
17100
- var SalePriceLeft = styled9.div`
16935
+ var ChartLegendColumn = styled9.div`
16936
+ position: absolute;
16937
+ right: 10px;
16938
+ top: 40px;
17101
16939
  display: flex;
17102
16940
  flex-direction: column;
16941
+ gap: 6px;
16942
+ z-index: 10;
17103
16943
  `;
17104
- var SalePriceLabel = styled9.span`
16944
+ var ChartLegendItem = styled9.div`
17105
16945
  font-size: 0.7rem;
17106
- color: rgba(255, 255, 255, 0.5);
17107
- text-transform: uppercase;
17108
- 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;
17109
16952
  `;
17110
- var SalePriceAmount = styled9.span`
17111
- font-size: 1.1rem;
17112
- font-weight: 700;
17113
- 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;
17114
16960
  `;
17115
- var SaleContent = styled9.div`
17116
- 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);
17117
16967
  `;
17118
- var SaleAddress = styled9.h3`
17119
- margin: 0;
17120
- margin-bottom: 0.25rem;
17121
- font-size: 1rem;
16968
+ var SaleHistoryLabel = styled9.div`
16969
+ font-size: 0.7rem;
17122
16970
  font-weight: 600;
17123
- color: var(--color-text, #eaecef);
17124
- `;
17125
- var SaleSuburb = styled9.div`
17126
- font-size: 0.8rem;
17127
16971
  color: var(--color-text-secondary, #848e9c);
17128
- margin-bottom: 0.5rem;
17129
- `;
17130
- var SaleStatsBar = styled9.div`
17131
- display: flex;
17132
- justify-content: space-between;
17133
- align-items: center;
17134
- padding: 0.75rem 1rem;
17135
- background-color: rgba(0, 0, 0, 0.3);
17136
- border-top: 1px solid rgba(255, 255, 255, 0.05);
16972
+ text-transform: uppercase;
16973
+ letter-spacing: 0.1em;
16974
+ margin-bottom: 0.75rem;
17137
16975
  `;
17138
- var SaleStatItem = styled9.div`
16976
+ var SaleHistoryGrid = styled9.div`
17139
16977
  display: flex;
17140
- align-items: center;
17141
- gap: 0.25rem;
17142
- font-size: 0.8rem;
17143
- color: var(--color-text-secondary, #848e9c);
16978
+ flex-wrap: wrap;
16979
+ gap: 1rem;
17144
16980
 
17145
- svg {
17146
- width: 14px;
17147
- height: 14px;
17148
- opacity: 0.7;
16981
+ @media (max-width: 480px) {
16982
+ flex-direction: column;
16983
+ gap: 0.75rem;
17149
16984
  }
17150
16985
  `;
17151
- var SaleDate = styled9.div`
17152
- font-size: 0.75rem;
17153
- color: var(--color-text-secondary, #848e9c);
17154
- `;
17155
- var SwipeIndicator = styled9.div`
17156
- display: none;
17157
-
17158
- @media (max-width: 768px) {
17159
- display: flex;
17160
- align-items: center;
17161
- justify-content: center;
17162
- margin-top: 0.75rem;
17163
- color: rgba(255, 255, 255, 0.6);
17164
- font-size: 0.8rem;
17165
-
17166
- svg {
17167
- margin-left: 0.25rem;
17168
- animation: swipeAnimation 1.5s infinite;
17169
- }
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;
17170
16994
 
17171
- @keyframes swipeAnimation {
17172
- 0% { transform: translateX(0); }
17173
- 50% { transform: translateX(5px); }
17174
- 100% { transform: translateX(0); }
17175
- }
16995
+ @media (max-width: 480px) {
16996
+ flex: 1 1 auto;
17176
16997
  }
17177
16998
  `;
17178
- 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" }) });
17179
- 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
+ `;
17180
17008
  var fadeIn = keyframes`
17181
17009
  from { opacity: 0; }
17182
17010
  to { opacity: 1; }