@schandlergarcia/sf-web-components 2.3.1 → 2.3.3
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/CHANGELOG.md +13 -0
- package/brands/engine/app/pages/PartnerHubDashboard.tsx +300 -300
- package/brands/engine/global.css +18 -0
- package/brands/engine/partner-hub-sample-data.js +152 -62
- package/dist/styles/global.css +18 -0
- package/package.json +1 -1
- package/src/styles/global.css +18 -0
|
@@ -222,7 +222,7 @@ export default function PartnerHubDashboard() {
|
|
|
222
222
|
.sort((a, b) => a.key.localeCompare(b.key));
|
|
223
223
|
|
|
224
224
|
const months = sortedMonths.map(m => m.label);
|
|
225
|
-
const colors = ["
|
|
225
|
+
const colors = ["var(--color-dash-accent)", "var(--color-dash-success)", "var(--color-dash-chart-3)", "var(--color-dash-chart-4)"];
|
|
226
226
|
|
|
227
227
|
// Distribute monthly revenue across properties (weighted)
|
|
228
228
|
const properties = (liveData.properties || []).map((prop: any, idx: number) => {
|
|
@@ -342,11 +342,11 @@ export default function PartnerHubDashboard() {
|
|
|
342
342
|
|
|
343
343
|
gradient.append("stop")
|
|
344
344
|
.attr("offset", "0%")
|
|
345
|
-
.attr("stop-color", "
|
|
345
|
+
.attr("stop-color", "var(--color-dash-accent)");
|
|
346
346
|
|
|
347
347
|
gradient.append("stop")
|
|
348
348
|
.attr("offset", "100%")
|
|
349
|
-
.attr("stop-color", "
|
|
349
|
+
.attr("stop-color", "var(--color-dash-success)");
|
|
350
350
|
|
|
351
351
|
g.selectAll(".bar")
|
|
352
352
|
.data(data)
|
|
@@ -411,7 +411,7 @@ export default function PartnerHubDashboard() {
|
|
|
411
411
|
.attr("text-anchor", "middle")
|
|
412
412
|
.attr("font-size", "14px")
|
|
413
413
|
.attr("font-weight", "600")
|
|
414
|
-
.attr("fill", "
|
|
414
|
+
.attr("fill", "var(--color-dash-surface)")
|
|
415
415
|
.attr("paint-order", "stroke")
|
|
416
416
|
.attr("stroke", "rgba(0,0,0,0.3)")
|
|
417
417
|
.attr("stroke-width", "2px")
|
|
@@ -425,7 +425,7 @@ export default function PartnerHubDashboard() {
|
|
|
425
425
|
})
|
|
426
426
|
.attr("text-anchor", "middle")
|
|
427
427
|
.attr("font-size", "12px")
|
|
428
|
-
.attr("fill", "
|
|
428
|
+
.attr("fill", "var(--color-dash-surface)")
|
|
429
429
|
.attr("paint-order", "stroke")
|
|
430
430
|
.attr("stroke", "rgba(0,0,0,0.3)")
|
|
431
431
|
.attr("stroke-width", "2px")
|
|
@@ -473,14 +473,14 @@ export default function PartnerHubDashboard() {
|
|
|
473
473
|
// Total area
|
|
474
474
|
g.append("path")
|
|
475
475
|
.datum(data)
|
|
476
|
-
.attr("fill", "
|
|
476
|
+
.attr("fill", "var(--color-dash-accent)")
|
|
477
477
|
.attr("fill-opacity", 0.3)
|
|
478
478
|
.attr("d", areaTotal);
|
|
479
479
|
|
|
480
480
|
// Commission area
|
|
481
481
|
g.append("path")
|
|
482
482
|
.datum(data)
|
|
483
|
-
.attr("fill", "
|
|
483
|
+
.attr("fill", "var(--color-dash-success)")
|
|
484
484
|
.attr("fill-opacity", 0.5)
|
|
485
485
|
.attr("d", areaCommission);
|
|
486
486
|
|
|
@@ -488,7 +488,7 @@ export default function PartnerHubDashboard() {
|
|
|
488
488
|
g.append("path")
|
|
489
489
|
.datum(data)
|
|
490
490
|
.attr("fill", "none")
|
|
491
|
-
.attr("stroke", "
|
|
491
|
+
.attr("stroke", "var(--color-dash-accent)")
|
|
492
492
|
.attr("stroke-width", 2)
|
|
493
493
|
.attr("d", d3.line()
|
|
494
494
|
.x((d) => (x(d.month) || 0) + x.bandwidth() / 2)
|
|
@@ -499,7 +499,7 @@ export default function PartnerHubDashboard() {
|
|
|
499
499
|
g.append("path")
|
|
500
500
|
.datum(data)
|
|
501
501
|
.attr("fill", "none")
|
|
502
|
-
.attr("stroke", "
|
|
502
|
+
.attr("stroke", "var(--color-dash-success)")
|
|
503
503
|
.attr("stroke-width", 2)
|
|
504
504
|
.attr("d", d3.line()
|
|
505
505
|
.x((d) => (x(d.month) || 0) + x.bandwidth() / 2)
|
|
@@ -530,7 +530,7 @@ export default function PartnerHubDashboard() {
|
|
|
530
530
|
.append("rect")
|
|
531
531
|
.attr("width", 12)
|
|
532
532
|
.attr("height", 12)
|
|
533
|
-
.attr("fill", "
|
|
533
|
+
.attr("fill", "var(--color-dash-accent)");
|
|
534
534
|
|
|
535
535
|
legend
|
|
536
536
|
.append("text")
|
|
@@ -545,7 +545,7 @@ export default function PartnerHubDashboard() {
|
|
|
545
545
|
.attr("y", 20)
|
|
546
546
|
.attr("width", 12)
|
|
547
547
|
.attr("height", 12)
|
|
548
|
-
.attr("fill", "
|
|
548
|
+
.attr("fill", "var(--color-dash-success)");
|
|
549
549
|
|
|
550
550
|
legend
|
|
551
551
|
.append("text")
|
|
@@ -663,9 +663,9 @@ export default function PartnerHubDashboard() {
|
|
|
663
663
|
}, []);
|
|
664
664
|
|
|
665
665
|
return (
|
|
666
|
-
<div className="heroui-scope min-h-screen bg-[
|
|
666
|
+
<div className="heroui-scope min-h-screen bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-text)] transition-colors duration-300">
|
|
667
667
|
{/* Header - Refined Engine Brand */}
|
|
668
|
-
<header className="bg-white/95 dark:bg-[
|
|
668
|
+
<header className="bg-white/95 dark:bg-[var(--color-dash-text)]/95 backdrop-blur-xl border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 sticky top-0 z-50 shadow-sm">
|
|
669
669
|
<div className="max-w-[1600px] mx-auto px-8 py-5">
|
|
670
670
|
<div className="flex items-center justify-between">
|
|
671
671
|
<div className="flex items-center gap-8">
|
|
@@ -675,17 +675,17 @@ export default function PartnerHubDashboard() {
|
|
|
675
675
|
className="h-11 w-auto dark:invert dark:brightness-0 dark:contrast-100 transition-all duration-300"
|
|
676
676
|
/>
|
|
677
677
|
<div className="flex items-center gap-4">
|
|
678
|
-
<div className="h-10 w-px bg-gradient-to-b from-transparent via-[
|
|
678
|
+
<div className="h-10 w-px bg-gradient-to-b from-transparent via-[var(--color-dash-label)]/40 to-transparent" />
|
|
679
679
|
<div className="space-y-0.5">
|
|
680
|
-
<p className="text-sm font-semibold text-[
|
|
680
|
+
<p className="text-sm font-semibold text-[var(--color-dash-text)] dark:text-white transition-colors">
|
|
681
681
|
{currentPartner.name}
|
|
682
682
|
</p>
|
|
683
683
|
<div className="flex items-center gap-2">
|
|
684
684
|
<span className="relative flex h-2 w-2">
|
|
685
|
-
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-[
|
|
686
|
-
<span className="relative inline-flex rounded-full h-2 w-2 bg-[
|
|
685
|
+
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-[var(--color-dash-success)] opacity-75"></span>
|
|
686
|
+
<span className="relative inline-flex rounded-full h-2 w-2 bg-[var(--color-dash-success)]"></span>
|
|
687
687
|
</span>
|
|
688
|
-
<p className="text-xs font-medium text-[
|
|
688
|
+
<p className="text-xs font-medium text-[var(--color-dash-label)] uppercase tracking-wide">
|
|
689
689
|
{currentPartner.tier} Partner
|
|
690
690
|
</p>
|
|
691
691
|
</div>
|
|
@@ -695,19 +695,19 @@ export default function PartnerHubDashboard() {
|
|
|
695
695
|
<div className="flex items-center gap-3">
|
|
696
696
|
<button
|
|
697
697
|
onClick={toggle}
|
|
698
|
-
className="group p-3 rounded-xl hover:bg-[
|
|
698
|
+
className="group p-3 rounded-xl hover:bg-[var(--color-dash-surface)] dark:hover:bg-[var(--color-dash-muted)]/20 transition-colors duration-200"
|
|
699
699
|
aria-label="Toggle theme"
|
|
700
700
|
>
|
|
701
701
|
{mode === "dark" ? (
|
|
702
|
-
<SunIcon className="h-5 w-5 text-[
|
|
702
|
+
<SunIcon className="h-5 w-5 text-[var(--color-dash-accent)] transition-transform group-hover:rotate-45 duration-300" />
|
|
703
703
|
) : (
|
|
704
|
-
<MoonIcon className="h-5 w-5 text-[
|
|
704
|
+
<MoonIcon className="h-5 w-5 text-[var(--color-dash-muted)] transition-transform group-hover:-rotate-12 duration-300" />
|
|
705
705
|
)}
|
|
706
706
|
</button>
|
|
707
707
|
|
|
708
708
|
<Dropdown>
|
|
709
709
|
<Button variant="ghost" size="sm" className="p-2">
|
|
710
|
-
<UserCircleIcon className="h-6 w-6 text-[
|
|
710
|
+
<UserCircleIcon className="h-6 w-6 text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]" />
|
|
711
711
|
</Button>
|
|
712
712
|
<Dropdown.Popover className="min-w-[200px]">
|
|
713
713
|
<Dropdown.Menu
|
|
@@ -723,22 +723,22 @@ export default function PartnerHubDashboard() {
|
|
|
723
723
|
<Dropdown.Item
|
|
724
724
|
id="settings"
|
|
725
725
|
textValue="Settings"
|
|
726
|
-
className="px-3 py-2 rounded-lg hover:bg-[
|
|
726
|
+
className="px-3 py-2 rounded-lg hover:bg-[var(--color-dash-surface)] dark:hover:bg-[var(--color-dash-muted)]/20 cursor-pointer"
|
|
727
727
|
>
|
|
728
728
|
<div className="flex items-center gap-3">
|
|
729
|
-
<Cog6ToothIcon className="h-5 w-5 text-[
|
|
730
|
-
<span className="text-sm font-medium text-[
|
|
729
|
+
<Cog6ToothIcon className="h-5 w-5 text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]" />
|
|
730
|
+
<span className="text-sm font-medium text-[var(--color-dash-text)] dark:text-white">Settings</span>
|
|
731
731
|
</div>
|
|
732
732
|
</Dropdown.Item>
|
|
733
733
|
<Dropdown.Item
|
|
734
734
|
id="logout"
|
|
735
735
|
textValue="Logout"
|
|
736
736
|
variant="danger"
|
|
737
|
-
className="px-3 py-2 rounded-lg hover:bg-[
|
|
737
|
+
className="px-3 py-2 rounded-lg hover:bg-[var(--color-dash-danger)]/10 cursor-pointer"
|
|
738
738
|
>
|
|
739
739
|
<div className="flex items-center gap-3">
|
|
740
|
-
<ArrowRightOnRectangleIcon className="h-5 w-5 text-[
|
|
741
|
-
<span className="text-sm font-medium text-[
|
|
740
|
+
<ArrowRightOnRectangleIcon className="h-5 w-5 text-[var(--color-dash-danger)]" />
|
|
741
|
+
<span className="text-sm font-medium text-[var(--color-dash-danger)]">Logout</span>
|
|
742
742
|
</div>
|
|
743
743
|
</Dropdown.Item>
|
|
744
744
|
</Dropdown.Menu>
|
|
@@ -750,7 +750,7 @@ export default function PartnerHubDashboard() {
|
|
|
750
750
|
</header>
|
|
751
751
|
|
|
752
752
|
{/* Hero Section - Partnership Overview */}
|
|
753
|
-
<div className="relative bg-gradient-to-br from-[
|
|
753
|
+
<div className="relative bg-gradient-to-br from-[var(--color-dash-text)] via-[var(--color-dash-dark)] to-[var(--color-dash-text)] dark:from-[var(--color-dash-text)] dark:via-[var(--color-dash-text)] dark:to-[var(--color-dash-darker)] overflow-hidden">
|
|
754
754
|
{/* Subtle background pattern */}
|
|
755
755
|
<div className="absolute inset-0 opacity-5">
|
|
756
756
|
<div className="absolute inset-0" style={{
|
|
@@ -760,8 +760,8 @@ export default function PartnerHubDashboard() {
|
|
|
760
760
|
</div>
|
|
761
761
|
|
|
762
762
|
{/* Gradient orbs for depth */}
|
|
763
|
-
<div className="absolute top-0 right-0 w-96 h-96 bg-[
|
|
764
|
-
<div className="absolute bottom-0 left-0 w-96 h-96 bg-[
|
|
763
|
+
<div className="absolute top-0 right-0 w-96 h-96 bg-[var(--color-dash-accent)]/10 rounded-full blur-3xl" />
|
|
764
|
+
<div className="absolute bottom-0 left-0 w-96 h-96 bg-[var(--color-dash-success)]/10 rounded-full blur-3xl" />
|
|
765
765
|
|
|
766
766
|
<div className="relative max-w-[1600px] mx-auto px-8 py-12 pb-20">
|
|
767
767
|
<div className="max-w-3xl space-y-3 animate-fade-in">
|
|
@@ -784,30 +784,30 @@ export default function PartnerHubDashboard() {
|
|
|
784
784
|
onClick={() => !isLoading && setIsRevenueModalOpen(true)}
|
|
785
785
|
className={isLoading ? "" : "cursor-pointer"}
|
|
786
786
|
>
|
|
787
|
-
<div className="bg-white dark:bg-[
|
|
787
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 h-full">
|
|
788
788
|
{isLoading ? (
|
|
789
789
|
<div className="space-y-3">
|
|
790
790
|
<div className="flex items-center justify-between">
|
|
791
|
-
<div className="bg-[
|
|
792
|
-
<div className="bg-[
|
|
791
|
+
<div className="bg-[var(--color-dash-label)]/20 rounded-lg h-9 w-9 animate-pulse"></div>
|
|
792
|
+
<div className="bg-[var(--color-dash-label)]/20 rounded-full h-5 w-16 animate-pulse"></div>
|
|
793
793
|
</div>
|
|
794
|
-
<div className="h-3 w-24 bg-[
|
|
795
|
-
<div className="h-10 w-32 bg-[
|
|
796
|
-
<div className="h-3 w-28 bg-[
|
|
794
|
+
<div className="h-3 w-24 bg-[var(--color-dash-label)]/20 rounded animate-pulse"></div>
|
|
795
|
+
<div className="h-10 w-32 bg-[var(--color-dash-label)]/20 rounded animate-pulse"></div>
|
|
796
|
+
<div className="h-3 w-28 bg-[var(--color-dash-label)]/20 rounded animate-pulse"></div>
|
|
797
797
|
</div>
|
|
798
798
|
) : (
|
|
799
799
|
<>
|
|
800
800
|
<div className="flex items-center justify-between mb-3">
|
|
801
|
-
<div className="bg-[
|
|
802
|
-
<BanknotesIcon className="h-5 w-5 text-[
|
|
801
|
+
<div className="bg-[var(--color-dash-success)]/10 rounded-lg p-2">
|
|
802
|
+
<BanknotesIcon className="h-5 w-5 text-[var(--color-dash-success)]" />
|
|
803
803
|
</div>
|
|
804
|
-
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-bold bg-[
|
|
804
|
+
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-bold bg-[var(--color-dash-success)]/10 text-[var(--color-dash-success)]">
|
|
805
805
|
+45%
|
|
806
806
|
</span>
|
|
807
807
|
</div>
|
|
808
|
-
<p className="text-[
|
|
809
|
-
<p className="text-4xl font-black text-[
|
|
810
|
-
<p className="text-xs text-[
|
|
808
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xs font-semibold mb-2 uppercase tracking-wider">Total Revenue</p>
|
|
809
|
+
<p className="text-4xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">${(myRevenue / 1000).toFixed(0)}K</p>
|
|
810
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">earned with Engine</p>
|
|
811
811
|
</>
|
|
812
812
|
)}
|
|
813
813
|
</div>
|
|
@@ -818,22 +818,22 @@ export default function PartnerHubDashboard() {
|
|
|
818
818
|
onClick={() => !isLoading && setIsDisputesModalOpen(true)}
|
|
819
819
|
className={isLoading ? "" : "cursor-pointer"}
|
|
820
820
|
>
|
|
821
|
-
<div className="bg-white dark:bg-[
|
|
821
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 border border-[var(--color-dash-warning)]/50 dark:border-[var(--color-dash-warning)]/30 h-full">
|
|
822
822
|
{isLoading ? (
|
|
823
823
|
<CardSkeleton lines={4} />
|
|
824
824
|
) : (
|
|
825
825
|
<>
|
|
826
826
|
<div className="flex items-center justify-between mb-3">
|
|
827
|
-
<div className="bg-[
|
|
828
|
-
<ExclamationTriangleIcon className="h-5 w-5 text-[
|
|
827
|
+
<div className="bg-[var(--color-dash-warning)]/10 rounded-lg p-2">
|
|
828
|
+
<ExclamationTriangleIcon className="h-5 w-5 text-[var(--color-dash-warning)]" />
|
|
829
829
|
</div>
|
|
830
|
-
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-bold bg-[
|
|
830
|
+
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-bold bg-[var(--color-dash-warning)] text-white">
|
|
831
831
|
REVIEW
|
|
832
832
|
</span>
|
|
833
833
|
</div>
|
|
834
|
-
<p className="text-[
|
|
835
|
-
<p className="text-4xl font-black text-[
|
|
836
|
-
<p className="text-xs text-[
|
|
834
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xs font-semibold mb-2 uppercase tracking-wider">Things to Review</p>
|
|
835
|
+
<p className="text-4xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">{myOpenDisputes}</p>
|
|
836
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">items need attention</p>
|
|
837
837
|
</>
|
|
838
838
|
)}
|
|
839
839
|
</div>
|
|
@@ -844,19 +844,19 @@ export default function PartnerHubDashboard() {
|
|
|
844
844
|
onClick={() => !isLoading && setIsPropertiesModalOpen(true)}
|
|
845
845
|
className={isLoading ? "" : "cursor-pointer"}
|
|
846
846
|
>
|
|
847
|
-
<div className="bg-white dark:bg-[
|
|
847
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 h-full">
|
|
848
848
|
{isLoading ? (
|
|
849
849
|
<CardSkeleton lines={4} />
|
|
850
850
|
) : (
|
|
851
851
|
<>
|
|
852
852
|
<div className="flex items-center justify-between mb-3">
|
|
853
|
-
<div className="bg-[
|
|
854
|
-
<BuildingOfficeIcon className="h-5 w-5 text-[
|
|
853
|
+
<div className="bg-[var(--color-dash-accent)]/10 rounded-lg p-2">
|
|
854
|
+
<BuildingOfficeIcon className="h-5 w-5 text-[var(--color-dash-accent)]" />
|
|
855
855
|
</div>
|
|
856
856
|
</div>
|
|
857
|
-
<p className="text-[
|
|
858
|
-
<p className="text-4xl font-black text-[
|
|
859
|
-
<p className="text-xs text-[
|
|
857
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xs font-semibold mb-2 uppercase tracking-wider">Properties</p>
|
|
858
|
+
<p className="text-4xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">{myProperties}</p>
|
|
859
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">active locations</p>
|
|
860
860
|
</>
|
|
861
861
|
)}
|
|
862
862
|
</div>
|
|
@@ -867,19 +867,19 @@ export default function PartnerHubDashboard() {
|
|
|
867
867
|
onClick={() => !isLoading && setIsReservationsModalOpen(true)}
|
|
868
868
|
className={isLoading ? "" : "cursor-pointer"}
|
|
869
869
|
>
|
|
870
|
-
<div className="bg-white dark:bg-[
|
|
870
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 h-full">
|
|
871
871
|
{isLoading ? (
|
|
872
872
|
<CardSkeleton lines={4} />
|
|
873
873
|
) : (
|
|
874
874
|
<>
|
|
875
875
|
<div className="flex items-center justify-between mb-3">
|
|
876
|
-
<div className="bg-[
|
|
877
|
-
<ClockIcon className="h-5 w-5 text-[
|
|
876
|
+
<div className="bg-[var(--color-dash-info)]/10 rounded-lg p-2">
|
|
877
|
+
<ClockIcon className="h-5 w-5 text-[var(--color-dash-info)]" />
|
|
878
878
|
</div>
|
|
879
879
|
</div>
|
|
880
|
-
<p className="text-[
|
|
881
|
-
<p className="text-4xl font-black text-[
|
|
882
|
-
<p className="text-xs text-[
|
|
880
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xs font-semibold mb-2 uppercase tracking-wider">Reservations</p>
|
|
881
|
+
<p className="text-4xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">{myReservations}</p>
|
|
882
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">through Engine</p>
|
|
883
883
|
</>
|
|
884
884
|
)}
|
|
885
885
|
</div>
|
|
@@ -890,19 +890,19 @@ export default function PartnerHubDashboard() {
|
|
|
890
890
|
onClick={() => !isLoading && setIsInvoicesModalOpen(true)}
|
|
891
891
|
className={isLoading ? "" : "cursor-pointer"}
|
|
892
892
|
>
|
|
893
|
-
<div className="bg-white dark:bg-[
|
|
893
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 shadow-sm hover:shadow-lg transition-all duration-300 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 h-full">
|
|
894
894
|
{isLoading ? (
|
|
895
895
|
<CardSkeleton lines={4} />
|
|
896
896
|
) : (
|
|
897
897
|
<>
|
|
898
898
|
<div className="flex items-center justify-between mb-3">
|
|
899
|
-
<div className="bg-[
|
|
900
|
-
<ShieldCheckIcon className="h-5 w-5 text-[
|
|
899
|
+
<div className="bg-[var(--color-dash-danger)]/10 rounded-lg p-2">
|
|
900
|
+
<ShieldCheckIcon className="h-5 w-5 text-[var(--color-dash-danger)]" />
|
|
901
901
|
</div>
|
|
902
902
|
</div>
|
|
903
|
-
<p className="text-[
|
|
904
|
-
<p className="text-4xl font-black text-[
|
|
905
|
-
<p className="text-xs text-[
|
|
903
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xs font-semibold mb-2 uppercase tracking-wider">Invoices</p>
|
|
904
|
+
<p className="text-4xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">{myPendingInvoices}</p>
|
|
905
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">ready to pay</p>
|
|
906
906
|
</>
|
|
907
907
|
)}
|
|
908
908
|
</div>
|
|
@@ -911,10 +911,10 @@ export default function PartnerHubDashboard() {
|
|
|
911
911
|
|
|
912
912
|
{/* Property Leaderboard - NEW SECTION */}
|
|
913
913
|
{isLoading ? (
|
|
914
|
-
<div className="bg-gradient-to-br from-white via-[
|
|
914
|
+
<div className="bg-gradient-to-br from-white via-[var(--color-dash-surface)] to-white dark:from-[var(--color-dash-text)] dark:via-[var(--color-dash-dark)] dark:to-[var(--color-dash-text)] rounded-2xl p-8 shadow-xl border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
915
915
|
<div className="mb-6">
|
|
916
|
-
<div className="h-9 w-96 bg-[
|
|
917
|
-
<div className="h-6 w-72 bg-[
|
|
916
|
+
<div className="h-9 w-96 bg-[var(--color-dash-label)]/20 rounded animate-pulse mb-2"></div>
|
|
917
|
+
<div className="h-6 w-72 bg-[var(--color-dash-label)]/20 rounded animate-pulse"></div>
|
|
918
918
|
</div>
|
|
919
919
|
<div className="space-y-4">
|
|
920
920
|
<CardSkeleton lines={4} />
|
|
@@ -924,12 +924,12 @@ export default function PartnerHubDashboard() {
|
|
|
924
924
|
</div>
|
|
925
925
|
</div>
|
|
926
926
|
) : (
|
|
927
|
-
<div className="bg-gradient-to-br from-white via-[
|
|
927
|
+
<div className="bg-gradient-to-br from-white via-[var(--color-dash-surface)] to-white dark:from-[var(--color-dash-text)] dark:via-[var(--color-dash-dark)] dark:to-[var(--color-dash-text)] rounded-2xl p-8 shadow-xl border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
928
928
|
<div className="mb-6">
|
|
929
|
-
<h2 className="text-3xl font-black text-[
|
|
929
|
+
<h2 className="text-3xl font-black text-[var(--color-dash-text)] dark:text-white tracking-tight mb-2">
|
|
930
930
|
Property Performance Leaderboard
|
|
931
931
|
</h2>
|
|
932
|
-
<p className="text-lg text-[
|
|
932
|
+
<p className="text-lg text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
933
933
|
Your 4 properties ranked by total revenue (last 6 months)
|
|
934
934
|
</p>
|
|
935
935
|
</div>
|
|
@@ -938,31 +938,31 @@ export default function PartnerHubDashboard() {
|
|
|
938
938
|
{propertyLeaderboard.map((property, idx) => {
|
|
939
939
|
// Determine icon and color based on rank
|
|
940
940
|
let RankIcon = StarIcon;
|
|
941
|
-
let iconColor = "text-[
|
|
942
|
-
let bgColor = "bg-[
|
|
941
|
+
let iconColor = "text-[var(--color-dash-label)]";
|
|
942
|
+
let bgColor = "bg-[var(--color-dash-label)]/10";
|
|
943
943
|
|
|
944
944
|
if (idx === 0) {
|
|
945
945
|
RankIcon = TrophyIcon;
|
|
946
|
-
iconColor = "text-[
|
|
947
|
-
bgColor = "bg-[
|
|
946
|
+
iconColor = "text-[var(--color-dash-warning)]";
|
|
947
|
+
bgColor = "bg-[var(--color-dash-warning)]/10";
|
|
948
948
|
} else if (idx === 1) {
|
|
949
949
|
RankIcon = StarIcon;
|
|
950
|
-
iconColor = "text-[
|
|
951
|
-
bgColor = "bg-[
|
|
950
|
+
iconColor = "text-[var(--color-dash-label)]";
|
|
951
|
+
bgColor = "bg-[var(--color-dash-label)]/10";
|
|
952
952
|
} else if (idx === 2) {
|
|
953
953
|
RankIcon = StarIcon;
|
|
954
|
-
iconColor = "text-[
|
|
955
|
-
bgColor = "bg-[
|
|
954
|
+
iconColor = "text-[var(--color-dash-warning)]";
|
|
955
|
+
bgColor = "bg-[var(--color-dash-warning)]/10";
|
|
956
956
|
} else {
|
|
957
957
|
RankIcon = RocketLaunchIcon;
|
|
958
|
-
iconColor = "text-[
|
|
959
|
-
bgColor = "bg-[
|
|
958
|
+
iconColor = "text-[var(--color-dash-accent)]";
|
|
959
|
+
bgColor = "bg-[var(--color-dash-accent)]/10";
|
|
960
960
|
}
|
|
961
961
|
|
|
962
962
|
return (
|
|
963
963
|
<div
|
|
964
964
|
key={idx}
|
|
965
|
-
className="group bg-white dark:bg-[
|
|
965
|
+
className="group bg-white dark:bg-[var(--color-dash-text)] rounded-xl p-6 border-2 border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 hover:border-[var(--color-dash-success)] hover:shadow-lg transition-all duration-300"
|
|
966
966
|
>
|
|
967
967
|
<div className="flex items-center justify-between gap-6">
|
|
968
968
|
<div className="flex items-center gap-4 flex-1">
|
|
@@ -974,32 +974,32 @@ export default function PartnerHubDashboard() {
|
|
|
974
974
|
{/* Property info */}
|
|
975
975
|
<div className="flex-1">
|
|
976
976
|
<div className="flex items-center gap-3 mb-2">
|
|
977
|
-
<h3 className="text-xl font-bold text-[
|
|
977
|
+
<h3 className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
978
978
|
{property.name}
|
|
979
979
|
</h3>
|
|
980
|
-
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-bold bg-[
|
|
980
|
+
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-bold bg-[var(--color-dash-success)]/20 text-[var(--color-dash-success)] border border-[var(--color-dash-success)]/30">
|
|
981
981
|
+{property.growth}% growth
|
|
982
982
|
</span>
|
|
983
983
|
</div>
|
|
984
|
-
<p className="text-sm text-[
|
|
984
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1">
|
|
985
985
|
{property.insight}
|
|
986
986
|
</p>
|
|
987
987
|
<div className="flex items-center gap-6 text-sm">
|
|
988
|
-
<span className="text-[
|
|
989
|
-
Total: <strong className="text-[
|
|
988
|
+
<span className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
989
|
+
Total: <strong className="text-[var(--color-dash-text)] dark:text-white">${property.revenue.toLocaleString()}</strong>
|
|
990
990
|
</span>
|
|
991
|
-
<span className="text-[
|
|
992
|
-
Latest: <strong className="text-[
|
|
991
|
+
<span className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
992
|
+
Latest: <strong className="text-[var(--color-dash-text)] dark:text-white">${property.latestRevenue.toLocaleString()}</strong>
|
|
993
993
|
</span>
|
|
994
994
|
</div>
|
|
995
995
|
</div>
|
|
996
996
|
|
|
997
997
|
{/* Growth indicator */}
|
|
998
998
|
<div className="text-right flex-shrink-0">
|
|
999
|
-
<p className="text-4xl font-black text-[
|
|
999
|
+
<p className="text-4xl font-black text-[var(--color-dash-success)] mb-1">
|
|
1000
1000
|
{property.growth}%
|
|
1001
1001
|
</p>
|
|
1002
|
-
<p className="text-xs text-[
|
|
1002
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1003
1003
|
Growth
|
|
1004
1004
|
</p>
|
|
1005
1005
|
</div>
|
|
@@ -1011,12 +1011,12 @@ export default function PartnerHubDashboard() {
|
|
|
1011
1011
|
</div>
|
|
1012
1012
|
|
|
1013
1013
|
{/* Summary insight */}
|
|
1014
|
-
<div className="mt-6 bg-[
|
|
1014
|
+
<div className="mt-6 bg-[var(--color-dash-info)]/10 border-l-4 border-[var(--color-dash-info)] rounded-r-lg p-5">
|
|
1015
1015
|
<div className="flex items-start gap-3">
|
|
1016
1016
|
<div className="flex-shrink-0">
|
|
1017
|
-
<LightBulbIcon className="h-5 w-5 text-[
|
|
1017
|
+
<LightBulbIcon className="h-5 w-5 text-[var(--color-dash-info)]" />
|
|
1018
1018
|
</div>
|
|
1019
|
-
<p className="text-base text-[
|
|
1019
|
+
<p className="text-base text-[var(--color-dash-text)] dark:text-white font-medium">
|
|
1020
1020
|
<strong>Key Insight:</strong> Austin is driving 41% of bookings through Engine and growing 60%.
|
|
1021
1021
|
SF Bay doubled in 6 months (100% growth) — strong performance across your portfolio.
|
|
1022
1022
|
</p>
|
|
@@ -1027,24 +1027,24 @@ export default function PartnerHubDashboard() {
|
|
|
1027
1027
|
|
|
1028
1028
|
{/* Penalty Calculation Issue Card */}
|
|
1029
1029
|
{!isLoading && myPenalties.filter((p: any) => p.isHero).length > 0 && (
|
|
1030
|
-
<div className="bg-white dark:bg-[
|
|
1030
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] border-2 border-[var(--color-dash-warning)]/50 rounded-2xl p-8 shadow-lg hover:shadow-xl transition-shadow duration-300">
|
|
1031
1031
|
<div className="flex items-start gap-4 mb-6">
|
|
1032
1032
|
<div className="flex-shrink-0">
|
|
1033
|
-
<div className="bg-[
|
|
1034
|
-
<ExclamationTriangleIcon className="h-8 w-8 text-[
|
|
1033
|
+
<div className="bg-[var(--color-dash-warning)]/10 rounded-xl p-3">
|
|
1034
|
+
<ExclamationTriangleIcon className="h-8 w-8 text-[var(--color-dash-warning)]" />
|
|
1035
1035
|
</div>
|
|
1036
1036
|
</div>
|
|
1037
1037
|
<div className="flex-1">
|
|
1038
1038
|
<div className="flex items-start justify-between gap-4 mb-2">
|
|
1039
1039
|
<div>
|
|
1040
|
-
<h3 className="text-2xl font-bold text-[
|
|
1040
|
+
<h3 className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white mb-1">
|
|
1041
1041
|
Penalty Calculation Issue
|
|
1042
1042
|
</h3>
|
|
1043
|
-
<p className="text-sm text-[
|
|
1043
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1044
1044
|
ATR-00001 · Summit Austin Convention Center · TechCorp Inc. booking
|
|
1045
1045
|
</p>
|
|
1046
1046
|
</div>
|
|
1047
|
-
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-bold bg-[
|
|
1047
|
+
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-bold bg-[var(--color-dash-warning)] text-white flex-shrink-0">
|
|
1048
1048
|
NEEDS REVIEW
|
|
1049
1049
|
</span>
|
|
1050
1050
|
</div>
|
|
@@ -1052,27 +1052,27 @@ export default function PartnerHubDashboard() {
|
|
|
1052
1052
|
</div>
|
|
1053
1053
|
|
|
1054
1054
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
|
|
1055
|
-
<div className="bg-[
|
|
1056
|
-
<p className="text-xs font-semibold text-[
|
|
1057
|
-
<p className="text-3xl font-black text-[
|
|
1058
|
-
<p className="text-xs text-[
|
|
1055
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-5 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1056
|
+
<p className="text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Current Penalty</p>
|
|
1057
|
+
<p className="text-3xl font-black text-[var(--color-dash-text)] dark:text-white mb-1">$9,000</p>
|
|
1058
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">You owe Engine</p>
|
|
1059
1059
|
</div>
|
|
1060
|
-
<div className="bg-[
|
|
1061
|
-
<p className="text-xs font-semibold text-[
|
|
1062
|
-
<p className="text-3xl font-black text-[
|
|
1063
|
-
<p className="text-xs text-[
|
|
1060
|
+
<div className="bg-[var(--color-dash-success)]/5 dark:bg-[var(--color-dash-success)]/10 rounded-xl p-5 border border-[var(--color-dash-success)]/30">
|
|
1061
|
+
<p className="text-xs font-semibold text-[var(--color-dash-success)] mb-2 uppercase tracking-wider">Resale Credit Missing</p>
|
|
1062
|
+
<p className="text-3xl font-black text-[var(--color-dash-success)] mb-1">-$2,400</p>
|
|
1063
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">Should reduce penalty</p>
|
|
1064
1064
|
</div>
|
|
1065
|
-
<div className="bg-[
|
|
1066
|
-
<p className="text-xs font-semibold text-[
|
|
1067
|
-
<p className="text-3xl font-black text-[
|
|
1068
|
-
<p className="text-xs text-[
|
|
1065
|
+
<div className="bg-[var(--color-dash-accent)]/5 dark:bg-[var(--color-dash-accent)]/10 rounded-xl p-5 border border-[var(--color-dash-accent)]/30">
|
|
1066
|
+
<p className="text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Corrected Amount</p>
|
|
1067
|
+
<p className="text-3xl font-black text-[var(--color-dash-accent)] mb-1">$6,600</p>
|
|
1068
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">What you should owe</p>
|
|
1069
1069
|
</div>
|
|
1070
1070
|
</div>
|
|
1071
1071
|
|
|
1072
|
-
<div className="bg-[
|
|
1073
|
-
<p className="text-sm text-[
|
|
1072
|
+
<div className="bg-[var(--color-dash-warning)]/10 border-l-4 border-[var(--color-dash-warning)] rounded-r-lg p-4 mb-6">
|
|
1073
|
+
<p className="text-sm text-[var(--color-dash-text)] dark:text-white leading-relaxed">
|
|
1074
1074
|
Your contract specifies a <strong>50% resale credit</strong> for rooms that were resold. Based on <strong>8 rooms at $200/night for 3 nights</strong>,
|
|
1075
|
-
you should receive a <strong className="text-[
|
|
1075
|
+
you should receive a <strong className="text-[var(--color-dash-success)]">$2,400 credit</strong> that wasn't applied. This should reduce your penalty from $9,000 to <strong>$6,600</strong>.
|
|
1076
1076
|
</p>
|
|
1077
1077
|
</div>
|
|
1078
1078
|
|
|
@@ -1081,7 +1081,7 @@ export default function PartnerHubDashboard() {
|
|
|
1081
1081
|
setSelectedPenalty(myPenalties.find((p: any) => p.isHero));
|
|
1082
1082
|
setIsPenaltyModalOpen(true);
|
|
1083
1083
|
}}
|
|
1084
|
-
className="inline-flex items-center gap-2 px-6 py-3 bg-[
|
|
1084
|
+
className="inline-flex items-center gap-2 px-6 py-3 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-xl transition-all duration-200 hover:shadow-lg group"
|
|
1085
1085
|
>
|
|
1086
1086
|
<ExclamationTriangleIcon className="h-5 w-5" />
|
|
1087
1087
|
Review This Calculation
|
|
@@ -1094,10 +1094,10 @@ export default function PartnerHubDashboard() {
|
|
|
1094
1094
|
|
|
1095
1095
|
{/* Section - Conversational with Better Spacing */}
|
|
1096
1096
|
<div className="pt-8 space-y-2">
|
|
1097
|
-
<h2 className="text-3xl font-bold text-[
|
|
1097
|
+
<h2 className="text-3xl font-bold text-[var(--color-dash-text)] dark:text-white tracking-tight">
|
|
1098
1098
|
Recent activity
|
|
1099
1099
|
</h2>
|
|
1100
|
-
<p className="text-lg text-[
|
|
1100
|
+
<p className="text-lg text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1101
1101
|
Here's what's been happening with your properties
|
|
1102
1102
|
</p>
|
|
1103
1103
|
</div>
|
|
@@ -1112,7 +1112,7 @@ export default function PartnerHubDashboard() {
|
|
|
1112
1112
|
</div>
|
|
1113
1113
|
) : myDisputes.length > 0 ? (
|
|
1114
1114
|
<div className="space-y-5">
|
|
1115
|
-
<h3 className="text-xl font-bold text-[
|
|
1115
|
+
<h3 className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1116
1116
|
Items that need your attention
|
|
1117
1117
|
</h3>
|
|
1118
1118
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-5">
|
|
@@ -1123,33 +1123,33 @@ export default function PartnerHubDashboard() {
|
|
|
1123
1123
|
toast.info(`Opening ${d.title}`);
|
|
1124
1124
|
setSelectedDispute(d);
|
|
1125
1125
|
}}
|
|
1126
|
-
className="group bg-white dark:bg-[
|
|
1126
|
+
className="group bg-white dark:bg-[var(--color-dash-text)] border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 rounded-xl p-6 hover:border-[var(--color-dash-accent)] dark:hover:border-[var(--color-dash-accent)] transition-all duration-300 hover:shadow-lg cursor-pointer"
|
|
1127
1127
|
>
|
|
1128
1128
|
<div className="flex items-start justify-between gap-3 mb-3">
|
|
1129
|
-
<h4 className="font-semibold text-[
|
|
1129
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white flex-1">
|
|
1130
1130
|
{d.title}
|
|
1131
1131
|
</h4>
|
|
1132
1132
|
<span
|
|
1133
1133
|
className={`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium flex-shrink-0 ${
|
|
1134
1134
|
d.status === "critical"
|
|
1135
|
-
? "bg-[
|
|
1135
|
+
? "bg-[var(--color-dash-danger)]/10 text-[var(--color-dash-danger)] border border-[var(--color-dash-danger)]/30"
|
|
1136
1136
|
: d.status === "warning"
|
|
1137
|
-
? "bg-[
|
|
1138
|
-
: "bg-[
|
|
1137
|
+
? "bg-[var(--color-dash-warning)]/10 text-[var(--color-dash-warning)] border border-[var(--color-dash-warning)]/30"
|
|
1138
|
+
: "bg-[var(--color-dash-info)]/10 text-[var(--color-dash-info)] border border-[var(--color-dash-info)]/30"
|
|
1139
1139
|
}`}
|
|
1140
1140
|
>
|
|
1141
1141
|
{d.badge}
|
|
1142
1142
|
</span>
|
|
1143
1143
|
</div>
|
|
1144
|
-
<p className="text-sm text-[
|
|
1144
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-4">
|
|
1145
1145
|
{d.description}
|
|
1146
1146
|
</p>
|
|
1147
1147
|
<div className="flex items-center justify-between">
|
|
1148
|
-
<span className="text-lg font-bold text-[
|
|
1148
|
+
<span className="text-lg font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1149
1149
|
${d.amount.toLocaleString()}
|
|
1150
1150
|
</span>
|
|
1151
1151
|
{d.agentHandled && (
|
|
1152
|
-
<span className="text-xs text-[
|
|
1152
|
+
<span className="text-xs text-[var(--color-dash-accent)] flex items-center gap-1">
|
|
1153
1153
|
<svg className="h-3 w-3" fill="currentColor" viewBox="0 0 20 20">
|
|
1154
1154
|
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
|
1155
1155
|
</svg>
|
|
@@ -1167,43 +1167,43 @@ export default function PartnerHubDashboard() {
|
|
|
1167
1167
|
{isLoading ? (
|
|
1168
1168
|
<CardSkeleton lines={8} />
|
|
1169
1169
|
) : (
|
|
1170
|
-
<div className="bg-white dark:bg-[
|
|
1171
|
-
<div className="p-8 border-b border-[
|
|
1172
|
-
<h3 className="text-2xl font-bold text-[
|
|
1170
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 rounded-xl overflow-hidden shadow-sm hover:shadow-lg transition-shadow duration-300">
|
|
1171
|
+
<div className="p-8 border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1172
|
+
<h3 className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white mb-2">
|
|
1173
1173
|
All attrition penalties
|
|
1174
1174
|
</h3>
|
|
1175
|
-
<p className="text-base text-[
|
|
1175
|
+
<p className="text-base text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1176
1176
|
{myPenalties.length} {myPenalties.length === 1 ? 'penalty' : 'penalties'} · Showing recent calculations and adjustments
|
|
1177
1177
|
</p>
|
|
1178
1178
|
</div>
|
|
1179
1179
|
<div className="overflow-x-auto">
|
|
1180
1180
|
<table className="w-full">
|
|
1181
|
-
<thead className="bg-[
|
|
1181
|
+
<thead className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1182
1182
|
<tr>
|
|
1183
|
-
<th className="px-6 py-3 text-left text-xs font-semibold text-[
|
|
1183
|
+
<th className="px-6 py-3 text-left text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1184
1184
|
Penalty ID
|
|
1185
1185
|
</th>
|
|
1186
|
-
<th className="px-6 py-3 text-left text-xs font-semibold text-[
|
|
1186
|
+
<th className="px-6 py-3 text-left text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1187
1187
|
Property
|
|
1188
1188
|
</th>
|
|
1189
|
-
<th className="px-6 py-3 text-left text-xs font-semibold text-[
|
|
1189
|
+
<th className="px-6 py-3 text-left text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1190
1190
|
Customer
|
|
1191
1191
|
</th>
|
|
1192
|
-
<th className="px-6 py-3 text-left text-xs font-semibold text-[
|
|
1192
|
+
<th className="px-6 py-3 text-left text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1193
1193
|
Method
|
|
1194
1194
|
</th>
|
|
1195
|
-
<th className="px-6 py-3 text-right text-xs font-semibold text-[
|
|
1195
|
+
<th className="px-6 py-3 text-right text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1196
1196
|
Penalty
|
|
1197
1197
|
</th>
|
|
1198
|
-
<th className="px-6 py-3 text-right text-xs font-semibold text-[
|
|
1198
|
+
<th className="px-6 py-3 text-right text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1199
1199
|
Credit
|
|
1200
1200
|
</th>
|
|
1201
|
-
<th className="px-6 py-3 text-center text-xs font-semibold text-[
|
|
1201
|
+
<th className="px-6 py-3 text-center text-xs font-semibold text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] uppercase tracking-wider">
|
|
1202
1202
|
Status
|
|
1203
1203
|
</th>
|
|
1204
1204
|
</tr>
|
|
1205
1205
|
</thead>
|
|
1206
|
-
<tbody className="divide-y divide-[
|
|
1206
|
+
<tbody className="divide-y divide-[var(--color-dash-label)]/20 dark:divide-[var(--color-dash-muted)]/30">
|
|
1207
1207
|
{myPenalties.map((penalty) => (
|
|
1208
1208
|
<tr
|
|
1209
1209
|
key={penalty.id}
|
|
@@ -1211,47 +1211,47 @@ export default function PartnerHubDashboard() {
|
|
|
1211
1211
|
setSelectedPenalty(penalty);
|
|
1212
1212
|
setIsPenaltyModalOpen(true);
|
|
1213
1213
|
}}
|
|
1214
|
-
className={`hover:bg-[
|
|
1215
|
-
penalty.isHero ? "bg-[
|
|
1214
|
+
className={`hover:bg-[var(--color-dash-surface)]/50 dark:hover:bg-[var(--color-dash-muted)]/5 transition-colors cursor-pointer ${
|
|
1215
|
+
penalty.isHero ? "bg-[var(--color-dash-warning)]/5" : ""
|
|
1216
1216
|
}`}
|
|
1217
1217
|
>
|
|
1218
1218
|
<td className="px-6 py-4 whitespace-nowrap">
|
|
1219
1219
|
<div className="flex items-center gap-2">
|
|
1220
|
-
<span className="text-sm font-medium text-[
|
|
1220
|
+
<span className="text-sm font-medium text-[var(--color-dash-text)] dark:text-white">
|
|
1221
1221
|
{penalty.name}
|
|
1222
1222
|
</span>
|
|
1223
1223
|
{penalty.isHero && (
|
|
1224
|
-
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-[
|
|
1224
|
+
<span className="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-[var(--color-dash-warning)]/20 text-[var(--color-dash-warning)] border border-[var(--color-dash-warning)]/30">
|
|
1225
1225
|
Review
|
|
1226
1226
|
</span>
|
|
1227
1227
|
)}
|
|
1228
1228
|
</div>
|
|
1229
1229
|
</td>
|
|
1230
|
-
<td className="px-6 py-4 text-sm text-[
|
|
1230
|
+
<td className="px-6 py-4 text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1231
1231
|
{penalty.property}
|
|
1232
1232
|
</td>
|
|
1233
|
-
<td className="px-6 py-4 text-sm text-[
|
|
1233
|
+
<td className="px-6 py-4 text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1234
1234
|
{penalty.customer}
|
|
1235
1235
|
</td>
|
|
1236
|
-
<td className="px-6 py-4 text-sm text-[
|
|
1236
|
+
<td className="px-6 py-4 text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1237
1237
|
{penalty.method}
|
|
1238
1238
|
</td>
|
|
1239
|
-
<td className="px-6 py-4 text-sm font-semibold text-right text-[
|
|
1239
|
+
<td className="px-6 py-4 text-sm font-semibold text-right text-[var(--color-dash-text)] dark:text-white">
|
|
1240
1240
|
${penalty.penalty.toLocaleString()}
|
|
1241
1241
|
</td>
|
|
1242
|
-
<td className="px-6 py-4 text-sm font-semibold text-right text-[
|
|
1242
|
+
<td className="px-6 py-4 text-sm font-semibold text-right text-[var(--color-dash-success)]">
|
|
1243
1243
|
${penalty.credit.toLocaleString()}
|
|
1244
1244
|
</td>
|
|
1245
1245
|
<td className="px-6 py-4 text-center">
|
|
1246
1246
|
<span
|
|
1247
1247
|
className={`inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium ${
|
|
1248
1248
|
penalty.status === "Approved"
|
|
1249
|
-
? "bg-[
|
|
1249
|
+
? "bg-[var(--color-dash-success)]/10 text-[var(--color-dash-success)] border border-[var(--color-dash-success)]/30"
|
|
1250
1250
|
: penalty.status === "Reviewed"
|
|
1251
|
-
? "bg-[
|
|
1251
|
+
? "bg-[var(--color-dash-info)]/10 text-[var(--color-dash-info)] border border-[var(--color-dash-info)]/30"
|
|
1252
1252
|
: penalty.status === "Calculated"
|
|
1253
|
-
? "bg-[
|
|
1254
|
-
: "bg-[
|
|
1253
|
+
? "bg-[var(--color-dash-label)]/10 text-[var(--color-dash-muted)] border border-[var(--color-dash-label)]/30"
|
|
1254
|
+
: "bg-[var(--color-dash-danger)]/10 text-[var(--color-dash-danger)] border border-[var(--color-dash-danger)]/30"
|
|
1255
1255
|
}`}
|
|
1256
1256
|
>
|
|
1257
1257
|
{penalty.status}
|
|
@@ -1267,10 +1267,10 @@ export default function PartnerHubDashboard() {
|
|
|
1267
1267
|
|
|
1268
1268
|
{/* Section */}
|
|
1269
1269
|
<div className="pt-8 space-y-2">
|
|
1270
|
-
<h2 className="text-3xl font-bold text-[
|
|
1270
|
+
<h2 className="text-3xl font-bold text-[var(--color-dash-text)] dark:text-white tracking-tight">
|
|
1271
1271
|
Billing & contract details
|
|
1272
1272
|
</h2>
|
|
1273
|
-
<p className="text-lg text-[
|
|
1273
|
+
<p className="text-lg text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1274
1274
|
Keep track of invoices and your partnership terms
|
|
1275
1275
|
</p>
|
|
1276
1276
|
</div>
|
|
@@ -1279,14 +1279,14 @@ export default function PartnerHubDashboard() {
|
|
|
1279
1279
|
{isLoading ? (
|
|
1280
1280
|
<CardSkeleton lines={6} />
|
|
1281
1281
|
) : (
|
|
1282
|
-
<div className="bg-white dark:bg-[
|
|
1283
|
-
<div className="p-8 border-b border-[
|
|
1282
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 rounded-xl shadow-sm hover:shadow-lg transition-shadow duration-300 overflow-hidden">
|
|
1283
|
+
<div className="p-8 border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1284
1284
|
<div className="flex items-start justify-between gap-4">
|
|
1285
1285
|
<div>
|
|
1286
|
-
<h3 className="text-2xl font-bold text-[
|
|
1286
|
+
<h3 className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white mb-1">
|
|
1287
1287
|
Revenue trend by property
|
|
1288
1288
|
</h3>
|
|
1289
|
-
<p className="text-base text-[
|
|
1289
|
+
<p className="text-base text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1290
1290
|
Monthly revenue earned through Engine across your {revenueTrendByProperty.properties?.length || 4} properties
|
|
1291
1291
|
</p>
|
|
1292
1292
|
</div>
|
|
@@ -1299,7 +1299,7 @@ export default function PartnerHubDashboard() {
|
|
|
1299
1299
|
className="inline-block h-2.5 w-2.5 rounded-full flex-shrink-0"
|
|
1300
1300
|
style={{ backgroundColor: prop.color }}
|
|
1301
1301
|
/>
|
|
1302
|
-
<span className="text-xs font-medium text-[
|
|
1302
|
+
<span className="text-xs font-medium text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1303
1303
|
{prop.name}
|
|
1304
1304
|
</span>
|
|
1305
1305
|
</div>
|
|
@@ -1318,7 +1318,7 @@ export default function PartnerHubDashboard() {
|
|
|
1318
1318
|
/>
|
|
1319
1319
|
</div>
|
|
1320
1320
|
) : (
|
|
1321
|
-
<div className="h-[260px] flex items-center justify-center text-[
|
|
1321
|
+
<div className="h-[260px] flex items-center justify-center text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1322
1322
|
Loading chart data...
|
|
1323
1323
|
</div>
|
|
1324
1324
|
)}
|
|
@@ -1357,52 +1357,52 @@ export default function PartnerHubDashboard() {
|
|
|
1357
1357
|
loading={isLoading}
|
|
1358
1358
|
/>
|
|
1359
1359
|
|
|
1360
|
-
<div className="bg-white dark:bg-[
|
|
1361
|
-
<div className="p-6 border-b border-[
|
|
1362
|
-
<h3 className="text-xl font-bold text-[
|
|
1360
|
+
<div className="bg-white dark:bg-[var(--color-dash-text)] border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 rounded-xl shadow-sm hover:shadow-lg transition-shadow duration-300 overflow-hidden">
|
|
1361
|
+
<div className="p-6 border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1362
|
+
<h3 className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white mb-1">
|
|
1363
1363
|
Your Contract
|
|
1364
1364
|
</h3>
|
|
1365
|
-
<p className="text-sm text-[
|
|
1365
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1366
1366
|
Partnership terms
|
|
1367
1367
|
</p>
|
|
1368
1368
|
</div>
|
|
1369
1369
|
<div className="p-6 space-y-4">
|
|
1370
|
-
<div className="flex items-center justify-between pb-4 border-b border-[
|
|
1370
|
+
<div className="flex items-center justify-between pb-4 border-b border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1371
1371
|
<div>
|
|
1372
|
-
<p className="text-xs text-[
|
|
1373
|
-
<p className="text-lg font-bold text-[
|
|
1372
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1 uppercase tracking-wider">Contract ID</p>
|
|
1373
|
+
<p className="text-lg font-bold text-[var(--color-dash-text)] dark:text-white">CNTR-00002</p>
|
|
1374
1374
|
</div>
|
|
1375
|
-
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-medium bg-[
|
|
1375
|
+
<span className="inline-flex items-center rounded-full px-3 py-1 text-xs font-medium bg-[var(--color-dash-success)]/10 text-[var(--color-dash-success)] border border-[var(--color-dash-success)]/30">
|
|
1376
1376
|
Active
|
|
1377
1377
|
</span>
|
|
1378
1378
|
</div>
|
|
1379
1379
|
|
|
1380
1380
|
<div className="grid grid-cols-2 gap-4">
|
|
1381
1381
|
<div>
|
|
1382
|
-
<p className="text-xs text-[
|
|
1383
|
-
<p className="text-2xl font-bold text-[
|
|
1382
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1 uppercase tracking-wider">Commission Rate</p>
|
|
1383
|
+
<p className="text-2xl font-bold text-[var(--color-dash-success)]">17%</p>
|
|
1384
1384
|
</div>
|
|
1385
1385
|
<div>
|
|
1386
|
-
<p className="text-xs text-[
|
|
1387
|
-
<p className="text-sm font-semibold text-[
|
|
1386
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1 uppercase tracking-wider">Contract Term</p>
|
|
1387
|
+
<p className="text-sm font-semibold text-[var(--color-dash-text)] dark:text-white">Mar 2025 - Feb 2027</p>
|
|
1388
1388
|
</div>
|
|
1389
1389
|
</div>
|
|
1390
1390
|
|
|
1391
|
-
<div className="bg-[
|
|
1391
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-lg p-4 space-y-3">
|
|
1392
1392
|
<div>
|
|
1393
|
-
<p className="text-xs text-[
|
|
1394
|
-
<p className="text-sm font-semibold text-[
|
|
1393
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1 uppercase tracking-wider">Attrition Method</p>
|
|
1394
|
+
<p className="text-sm font-semibold text-[var(--color-dash-text)] dark:text-white">Per Night (80% threshold)</p>
|
|
1395
1395
|
</div>
|
|
1396
1396
|
<div>
|
|
1397
|
-
<p className="text-xs text-[
|
|
1398
|
-
<p className="text-sm font-semibold text-[
|
|
1397
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1 uppercase tracking-wider">Resale Credit Policy</p>
|
|
1398
|
+
<p className="text-sm font-semibold text-[var(--color-dash-text)] dark:text-white">Partial Credit (50%)</p>
|
|
1399
1399
|
</div>
|
|
1400
1400
|
</div>
|
|
1401
1401
|
|
|
1402
1402
|
<div className="pt-2">
|
|
1403
1403
|
<button
|
|
1404
1404
|
onClick={() => toast.info("Opening full contract PDF...")}
|
|
1405
|
-
className="w-full inline-flex items-center justify-center gap-2 px-4 py-3 bg-[
|
|
1405
|
+
className="w-full inline-flex items-center justify-center gap-2 px-4 py-3 bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/20 hover:bg-[var(--color-dash-accent)]/10 dark:hover:bg-[var(--color-dash-accent)]/10 text-[var(--color-dash-text)] dark:text-white font-semibold rounded-lg border border-[var(--color-dash-label)]/30 dark:border-[var(--color-dash-muted)]/50 hover:border-[var(--color-dash-accent)] transition-colors text-sm"
|
|
1406
1406
|
>
|
|
1407
1407
|
<DocumentArrowDownIcon className="h-4 w-4" />
|
|
1408
1408
|
Download Full Contract
|
|
@@ -1415,10 +1415,10 @@ export default function PartnerHubDashboard() {
|
|
|
1415
1415
|
|
|
1416
1416
|
{/* Section */}
|
|
1417
1417
|
<div className="pt-8 space-y-2">
|
|
1418
|
-
<h2 className="text-3xl font-bold text-[
|
|
1418
|
+
<h2 className="text-3xl font-bold text-[var(--color-dash-text)] dark:text-white tracking-tight">
|
|
1419
1419
|
What's been happening
|
|
1420
1420
|
</h2>
|
|
1421
|
-
<p className="text-lg text-[
|
|
1421
|
+
<p className="text-lg text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1422
1422
|
A quick timeline of recent updates
|
|
1423
1423
|
</p>
|
|
1424
1424
|
</div>
|
|
@@ -1447,17 +1447,17 @@ export default function PartnerHubDashboard() {
|
|
|
1447
1447
|
)}
|
|
1448
1448
|
|
|
1449
1449
|
{/* Help Section - Enhanced */}
|
|
1450
|
-
<div className="bg-gradient-to-br from-white to-[
|
|
1450
|
+
<div className="bg-gradient-to-br from-white to-[var(--color-dash-surface)] dark:from-[var(--color-dash-text)] dark:to-[var(--color-dash-dark)] rounded-2xl p-12 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 shadow-lg">
|
|
1451
1451
|
<div className="text-center max-w-2xl mx-auto space-y-6">
|
|
1452
|
-
<h3 className="text-3xl font-bold text-[
|
|
1452
|
+
<h3 className="text-3xl font-bold text-[var(--color-dash-text)] dark:text-white tracking-tight">
|
|
1453
1453
|
Questions? We're here to help
|
|
1454
1454
|
</h3>
|
|
1455
|
-
<p className="text-[
|
|
1455
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] text-xl leading-relaxed">
|
|
1456
1456
|
Our partner team is standing by if you need anything — from billing questions to contract details.
|
|
1457
1457
|
</p>
|
|
1458
1458
|
<div className="flex gap-4 justify-center flex-wrap pt-2">
|
|
1459
1459
|
<Modal>
|
|
1460
|
-
<button className="group px-8 py-4 bg-[
|
|
1460
|
+
<button className="group px-8 py-4 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-xl transition-colors duration-200 hover:shadow-xl">
|
|
1461
1461
|
Get in touch
|
|
1462
1462
|
</button>
|
|
1463
1463
|
<Modal.Backdrop>
|
|
@@ -1465,52 +1465,52 @@ export default function PartnerHubDashboard() {
|
|
|
1465
1465
|
<Modal.Dialog className="max-w-2xl">
|
|
1466
1466
|
<Modal.CloseTrigger />
|
|
1467
1467
|
<Modal.Header>
|
|
1468
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1468
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1469
1469
|
Contact Support
|
|
1470
1470
|
</Modal.Heading>
|
|
1471
1471
|
</Modal.Header>
|
|
1472
1472
|
<Modal.Body className="space-y-6">
|
|
1473
|
-
<p className="text-[
|
|
1473
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1474
1474
|
Our partner support team is here to help with billing questions, contract details, or any other issues you may have.
|
|
1475
1475
|
</p>
|
|
1476
1476
|
|
|
1477
1477
|
{/* Contact Options */}
|
|
1478
1478
|
<div className="space-y-4">
|
|
1479
|
-
<div className="bg-[
|
|
1479
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-6 hover:border hover:border-[var(--color-dash-accent)] transition-colors cursor-pointer">
|
|
1480
1480
|
<div className="flex items-start gap-4">
|
|
1481
|
-
<div className="bg-[
|
|
1482
|
-
<svg className="h-6 w-6 text-[
|
|
1481
|
+
<div className="bg-[var(--color-dash-accent)]/20 rounded-lg p-3">
|
|
1482
|
+
<svg className="h-6 w-6 text-[var(--color-dash-accent)]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
1483
1483
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
1484
1484
|
</svg>
|
|
1485
1485
|
</div>
|
|
1486
1486
|
<div>
|
|
1487
|
-
<h4 className="font-semibold text-[
|
|
1488
|
-
<p className="text-sm text-[
|
|
1487
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-1">Email Support</h4>
|
|
1488
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">
|
|
1489
1489
|
Get help via email - we typically respond within 2-4 hours
|
|
1490
1490
|
</p>
|
|
1491
|
-
<a href="mailto:partners@engine.com" className="text-sm font-medium text-[
|
|
1491
|
+
<a href="mailto:partners@engine.com" className="text-sm font-medium text-[var(--color-dash-accent)] hover:underline">
|
|
1492
1492
|
partners@engine.com
|
|
1493
1493
|
</a>
|
|
1494
1494
|
</div>
|
|
1495
1495
|
</div>
|
|
1496
1496
|
</div>
|
|
1497
1497
|
|
|
1498
|
-
<div className="bg-[
|
|
1498
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-6 hover:border hover:border-[var(--color-dash-accent)] transition-colors cursor-pointer">
|
|
1499
1499
|
<div className="flex items-start gap-4">
|
|
1500
|
-
<div className="bg-[
|
|
1501
|
-
<svg className="h-6 w-6 text-[
|
|
1500
|
+
<div className="bg-[var(--color-dash-success)]/20 rounded-lg p-3">
|
|
1501
|
+
<svg className="h-6 w-6 text-[var(--color-dash-success)]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
1502
1502
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
|
|
1503
1503
|
</svg>
|
|
1504
1504
|
</div>
|
|
1505
1505
|
<div>
|
|
1506
|
-
<h4 className="font-semibold text-[
|
|
1507
|
-
<p className="text-sm text-[
|
|
1506
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-1">Phone Support</h4>
|
|
1507
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">
|
|
1508
1508
|
Speak with a partner specialist directly
|
|
1509
1509
|
</p>
|
|
1510
|
-
<a href="tel:+18005551234" className="text-sm font-medium text-[
|
|
1510
|
+
<a href="tel:+18005551234" className="text-sm font-medium text-[var(--color-dash-success)] hover:underline">
|
|
1511
1511
|
1-800-555-1234
|
|
1512
1512
|
</a>
|
|
1513
|
-
<p className="text-xs text-[
|
|
1513
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mt-1">
|
|
1514
1514
|
Mon-Fri, 8am-6pm EST
|
|
1515
1515
|
</p>
|
|
1516
1516
|
</div>
|
|
@@ -1520,7 +1520,7 @@ export default function PartnerHubDashboard() {
|
|
|
1520
1520
|
</Modal.Body>
|
|
1521
1521
|
<Modal.Footer>
|
|
1522
1522
|
<div className="flex gap-3 justify-end">
|
|
1523
|
-
<Modal.CloseTrigger className="px-6 py-2 bg-[
|
|
1523
|
+
<Modal.CloseTrigger className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors">
|
|
1524
1524
|
Close
|
|
1525
1525
|
</Modal.CloseTrigger>
|
|
1526
1526
|
</div>
|
|
@@ -1532,7 +1532,7 @@ export default function PartnerHubDashboard() {
|
|
|
1532
1532
|
|
|
1533
1533
|
<button
|
|
1534
1534
|
onClick={() => toast.info("Opening help documentation...")}
|
|
1535
|
-
className="group px-8 py-4 bg-transparent hover:bg-[
|
|
1535
|
+
className="group px-8 py-4 bg-transparent hover:bg-[var(--color-dash-surface)] dark:hover:bg-[var(--color-dash-muted)]/20 text-[var(--color-dash-text)] dark:text-white font-semibold rounded-xl border-2 border-[var(--color-dash-label)]/30 dark:border-[var(--color-dash-muted)]/50 hover:border-[var(--color-dash-accent)] transition-colors duration-200"
|
|
1536
1536
|
>
|
|
1537
1537
|
Browse help docs
|
|
1538
1538
|
</button>
|
|
@@ -1541,7 +1541,7 @@ export default function PartnerHubDashboard() {
|
|
|
1541
1541
|
</div>
|
|
1542
1542
|
|
|
1543
1543
|
{/* Footer */}
|
|
1544
|
-
<div className="text-center py-8 text-sm text-[
|
|
1544
|
+
<div className="text-center py-8 text-sm text-[var(--color-dash-label)]">
|
|
1545
1545
|
<p>© 2026 Engine · Welcome to modern travel management</p>
|
|
1546
1546
|
</div>
|
|
1547
1547
|
</div>
|
|
@@ -1553,30 +1553,30 @@ export default function PartnerHubDashboard() {
|
|
|
1553
1553
|
<Modal.Dialog className="max-w-4xl">
|
|
1554
1554
|
<Modal.CloseTrigger />
|
|
1555
1555
|
<Modal.Header>
|
|
1556
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1556
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1557
1557
|
Your Properties
|
|
1558
1558
|
</Modal.Heading>
|
|
1559
1559
|
</Modal.Header>
|
|
1560
1560
|
<Modal.Body className="space-y-4">
|
|
1561
|
-
<p className="text-[
|
|
1561
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-4">
|
|
1562
1562
|
{myProperties} active properties in your portfolio
|
|
1563
1563
|
</p>
|
|
1564
1564
|
<div className="space-y-3">
|
|
1565
1565
|
{revenueTrendByProperty.properties?.map((prop, idx) => (
|
|
1566
1566
|
<div
|
|
1567
1567
|
key={idx}
|
|
1568
|
-
className="bg-[
|
|
1568
|
+
className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-5 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 hover:border-[var(--color-dash-accent)] transition-colors"
|
|
1569
1569
|
>
|
|
1570
1570
|
<div className="flex items-start justify-between gap-4">
|
|
1571
1571
|
<div className="flex items-start gap-3 flex-1">
|
|
1572
1572
|
<div className="mt-1">
|
|
1573
|
-
<BuildingOfficeIcon className="h-5 w-5 text-[
|
|
1573
|
+
<BuildingOfficeIcon className="h-5 w-5 text-[var(--color-dash-accent)]" />
|
|
1574
1574
|
</div>
|
|
1575
1575
|
<div>
|
|
1576
|
-
<h4 className="font-semibold text-[
|
|
1576
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-1">
|
|
1577
1577
|
{prop.name}
|
|
1578
1578
|
</h4>
|
|
1579
|
-
<p className="text-sm text-[
|
|
1579
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1580
1580
|
Latest revenue: ${prop.values[prop.values.length - 1].toLocaleString()}
|
|
1581
1581
|
</p>
|
|
1582
1582
|
</div>
|
|
@@ -1592,7 +1592,7 @@ export default function PartnerHubDashboard() {
|
|
|
1592
1592
|
</Modal.Body>
|
|
1593
1593
|
<Modal.Footer>
|
|
1594
1594
|
<Modal.CloseTrigger asChild>
|
|
1595
|
-
<button className="px-6 py-2 bg-[
|
|
1595
|
+
<button className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors">
|
|
1596
1596
|
Close
|
|
1597
1597
|
</button>
|
|
1598
1598
|
</Modal.CloseTrigger>
|
|
@@ -1609,18 +1609,18 @@ export default function PartnerHubDashboard() {
|
|
|
1609
1609
|
<Modal.Dialog className="max-w-4xl">
|
|
1610
1610
|
<Modal.CloseTrigger />
|
|
1611
1611
|
<Modal.Header>
|
|
1612
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1612
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1613
1613
|
Revenue Breakdown
|
|
1614
1614
|
</Modal.Heading>
|
|
1615
1615
|
</Modal.Header>
|
|
1616
1616
|
<Modal.Body className="space-y-4">
|
|
1617
|
-
<div className="bg-gradient-to-br from-[
|
|
1618
|
-
<p className="text-sm text-[
|
|
1619
|
-
<p className="text-4xl font-bold text-[
|
|
1617
|
+
<div className="bg-gradient-to-br from-[var(--color-dash-success)]/10 to-[var(--color-dash-accent)]/10 rounded-xl p-6 mb-4">
|
|
1618
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">Total Revenue</p>
|
|
1619
|
+
<p className="text-4xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1620
1620
|
${myRevenue.toLocaleString()}
|
|
1621
1621
|
</p>
|
|
1622
1622
|
</div>
|
|
1623
|
-
<h3 className="font-semibold text-[
|
|
1623
|
+
<h3 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-3">By Property</h3>
|
|
1624
1624
|
<div className="space-y-3">
|
|
1625
1625
|
{revenueTrendByProperty.properties?.map((prop, idx) => {
|
|
1626
1626
|
const totalRevenue = prop.values.reduce((sum, val) => sum + val, 0);
|
|
@@ -1628,7 +1628,7 @@ export default function PartnerHubDashboard() {
|
|
|
1628
1628
|
return (
|
|
1629
1629
|
<div
|
|
1630
1630
|
key={idx}
|
|
1631
|
-
className="bg-[
|
|
1631
|
+
className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-5 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30"
|
|
1632
1632
|
>
|
|
1633
1633
|
<div className="flex items-center justify-between mb-3">
|
|
1634
1634
|
<div className="flex items-center gap-3">
|
|
@@ -1636,16 +1636,16 @@ export default function PartnerHubDashboard() {
|
|
|
1636
1636
|
className="inline-block h-3 w-3 rounded-full"
|
|
1637
1637
|
style={{ backgroundColor: prop.color }}
|
|
1638
1638
|
/>
|
|
1639
|
-
<span className="font-semibold text-[
|
|
1639
|
+
<span className="font-semibold text-[var(--color-dash-text)] dark:text-white">
|
|
1640
1640
|
{prop.name}
|
|
1641
1641
|
</span>
|
|
1642
1642
|
</div>
|
|
1643
|
-
<span className="text-lg font-bold text-[
|
|
1643
|
+
<span className="text-lg font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1644
1644
|
${totalRevenue.toLocaleString()}
|
|
1645
1645
|
</span>
|
|
1646
1646
|
</div>
|
|
1647
1647
|
<div className="flex items-center gap-3">
|
|
1648
|
-
<div className="flex-1 bg-[
|
|
1648
|
+
<div className="flex-1 bg-[var(--color-dash-label)]/20 rounded-full h-2">
|
|
1649
1649
|
<div
|
|
1650
1650
|
className="h-2 rounded-full"
|
|
1651
1651
|
style={{
|
|
@@ -1654,7 +1654,7 @@ export default function PartnerHubDashboard() {
|
|
|
1654
1654
|
}}
|
|
1655
1655
|
/>
|
|
1656
1656
|
</div>
|
|
1657
|
-
<span className="text-sm text-[
|
|
1657
|
+
<span className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] w-12 text-right">
|
|
1658
1658
|
{percentage}%
|
|
1659
1659
|
</span>
|
|
1660
1660
|
</div>
|
|
@@ -1666,7 +1666,7 @@ export default function PartnerHubDashboard() {
|
|
|
1666
1666
|
<Modal.Footer>
|
|
1667
1667
|
<button
|
|
1668
1668
|
onClick={() => setIsRevenueModalOpen(false)}
|
|
1669
|
-
className="px-6 py-2 bg-[
|
|
1669
|
+
className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors"
|
|
1670
1670
|
>
|
|
1671
1671
|
Close
|
|
1672
1672
|
</button>
|
|
@@ -1683,17 +1683,17 @@ export default function PartnerHubDashboard() {
|
|
|
1683
1683
|
<Modal.Dialog className="max-w-4xl">
|
|
1684
1684
|
<Modal.CloseTrigger />
|
|
1685
1685
|
<Modal.Header>
|
|
1686
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1686
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1687
1687
|
Reservations
|
|
1688
1688
|
</Modal.Heading>
|
|
1689
1689
|
</Modal.Header>
|
|
1690
1690
|
<Modal.Body>
|
|
1691
|
-
<p className="text-[
|
|
1691
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-4">
|
|
1692
1692
|
{myReservations} total reservations through Engine
|
|
1693
1693
|
</p>
|
|
1694
|
-
<div className="bg-[
|
|
1695
|
-
<ClockIcon className="h-12 w-12 text-[
|
|
1696
|
-
<p className="text-[
|
|
1694
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-8 text-center">
|
|
1695
|
+
<ClockIcon className="h-12 w-12 text-[var(--color-dash-info)] mx-auto mb-3" />
|
|
1696
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1697
1697
|
Detailed reservation data is available in your full property management dashboard
|
|
1698
1698
|
</p>
|
|
1699
1699
|
</div>
|
|
@@ -1701,7 +1701,7 @@ export default function PartnerHubDashboard() {
|
|
|
1701
1701
|
<Modal.Footer>
|
|
1702
1702
|
<button
|
|
1703
1703
|
onClick={() => setIsReservationsModalOpen(false)}
|
|
1704
|
-
className="px-6 py-2 bg-[
|
|
1704
|
+
className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors"
|
|
1705
1705
|
>
|
|
1706
1706
|
Close
|
|
1707
1707
|
</button>
|
|
@@ -1718,12 +1718,12 @@ export default function PartnerHubDashboard() {
|
|
|
1718
1718
|
<Modal.Dialog className="max-w-4xl">
|
|
1719
1719
|
<Modal.CloseTrigger />
|
|
1720
1720
|
<Modal.Header>
|
|
1721
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1721
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1722
1722
|
Items to Review
|
|
1723
1723
|
</Modal.Heading>
|
|
1724
1724
|
</Modal.Header>
|
|
1725
1725
|
<Modal.Body className="space-y-4">
|
|
1726
|
-
<p className="text-[
|
|
1726
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-4">
|
|
1727
1727
|
{myOpenDisputes} {myOpenDisputes === 1 ? 'item needs' : 'items need'} your attention
|
|
1728
1728
|
</p>
|
|
1729
1729
|
{myDisputes.length > 0 ? (
|
|
@@ -1731,33 +1731,33 @@ export default function PartnerHubDashboard() {
|
|
|
1731
1731
|
{myDisputes.map((d) => (
|
|
1732
1732
|
<div
|
|
1733
1733
|
key={d.id}
|
|
1734
|
-
className="bg-[
|
|
1734
|
+
className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-5 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 hover:border-[var(--color-dash-warning)] transition-colors"
|
|
1735
1735
|
>
|
|
1736
1736
|
<div className="flex items-start justify-between gap-3 mb-2">
|
|
1737
|
-
<h4 className="font-semibold text-[
|
|
1737
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white flex-1">
|
|
1738
1738
|
{d.title}
|
|
1739
1739
|
</h4>
|
|
1740
1740
|
<span
|
|
1741
1741
|
className={`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium flex-shrink-0 ${
|
|
1742
1742
|
d.status === "critical"
|
|
1743
|
-
? "bg-[
|
|
1743
|
+
? "bg-[var(--color-dash-danger)]/10 text-[var(--color-dash-danger)] border border-[var(--color-dash-danger)]/30"
|
|
1744
1744
|
: d.status === "warning"
|
|
1745
|
-
? "bg-[
|
|
1746
|
-
: "bg-[
|
|
1745
|
+
? "bg-[var(--color-dash-warning)]/10 text-[var(--color-dash-warning)] border border-[var(--color-dash-warning)]/30"
|
|
1746
|
+
: "bg-[var(--color-dash-info)]/10 text-[var(--color-dash-info)] border border-[var(--color-dash-info)]/30"
|
|
1747
1747
|
}`}
|
|
1748
1748
|
>
|
|
1749
1749
|
{d.badge}
|
|
1750
1750
|
</span>
|
|
1751
1751
|
</div>
|
|
1752
|
-
<p className="text-sm text-[
|
|
1752
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-3">
|
|
1753
1753
|
{d.description}
|
|
1754
1754
|
</p>
|
|
1755
1755
|
<div className="flex items-center justify-between">
|
|
1756
|
-
<span className="text-lg font-bold text-[
|
|
1756
|
+
<span className="text-lg font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1757
1757
|
${d.amount.toLocaleString()}
|
|
1758
1758
|
</span>
|
|
1759
1759
|
{d.agentHandled && (
|
|
1760
|
-
<span className="text-xs text-[
|
|
1760
|
+
<span className="text-xs text-[var(--color-dash-accent)] flex items-center gap-1">
|
|
1761
1761
|
<svg className="h-3 w-3" fill="currentColor" viewBox="0 0 20 20">
|
|
1762
1762
|
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
|
1763
1763
|
</svg>
|
|
@@ -1769,15 +1769,15 @@ export default function PartnerHubDashboard() {
|
|
|
1769
1769
|
))}
|
|
1770
1770
|
</div>
|
|
1771
1771
|
) : (
|
|
1772
|
-
<div className="bg-[
|
|
1773
|
-
<p className="text-[
|
|
1772
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-8 text-center">
|
|
1773
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">No items need attention</p>
|
|
1774
1774
|
</div>
|
|
1775
1775
|
)}
|
|
1776
1776
|
</Modal.Body>
|
|
1777
1777
|
<Modal.Footer>
|
|
1778
1778
|
<button
|
|
1779
1779
|
onClick={() => setIsDisputesModalOpen(false)}
|
|
1780
|
-
className="px-6 py-2 bg-[
|
|
1780
|
+
className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors"
|
|
1781
1781
|
>
|
|
1782
1782
|
Close
|
|
1783
1783
|
</button>
|
|
@@ -1794,7 +1794,7 @@ export default function PartnerHubDashboard() {
|
|
|
1794
1794
|
<Modal.Dialog className="w-[95vw] max-w-4xl max-h-[90vh] overflow-y-auto">
|
|
1795
1795
|
<Modal.CloseTrigger />
|
|
1796
1796
|
<Modal.Header className="p-8 pb-4">
|
|
1797
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1797
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white pr-8">
|
|
1798
1798
|
Penalty Review: {selectedPenalty?.name}
|
|
1799
1799
|
</Modal.Heading>
|
|
1800
1800
|
</Modal.Header>
|
|
@@ -1804,44 +1804,44 @@ export default function PartnerHubDashboard() {
|
|
|
1804
1804
|
{/* Property & Customer Info */}
|
|
1805
1805
|
<div className="grid grid-cols-2 gap-4">
|
|
1806
1806
|
<div>
|
|
1807
|
-
<p className="text-sm text-[
|
|
1808
|
-
<p className="font-semibold text-[
|
|
1807
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1">Property</p>
|
|
1808
|
+
<p className="font-semibold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.property}</p>
|
|
1809
1809
|
</div>
|
|
1810
1810
|
<div>
|
|
1811
|
-
<p className="text-sm text-[
|
|
1812
|
-
<p className="font-semibold text-[
|
|
1811
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-1">Customer</p>
|
|
1812
|
+
<p className="font-semibold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.customer}</p>
|
|
1813
1813
|
</div>
|
|
1814
1814
|
</div>
|
|
1815
1815
|
|
|
1816
1816
|
{/* Booking Details */}
|
|
1817
|
-
<div className="bg-[
|
|
1818
|
-
<h4 className="font-semibold text-[
|
|
1817
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-6">
|
|
1818
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-4">Booking Details</h4>
|
|
1819
1819
|
<div className="grid grid-cols-3 gap-6">
|
|
1820
1820
|
<div>
|
|
1821
|
-
<p className="text-xs text-[
|
|
1822
|
-
<p className="text-xl font-bold text-[
|
|
1821
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Original Block</p>
|
|
1822
|
+
<p className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.originalRoomBlock} rooms</p>
|
|
1823
1823
|
</div>
|
|
1824
1824
|
<div>
|
|
1825
|
-
<p className="text-xs text-[
|
|
1826
|
-
<p className="text-xl font-bold text-[
|
|
1825
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Rooms Used</p>
|
|
1826
|
+
<p className="text-xl font-bold text-[var(--color-dash-success)]">{selectedPenalty.actualRoomsUsed} rooms</p>
|
|
1827
1827
|
</div>
|
|
1828
1828
|
<div>
|
|
1829
|
-
<p className="text-xs text-[
|
|
1830
|
-
<p className="text-xl font-bold text-[
|
|
1829
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Unused</p>
|
|
1830
|
+
<p className="text-xl font-bold text-[var(--color-dash-danger)]">{selectedPenalty.unusedRooms} rooms</p>
|
|
1831
1831
|
</div>
|
|
1832
1832
|
</div>
|
|
1833
|
-
<div className="grid grid-cols-3 gap-6 mt-6 pt-6 border-t border-[
|
|
1833
|
+
<div className="grid grid-cols-3 gap-6 mt-6 pt-6 border-t border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30">
|
|
1834
1834
|
<div>
|
|
1835
|
-
<p className="text-xs text-[
|
|
1836
|
-
<p className="text-xl font-bold text-[
|
|
1835
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Room Rate</p>
|
|
1836
|
+
<p className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white">${selectedPenalty.roomRate}/night</p>
|
|
1837
1837
|
</div>
|
|
1838
1838
|
<div>
|
|
1839
|
-
<p className="text-xs text-[
|
|
1840
|
-
<p className="text-xl font-bold text-[
|
|
1839
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Number of Nights</p>
|
|
1840
|
+
<p className="text-xl font-bold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.numberOfNights}</p>
|
|
1841
1841
|
</div>
|
|
1842
1842
|
<div>
|
|
1843
|
-
<p className="text-xs text-[
|
|
1844
|
-
<p className="text-xl font-bold text-[
|
|
1843
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Rooms Resold</p>
|
|
1844
|
+
<p className="text-xl font-bold text-[var(--color-dash-accent)]">{selectedPenalty.roomsResold} rooms</p>
|
|
1845
1845
|
</div>
|
|
1846
1846
|
</div>
|
|
1847
1847
|
</div>
|
|
@@ -1849,42 +1849,42 @@ export default function PartnerHubDashboard() {
|
|
|
1849
1849
|
{/* Calculation Method & Policy */}
|
|
1850
1850
|
<div className="grid grid-cols-2 gap-6">
|
|
1851
1851
|
<div>
|
|
1852
|
-
<p className="text-sm text-[
|
|
1853
|
-
<p className="text-lg font-semibold text-[
|
|
1852
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">Calculation Method</p>
|
|
1853
|
+
<p className="text-lg font-semibold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.method}</p>
|
|
1854
1854
|
</div>
|
|
1855
1855
|
<div>
|
|
1856
|
-
<p className="text-sm text-[
|
|
1857
|
-
<p className="text-lg font-semibold text-[
|
|
1856
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">Resale Policy</p>
|
|
1857
|
+
<p className="text-lg font-semibold text-[var(--color-dash-text)] dark:text-white">{selectedPenalty.resalePolicy}</p>
|
|
1858
1858
|
</div>
|
|
1859
1859
|
</div>
|
|
1860
1860
|
|
|
1861
1861
|
{/* Financial Details */}
|
|
1862
1862
|
<div>
|
|
1863
|
-
<h4 className="font-semibold text-[
|
|
1863
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-4">Financial Summary</h4>
|
|
1864
1864
|
<div className="grid grid-cols-3 gap-6">
|
|
1865
|
-
<div className="bg-[
|
|
1866
|
-
<p className="text-xs text-[
|
|
1867
|
-
<p className="text-2xl font-bold text-[
|
|
1865
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-lg p-5">
|
|
1866
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Calculated Penalty</p>
|
|
1867
|
+
<p className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">${selectedPenalty.penaltyCalculated.toLocaleString()}</p>
|
|
1868
1868
|
</div>
|
|
1869
|
-
<div className="bg-[
|
|
1870
|
-
<p className="text-xs text-[
|
|
1871
|
-
<p className="text-2xl font-bold text-[
|
|
1869
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-lg p-5">
|
|
1870
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Credit Applied</p>
|
|
1871
|
+
<p className="text-2xl font-bold text-[var(--color-dash-success)]">${selectedPenalty.credit.toLocaleString()}</p>
|
|
1872
1872
|
</div>
|
|
1873
|
-
<div className={`rounded-lg p-5 border ${selectedPenalty.isHero ? 'bg-[
|
|
1874
|
-
<p className="text-xs text-[
|
|
1875
|
-
<p className={`text-2xl font-bold ${selectedPenalty.isHero ? 'text-[
|
|
1873
|
+
<div className={`rounded-lg p-5 border ${selectedPenalty.isHero ? 'bg-[var(--color-dash-warning)]/10 border-[var(--color-dash-warning)]/30' : 'bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 border-transparent'}`}>
|
|
1874
|
+
<p className="text-xs text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2 uppercase tracking-wider">Final Penalty</p>
|
|
1875
|
+
<p className={`text-2xl font-bold ${selectedPenalty.isHero ? 'text-[var(--color-dash-warning)]' : 'text-[var(--color-dash-text)] dark:text-white'}`}>${selectedPenalty.penalty.toLocaleString()}</p>
|
|
1876
1876
|
</div>
|
|
1877
1877
|
</div>
|
|
1878
1878
|
</div>
|
|
1879
1879
|
|
|
1880
1880
|
{/* Issue Description */}
|
|
1881
1881
|
{selectedPenalty.isHero && (
|
|
1882
|
-
<div className="bg-[
|
|
1883
|
-
<p className="font-semibold text-[
|
|
1884
|
-
<ExclamationTriangleIcon className="h-5 w-5 text-[
|
|
1882
|
+
<div className="bg-[var(--color-dash-warning)]/10 border-l-4 border-[var(--color-dash-warning)] rounded-lg p-5">
|
|
1883
|
+
<p className="font-semibold text-[var(--color-dash-text)] dark:text-white mb-3 flex items-center gap-2">
|
|
1884
|
+
<ExclamationTriangleIcon className="h-5 w-5 text-[var(--color-dash-warning)]" />
|
|
1885
1885
|
Why this needs review:
|
|
1886
1886
|
</p>
|
|
1887
|
-
<p className="text-sm text-[
|
|
1887
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] leading-relaxed">
|
|
1888
1888
|
Your contract specifies a {selectedPenalty.resalePolicy.toLowerCase()}. Based on {selectedPenalty.roomsResold} rooms resold at ${selectedPenalty.roomRate}/night for {selectedPenalty.numberOfNights} {selectedPenalty.numberOfNights === 1 ? 'night' : 'nights'},
|
|
1889
1889
|
we'd expect to see a ${(selectedPenalty.roomsResold * selectedPenalty.roomRate * selectedPenalty.numberOfNights * 0.5).toLocaleString()} credit that doesn't appear to be fully applied.
|
|
1890
1890
|
</p>
|
|
@@ -1893,16 +1893,16 @@ export default function PartnerHubDashboard() {
|
|
|
1893
1893
|
|
|
1894
1894
|
{/* Status */}
|
|
1895
1895
|
<div>
|
|
1896
|
-
<p className="text-sm text-[
|
|
1896
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-2">Status</p>
|
|
1897
1897
|
<span
|
|
1898
1898
|
className={`inline-flex items-center rounded-full px-3 py-1 text-sm font-medium ${
|
|
1899
1899
|
selectedPenalty.status === "Approved"
|
|
1900
|
-
? "bg-[
|
|
1900
|
+
? "bg-[var(--color-dash-success)]/10 text-[var(--color-dash-success)] border border-[var(--color-dash-success)]/30"
|
|
1901
1901
|
: selectedPenalty.status === "Reviewed"
|
|
1902
|
-
? "bg-[
|
|
1902
|
+
? "bg-[var(--color-dash-info)]/10 text-[var(--color-dash-info)] border border-[var(--color-dash-info)]/30"
|
|
1903
1903
|
: selectedPenalty.status === "Calculated"
|
|
1904
|
-
? "bg-[
|
|
1905
|
-
: "bg-[
|
|
1904
|
+
? "bg-[var(--color-dash-label)]/10 text-[var(--color-dash-muted)] border border-[var(--color-dash-label)]/30"
|
|
1905
|
+
: "bg-[var(--color-dash-warning)]/10 text-[var(--color-dash-warning)] border border-[var(--color-dash-warning)]/30"
|
|
1906
1906
|
}`}
|
|
1907
1907
|
>
|
|
1908
1908
|
{selectedPenalty.status}
|
|
@@ -1915,7 +1915,7 @@ export default function PartnerHubDashboard() {
|
|
|
1915
1915
|
<div className="flex gap-4 justify-end flex-wrap">
|
|
1916
1916
|
<button
|
|
1917
1917
|
onClick={() => setIsPenaltyModalOpen(false)}
|
|
1918
|
-
className="px-6 py-2.5 bg-transparent hover:bg-[
|
|
1918
|
+
className="px-6 py-2.5 bg-transparent hover:bg-[var(--color-dash-surface)] dark:hover:bg-[var(--color-dash-muted)]/20 text-[var(--color-dash-text)] dark:text-white font-semibold rounded-lg border border-[var(--color-dash-label)]/30 dark:border-[var(--color-dash-muted)]/50 transition-colors"
|
|
1919
1919
|
>
|
|
1920
1920
|
Close
|
|
1921
1921
|
</button>
|
|
@@ -1924,7 +1924,7 @@ export default function PartnerHubDashboard() {
|
|
|
1924
1924
|
toast.success("Dispute has been filed. Support team will follow up.");
|
|
1925
1925
|
setIsPenaltyModalOpen(false);
|
|
1926
1926
|
}}
|
|
1927
|
-
className="px-6 py-2.5 bg-[
|
|
1927
|
+
className="px-6 py-2.5 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors whitespace-nowrap"
|
|
1928
1928
|
>
|
|
1929
1929
|
File Dispute
|
|
1930
1930
|
</button>
|
|
@@ -1942,12 +1942,12 @@ export default function PartnerHubDashboard() {
|
|
|
1942
1942
|
<Modal.Dialog className="max-w-4xl">
|
|
1943
1943
|
<Modal.CloseTrigger />
|
|
1944
1944
|
<Modal.Header>
|
|
1945
|
-
<Modal.Heading className="text-2xl font-bold text-[
|
|
1945
|
+
<Modal.Heading className="text-2xl font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1946
1946
|
Your Invoices
|
|
1947
1947
|
</Modal.Heading>
|
|
1948
1948
|
</Modal.Header>
|
|
1949
1949
|
<Modal.Body className="space-y-4">
|
|
1950
|
-
<p className="text-[
|
|
1950
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mb-4">
|
|
1951
1951
|
{myPendingInvoices} {myPendingInvoices === 1 ? 'invoice' : 'invoices'} ready to pay
|
|
1952
1952
|
</p>
|
|
1953
1953
|
{myInvoices.length > 0 ? (
|
|
@@ -1955,32 +1955,32 @@ export default function PartnerHubDashboard() {
|
|
|
1955
1955
|
{myInvoices.map((inv) => (
|
|
1956
1956
|
<div
|
|
1957
1957
|
key={inv.id}
|
|
1958
|
-
className="bg-[
|
|
1958
|
+
className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-5 border border-[var(--color-dash-label)]/20 dark:border-[var(--color-dash-muted)]/30 hover:border-[var(--color-dash-success)] transition-colors"
|
|
1959
1959
|
>
|
|
1960
1960
|
<div className="flex items-start justify-between gap-3 mb-2">
|
|
1961
1961
|
<div>
|
|
1962
|
-
<h4 className="font-semibold text-[
|
|
1962
|
+
<h4 className="font-semibold text-[var(--color-dash-text)] dark:text-white">
|
|
1963
1963
|
{inv.title}
|
|
1964
1964
|
</h4>
|
|
1965
|
-
<p className="text-sm text-[
|
|
1965
|
+
<p className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)] mt-1">
|
|
1966
1966
|
{inv.description}
|
|
1967
1967
|
</p>
|
|
1968
1968
|
</div>
|
|
1969
1969
|
<span
|
|
1970
1970
|
className={`inline-flex items-center rounded-full px-2 py-1 text-xs font-medium flex-shrink-0 ${
|
|
1971
1971
|
inv.status === "critical"
|
|
1972
|
-
? "bg-[
|
|
1973
|
-
: "bg-[
|
|
1972
|
+
? "bg-[var(--color-dash-danger)]/10 text-[var(--color-dash-danger)] border border-[var(--color-dash-danger)]/30"
|
|
1973
|
+
: "bg-[var(--color-dash-info)]/10 text-[var(--color-dash-info)] border border-[var(--color-dash-info)]/30"
|
|
1974
1974
|
}`}
|
|
1975
1975
|
>
|
|
1976
1976
|
{inv.badge}
|
|
1977
1977
|
</span>
|
|
1978
1978
|
</div>
|
|
1979
1979
|
<div className="flex items-center justify-between mt-3">
|
|
1980
|
-
<span className="text-lg font-bold text-[
|
|
1980
|
+
<span className="text-lg font-bold text-[var(--color-dash-text)] dark:text-white">
|
|
1981
1981
|
${inv.amount.toLocaleString()}
|
|
1982
1982
|
</span>
|
|
1983
|
-
<span className="text-sm text-[
|
|
1983
|
+
<span className="text-sm text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">
|
|
1984
1984
|
Due {inv.due}
|
|
1985
1985
|
</span>
|
|
1986
1986
|
</div>
|
|
@@ -1988,15 +1988,15 @@ export default function PartnerHubDashboard() {
|
|
|
1988
1988
|
))}
|
|
1989
1989
|
</div>
|
|
1990
1990
|
) : (
|
|
1991
|
-
<div className="bg-[
|
|
1992
|
-
<p className="text-[
|
|
1991
|
+
<div className="bg-[var(--color-dash-surface)] dark:bg-[var(--color-dash-muted)]/10 rounded-xl p-8 text-center">
|
|
1992
|
+
<p className="text-[var(--color-dash-muted)] dark:text-[var(--color-dash-label)]">No pending invoices</p>
|
|
1993
1993
|
</div>
|
|
1994
1994
|
)}
|
|
1995
1995
|
</Modal.Body>
|
|
1996
1996
|
<Modal.Footer>
|
|
1997
1997
|
<button
|
|
1998
1998
|
onClick={() => setIsInvoicesModalOpen(false)}
|
|
1999
|
-
className="px-6 py-2 bg-[
|
|
1999
|
+
className="px-6 py-2 bg-[var(--color-dash-text)] dark:bg-white hover:bg-[var(--color-dash-muted)] dark:hover:bg-[var(--color-dash-surface)] text-white dark:text-[var(--color-dash-text)] font-semibold rounded-lg transition-colors"
|
|
2000
2000
|
>
|
|
2001
2001
|
Close
|
|
2002
2002
|
</button>
|