@myrjfa/ui 1.1.1 → 2.0.0

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.
Files changed (155) hide show
  1. package/dist/chat/ChatMain.d.ts +1 -1
  2. package/dist/chat/ChatMain.d.ts.map +1 -1
  3. package/dist/chat/ChatMain.js +3 -3
  4. package/dist/chat/ChatSidebar.d.ts +1 -1
  5. package/dist/chat/ChatSidebar.d.ts.map +1 -1
  6. package/dist/chat/ConversationList.d.ts +1 -1
  7. package/dist/chat/ConversationList.d.ts.map +1 -1
  8. package/dist/chat/ConversationList.js +1 -1
  9. package/dist/chat/ExpensePanel.js +1 -1
  10. package/dist/chat/MessageBubble.d.ts +1 -1
  11. package/dist/chat/MessageBubble.d.ts.map +1 -1
  12. package/dist/chat/MessageInput.js +1 -1
  13. package/dist/chat/MilestonePanel.js +1 -1
  14. package/dist/chat/components/SplitInputs.d.ts +1 -1
  15. package/dist/chat/components/SplitInputs.d.ts.map +1 -1
  16. package/dist/chat/components/SplitTypeSelector.d.ts +1 -1
  17. package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -1
  18. package/dist/chat/dialogs/AddMemberDialog.d.ts +1 -1
  19. package/dist/chat/dialogs/AddMemberDialog.d.ts.map +1 -1
  20. package/dist/chat/dialogs/AddMemberDialog.js +1 -1
  21. package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +1 -1
  22. package/dist/chat/dialogs/GroupInfoDialog.d.ts +1 -1
  23. package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -1
  24. package/dist/chat/dialogs/GroupInfoDialog.js +1 -1
  25. package/dist/chat/dialogs/GroupInfoViewDialog.d.ts +1 -1
  26. package/dist/chat/dialogs/GroupInfoViewDialog.d.ts.map +1 -1
  27. package/dist/chat/dialogs/NewChatDialog.js +2 -2
  28. package/dist/chat/dialogs/NewGroupDialog.js +2 -2
  29. package/dist/chat/dialogs/ParticipantsDialog.d.ts +1 -1
  30. package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -1
  31. package/dist/chat/dialogs/ParticipantsDialog.js +1 -1
  32. package/dist/dashboard/action-buttons.d.ts.map +1 -1
  33. package/dist/dashboard/action-buttons.js +7 -1
  34. package/dist/dashboard/app-sidebar.d.ts.map +1 -1
  35. package/dist/dashboard/app-sidebar.js +9 -4
  36. package/dist/dashboard/card-header.d.ts +1 -1
  37. package/dist/dashboard/card-header.d.ts.map +1 -1
  38. package/dist/dashboard/card-header.js +1 -1
  39. package/dist/dashboard/dashboard-components.js +1 -1
  40. package/dist/dashboard/data-table.d.ts.map +1 -1
  41. package/dist/dashboard/data-table.js +8 -8
  42. package/dist/dashboard/table.js +1 -1
  43. package/dist/header/mobile-nav-item.js +1 -1
  44. package/dist/header/nav-item.js +1 -1
  45. package/dist/index.d.ts +3 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -2
  48. package/dist/main/footer.d.ts +1 -0
  49. package/dist/main/footer.d.ts.map +1 -1
  50. package/dist/main/footer.js +35 -16
  51. package/dist/main/navbar.d.ts +2 -2
  52. package/dist/main/navbar.d.ts.map +1 -1
  53. package/dist/main/navbar.js +24 -18
  54. package/dist/main/paginationBar.d.ts +1 -1
  55. package/dist/main/paginationBar.d.ts.map +1 -1
  56. package/dist/main/paginationBar.js +1 -1
  57. package/dist/main/portfolio/portfolioItem.d.ts +1 -1
  58. package/dist/main/portfolio/portfolioItem.d.ts.map +1 -1
  59. package/dist/main/portfolio/portfolioPopup.d.ts +1 -1
  60. package/dist/main/portfolio/portfolioPopup.d.ts.map +1 -1
  61. package/dist/main/portfolio/portfolioPopup.js +1 -1
  62. package/dist/main/review-page.d.ts +2 -2
  63. package/dist/main/review-page.d.ts.map +1 -1
  64. package/dist/main/review-page.js +10 -50
  65. package/dist/misc/accordion.js +1 -1
  66. package/dist/misc/alert-dialog.js +1 -1
  67. package/dist/misc/alert.js +1 -1
  68. package/dist/misc/alertdialogclaude.js +1 -1
  69. package/dist/misc/avatar.js +1 -1
  70. package/dist/misc/badge.js +1 -1
  71. package/dist/misc/button.d.ts +9 -9
  72. package/dist/misc/button.js +1 -1
  73. package/dist/misc/card.js +1 -1
  74. package/dist/misc/carousel.js +1 -1
  75. package/dist/misc/checkbox.js +1 -1
  76. package/dist/misc/command.js +2 -2
  77. package/dist/misc/datepicker.d.ts.map +1 -1
  78. package/dist/misc/datepicker.js +22 -4
  79. package/dist/misc/dialog.js +1 -1
  80. package/dist/misc/dropdown-menu.js +1 -1
  81. package/dist/misc/faq.d.ts +2 -2
  82. package/dist/misc/faq.d.ts.map +1 -1
  83. package/dist/misc/faq.js +1 -1
  84. package/dist/misc/file-preview.d.ts +1 -1
  85. package/dist/misc/file-preview.d.ts.map +1 -1
  86. package/dist/misc/file-preview.js +1 -1
  87. package/dist/misc/filter.d.ts +1 -1
  88. package/dist/misc/filter.d.ts.map +1 -1
  89. package/dist/misc/filter.js +3 -3
  90. package/dist/misc/filterBar.d.ts +2 -2
  91. package/dist/misc/filterBar.d.ts.map +1 -1
  92. package/dist/misc/filterBar.js +3 -3
  93. package/dist/misc/form.js +1 -1
  94. package/dist/misc/input.js +1 -1
  95. package/dist/misc/label.js +1 -1
  96. package/dist/misc/line-carousel.d.ts +1 -1
  97. package/dist/misc/line-carousel.d.ts.map +1 -1
  98. package/dist/misc/line-carousel.js +1 -1
  99. package/dist/misc/location/leafletMap.d.ts +8 -0
  100. package/dist/misc/location/leafletMap.d.ts.map +1 -0
  101. package/dist/misc/location/leafletMap.js +62 -0
  102. package/dist/misc/location/locationPicker.d.ts +5 -0
  103. package/dist/misc/location/locationPicker.d.ts.map +1 -0
  104. package/dist/misc/location/locationPicker.js +94 -0
  105. package/dist/misc/newsLetter.d.ts +1 -1
  106. package/dist/misc/newsLetter.d.ts.map +1 -1
  107. package/dist/misc/newsLetter.js +2 -2
  108. package/dist/misc/notification.js +2 -2
  109. package/dist/misc/pagination.js +1 -1
  110. package/dist/misc/password-eye.d.ts +2 -1
  111. package/dist/misc/password-eye.d.ts.map +1 -1
  112. package/dist/misc/password-eye.js +2 -1
  113. package/dist/misc/popover.d.ts.map +1 -1
  114. package/dist/misc/popover.js +2 -2
  115. package/dist/misc/progress.js +1 -1
  116. package/dist/misc/rental-tile.d.ts +6 -0
  117. package/dist/misc/rental-tile.d.ts.map +1 -0
  118. package/dist/misc/rental-tile.js +23 -0
  119. package/dist/misc/scroll-area.js +1 -1
  120. package/dist/misc/searchBar.d.ts +1 -1
  121. package/dist/misc/searchBar.d.ts.map +1 -1
  122. package/dist/misc/searchBar.js +1 -1
  123. package/dist/misc/select.d.ts.map +1 -1
  124. package/dist/misc/select.js +4 -4
  125. package/dist/misc/separator.js +1 -1
  126. package/dist/misc/share.d.ts +1 -1
  127. package/dist/misc/share.d.ts.map +1 -1
  128. package/dist/misc/share.js +1 -1
  129. package/dist/misc/sheet.js +1 -1
  130. package/dist/misc/sidebar.js +2 -2
  131. package/dist/misc/skeleton.js +1 -1
  132. package/dist/misc/slider.js +1 -1
  133. package/dist/misc/stateCard.d.ts +2 -2
  134. package/dist/misc/stateCard.d.ts.map +1 -1
  135. package/dist/misc/stateCard.js +2 -2
  136. package/dist/misc/switch.js +1 -1
  137. package/dist/misc/tabs.js +1 -1
  138. package/dist/misc/textarea.js +1 -1
  139. package/dist/misc/tile.d.ts +2 -1
  140. package/dist/misc/tile.d.ts.map +1 -1
  141. package/dist/misc/tile.js +12 -8
  142. package/dist/misc/tooltip.js +1 -1
  143. package/dist/profile/socialLink.d.ts +1 -1
  144. package/dist/profile/socialLink.d.ts.map +1 -1
  145. package/dist/profile/socialLink.js +19 -49
  146. package/package.json +10 -3
  147. package/dist/chat/dialogs/UserProfileDialog.d.ts +0 -10
  148. package/dist/chat/dialogs/UserProfileDialog.d.ts.map +0 -1
  149. package/dist/chat/dialogs/UserProfileDialog.js +0 -100
  150. package/dist/main/portfolio/temp-page.d.ts +0 -2
  151. package/dist/main/portfolio/temp-page.d.ts.map +0 -1
  152. package/dist/main/portfolio/temp-page.js +0 -102
  153. package/dist/misc/image-cropper.d.ts +0 -10
  154. package/dist/misc/image-cropper.d.ts.map +0 -1
  155. package/dist/misc/image-cropper.js +0 -44
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { CheckCircle2, Settings, Users, Fuel, Star, MapPin, Gauge, ChevronDown } from "lucide-react";
4
+ import Image from "next/image";
5
+ import { cn } from "@myrjfa/state";
6
+ import { Card } from "./card";
7
+ import { Button } from "./button";
8
+ export function RentalTile(props) {
9
+ var _a;
10
+ const [selectedPickupIndex, setSelectedPickupIndex] = useState(0);
11
+ const formatPrice = (p) => new Intl.NumberFormat('en-IN', { style: 'currency', currency: props.currency || 'INR', maximumFractionDigits: 0 }).format(p);
12
+ const titleStr = props.brand ? `${props.brand} ${props.model}` : props.title;
13
+ const currentPickup = (_a = props.pickupPoints) === null || _a === void 0 ? void 0 : _a[selectedPickupIndex];
14
+ const totalPrice = props.price || 0;
15
+ return (_jsxs(Card, { className: cn("h-full relative overflow-hidden flex flex-col bg-white border-0 shadow-sm ring-1 ring-slate-200/60 rounded-[24px] transition-all duration-500 hover:shadow-2xl hover:shadow-primary/10 hover:ring-primary/30 hover:-translate-y-1.5 group cursor-pointer", props.clicked && "opacity-60 pointer-events-none"), onClick: props.onClick, children: [_jsxs("div", { className: "absolute top-4 left-4 right-4 flex justify-between items-start z-20 pointer-events-none", children: [_jsx("div", { className: "flex flex-col gap-2", children: props.payAtPickup && (_jsxs("span", { className: "bg-emerald-500/90 text-white text-[10px] font-black uppercase tracking-wider px-3 py-1.5 rounded-full flex items-center gap-1.5 shadow-lg shadow-emerald-500/20 backdrop-blur-md", children: [_jsx(CheckCircle2, { className: "w-3 h-3" }), "Pay at Pickup"] })) }), _jsxs("div", { className: "flex flex-col items-end gap-2 pointer-events-auto", children: [(props.rating && props.rating > 0) ? (_jsxs("span", { className: "bg-white/95 text-slate-900 text-[11px] font-bold px-3 py-1.5 rounded-full shadow-lg flex items-center gap-1.5 border border-slate-100", children: [_jsx(Star, { className: "w-3.5 h-3.5 fill-amber-400 text-amber-400" }), _jsxs("span", { children: [props.rating, " ", _jsxs("span", { className: "font-semibold text-slate-400", children: ["(", props.reviewCount || 0, ")"] })] })] })) : null, (props.completedTrips && props.completedTrips > 0) ? (_jsxs("span", { className: "bg-slate-900/90 text-white text-[10px] font-bold px-3 py-1.5 rounded-full shadow-lg backdrop-blur-md", children: [props.completedTrips, " Trips"] })) : null] })] }), _jsxs("div", { className: "relative w-full aspect-[4/3] overflow-hidden", children: [_jsx("div", { className: "absolute inset-0 bg-slate-900/10 z-10 group-hover:bg-transparent transition-colors duration-500" }), _jsx(Image, { src: props.image || "/placeholder.jpg", alt: props.title, fill: true, sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 25vw", className: "object-cover group-hover:scale-110 transition-transform duration-700 ease-out" }), _jsx("div", { className: "absolute bottom-0 left-0 right-0 h-1/2 bg-gradient-to-t from-white via-white/50 to-transparent z-10" })] }), _jsxs("div", { className: "flex-1 flex flex-col px-6 pb-6 -mt-10 relative z-20", children: [_jsxs("div", { className: "mb-5", children: [_jsx("h3", { className: "text-xl font-extrabold text-slate-900 tracking-tight leading-tight line-clamp-1 mb-1", title: titleStr, children: titleStr }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-[10px] font-black uppercase tracking-widest text-primary bg-primary/10 px-2 py-0.5 rounded", children: props.vehicleType || "Vehicle" }), _jsxs("span", { className: "text-xs font-bold text-slate-400", children: ["Model ", props.date ? new Date(props.date).getFullYear() : '2024'] })] })] }), _jsx("div", { className: "grid grid-cols-3 gap-3 mb-6", children: [
16
+ { icon: _jsx(Settings, { className: "w-4 h-4" }), label: props.transmission || 'Auto' },
17
+ { icon: _jsx(Users, { className: "w-4 h-4" }), label: `${props.seatingCapacity || 2} Seats` },
18
+ { icon: _jsx(Fuel, { className: "w-4 h-4" }), label: props.fuelType || 'Petrol' }
19
+ ].map((spec, i) => (_jsxs("div", { className: "flex flex-col items-center justify-center bg-slate-50 rounded-2xl p-3 border border-slate-100/50 group-hover:bg-white group-hover:border-primary/20 transition-all duration-300", children: [_jsx("div", { className: "text-slate-400 group-hover:text-primary transition-colors mb-1.5", children: spec.icon }), _jsx("span", { className: "text-[10px] font-bold text-slate-600 uppercase tracking-tight text-center", children: spec.label })] }, i))) }), _jsxs("div", { className: "relative mb-6", children: [_jsx("div", { className: "absolute -top-2 left-3 bg-white px-1.5 text-[10px] font-black uppercase tracking-widest text-slate-400 z-10 transition-colors group-hover:text-primary", children: "Available At" }), _jsxs("div", { className: "relative bg-slate-50/50 rounded-2xl border border-slate-100 group-hover:border-primary/20 transition-all", children: [_jsx(MapPin, { className: "absolute left-4 top-1/2 -translate-y-1/2 w-4 h-4 text-primary" }), _jsx("select", { className: "w-full bg-transparent pl-11 pr-4 py-3.5 text-sm font-bold text-slate-700 appearance-none focus:outline-none cursor-pointer", value: selectedPickupIndex, onChange: (e) => {
20
+ e.stopPropagation();
21
+ setSelectedPickupIndex(Number(e.target.value));
22
+ }, onClick: (e) => e.stopPropagation(), children: props.pickupPoints && props.pickupPoints.length > 0 ? (props.pickupPoints.map((point, idx) => (_jsx("option", { value: idx, children: point.name }, idx)))) : (_jsx("option", { children: props.location || "Location Not Set" })) }), _jsx("div", { className: "absolute right-4 top-1/2 -translate-y-1/2 pointer-events-none text-slate-400", children: _jsx(ChevronDown, { className: "w-4 h-4" }) })] })] }), _jsxs("div", { className: "mt-auto flex items-center justify-between gap-4 pt-1 border-t border-slate-100 pt-5", children: [_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-baseline gap-1.5", children: [_jsx("span", { className: "text-3xl font-black text-slate-900 tracking-tighter", children: formatPrice(totalPrice) }), _jsx("span", { className: "text-xs font-bold text-slate-400 uppercase", children: "/day" })] }), _jsxs("div", { className: "flex items-center gap-1.5 mt-1", children: [_jsx(Gauge, { className: "w-3.5 h-3.5 text-primary" }), _jsx("span", { className: "text-[11px] font-bold text-slate-500", children: props.distanceLimit || 'No distance limit' })] })] }), _jsx(Button, { className: "rounded-2xl px-8 h-14 font-black uppercase tracking-widest text-xs shadow-xl shadow-primary/20 hover:shadow-primary/30 transition-all", onClick: props.onClick, children: "Book Now" })] })] })] }));
23
+ }
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  function ScrollArea({ className, children, ...props }) {
6
6
  return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", className: cn("relative", className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", className: "ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] focus-visible:ring-4 focus-visible:outline-1", children: children }), _jsx(ScrollBar, {}), _jsx(ScrollAreaPrimitive.Corner, {})] }));
7
7
  }
@@ -1,6 +1,6 @@
1
1
  interface SearchBarProps {
2
2
  titles: string[];
3
3
  }
4
- export default function SearchBar({ titles }: SearchBarProps): import("react/jsx-runtime").JSX.Element;
4
+ export declare function SearchBar({ titles }: SearchBarProps): import("react/jsx-runtime").JSX.Element;
5
5
  export {};
6
6
  //# sourceMappingURL=searchBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchBar.d.ts","sourceRoot":"","sources":["../../src/misc/searchBar.tsx"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAqID,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CAM3D"}
1
+ {"version":3,"file":"searchBar.d.ts","sourceRoot":"","sources":["../../src/misc/searchBar.tsx"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAqID,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CAMnD"}
@@ -84,6 +84,6 @@ function SearchBarComponent({ titles }) {
84
84
  setTimeout(() => setShowSuggestions(false), 150);
85
85
  }, className: "w-full bg-transparent border-none outline-none py-2 px-3 text-gray-700" }), showSuggestions && suggestions.length > 0 && (_jsx("div", { className: "absolute top-full left-0 w-full mt-1 bg-white rounded-md shadow-lg z-15 max-h-60 overflow-y-auto", children: suggestions.map((suggestion, index) => (_jsx("div", { className: `px-4 py-2 text-sm cursor-pointer ${index === highlightedIndex ? 'bg-muted' : 'text-gray-700 hover:bg-muted'}`, onMouseDown: (e) => e.preventDefault(), onClick: () => handleSuggestionClick(suggestion), children: suggestion }, index))) }))] }), _jsx(Button, { variant: "default", onClick: executeSearch, className: "ml-4 w-10 h-10 rounded-full flex items-center justify-center cursor-pointer", children: _jsx(Search, { size: 18 }) })] }) }));
86
86
  }
87
- export default function SearchBar({ titles }) {
87
+ export function SearchBar({ titles }) {
88
88
  return (_jsx(Suspense, { fallback: _jsx("div", { className: "w-full h-screen flex items-center justify-center", children: "Loading..." }), children: _jsx(SearchBarComponent, { titles: titles }) }));
89
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/misc/select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAKzD,iBAAS,MAAM,CAAC,EACd,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAEnD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,2CAgBtD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,QAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,2CA6BtD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAQpD;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAkBnD;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,2CAQxD;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,cAAc,CAAC,2CAa7D;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,gBAAgB,CAAC,2CAa/D;AAED,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAA"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/misc/select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAKzD,iBAAS,MAAM,CAAC,EACd,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAEnD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAEpD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,2CAgBtD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,QAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,2CA4BtD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAQpD;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAkBnD;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,2CAQxD;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,cAAc,CAAC,2CAa7D;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,gBAAgB,CAAC,2CAa/D;AAED,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as SelectPrimitive from "@radix-ui/react-select";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
6
6
  function Select({ ...props }) {
7
7
  return _jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
@@ -16,9 +16,9 @@ function SelectTrigger({ className, children, ...props }) {
16
16
  return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", className: cn("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex h-9 w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
17
17
  }
18
18
  function SelectContent({ className, children, position = "popper", ...props }) {
19
- return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-[310] max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md pointer-events-auto", position === "popper" &&
20
- "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, onWheel: (e) => e.stopPropagation(), ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
21
- "h-full max-h-[var(--radix-select-content-available-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1 overflow-y-auto touch-pan-y"), children: children }), _jsx(SelectScrollDownButton, {})] }) }));
19
+ return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border shadow-md", position === "popper" &&
20
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" &&
21
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"), children: children }), _jsx(SelectScrollDownButton, {})] }) }));
22
22
  }
23
23
  function SelectLabel({ className, ...props }) {
24
24
  return (_jsx(SelectPrimitive.Label, { "data-slot": "select-label", className: cn("px-2 py-1.5 text-sm font-medium", className), ...props }));
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  function Separator({ className, orientation = "horizontal", decorative = true, ...props }) {
6
6
  return (_jsx(SeparatorPrimitive.Root, { "data-slot": "separator-root", decorative: decorative, orientation: orientation, className: cn("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px", className), ...props }));
7
7
  }
@@ -1,5 +1,5 @@
1
1
  declare const ShareButton: ({ label }: {
2
2
  label?: string;
3
3
  }) => import("react/jsx-runtime").JSX.Element;
4
- export default ShareButton;
4
+ export { ShareButton };
5
5
  //# sourceMappingURL=share.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/misc/share.tsx"],"names":[],"mappings":"AAoBA,QAAA,MAAM,WAAW,GAAI,WAAqB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,4CAoO3D,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/misc/share.tsx"],"names":[],"mappings":"AAoBA,QAAA,MAAM,WAAW,GAAI,WAAqB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,4CAoO3D,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -154,4 +154,4 @@ const ShareButton = ({ label = "Share" }) => {
154
154
  return (_jsx(ShareComponent, { ...platform.props, className: "flex flex-col items-center justify-center", children: _jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-3 rounded-lg hover:bg-gray-50 transition-colors w-full", children: [platform.icon, _jsx("span", { className: "text-xs font-medium text-gray-700", children: platform.name })] }) }, index));
155
155
  }), pageMetadata.image && (_jsx(PinterestShareButton, { url: pageMetadata.url, media: pageMetadata.image, description: pageMetadata.description, className: "flex flex-col items-center justify-center", children: _jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-3 rounded-lg hover:bg-gray-50 transition-colors w-full", children: [_jsx(FaPinterest, { className: "w-6 h-6 text-red-600" }), _jsx("span", { className: "text-xs font-medium text-gray-700", children: "Pinterest" })] }) }))] })] }) }) })] }));
156
156
  };
157
- export default ShareButton;
157
+ export { ShareButton };
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as SheetPrimitive from "@radix-ui/react-dialog";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  import { XIcon } from "lucide-react";
6
6
  function Sheet({ ...props }) {
7
7
  return _jsx(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Slot } from "@radix-ui/react-slot";
4
- import { useIsMobile } from "@myrjfa/state/dist/lib/hooks/use-mobile";
5
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { useIsMobile } from "@myrjfa/state";
5
+ import { cn } from "@myrjfa/state";
6
6
  import { cva } from "class-variance-authority";
7
7
  import { PanelLeftIcon } from "lucide-react";
8
8
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "@myrjfa/state/dist/lib/utils";
2
+ import { cn } from "@myrjfa/state";
3
3
  function Skeleton({ className, ...props }) {
4
4
  return (_jsx("div", { "data-slot": "skeleton", className: cn("bg-primary/10 animate-pulse rounded-md", className), ...props }));
5
5
  }
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import * as SliderPrimitive from "@radix-ui/react-slider";
5
- import { cn } from "@myrjfa/state/dist/lib/utils";
5
+ import { cn } from "@myrjfa/state";
6
6
  const Slider = React.forwardRef(({ className, ...props }, ref) => {
7
7
  var _a;
8
8
  return (_jsxs(SliderPrimitive.Root, { ref: ref, className: cn("relative flex w-full touch-none select-none items-center", className), ...props, children: [_jsx(SliderPrimitive.Track, { className: "relative h-2 w-full grow overflow-hidden rounded-full bg-secondary", children: _jsx(SliderPrimitive.Range, { className: "absolute h-full bg-primary" }) }), (_a = (props.value || props.defaultValue || [0])) === null || _a === void 0 ? void 0 : _a.map((_, index) => (_jsx(SliderPrimitive.Thumb, { className: "block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" }, index)))] }));
@@ -1,5 +1,5 @@
1
- import { CardType } from '@myrjfa/state/dist/lib/models/props';
2
- export default function StateCard({ state, index, className }: {
1
+ import { CardType } from '@myrjfa/state';
2
+ export declare function StateCard({ state, index, className }: {
3
3
  state: CardType;
4
4
  index: number;
5
5
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"stateCard.d.ts","sourceRoot":"","sources":["../../src/misc/stateCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAA;AAQ9D,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAsCpH"}
1
+ {"version":3,"file":"stateCard.d.ts","sourceRoot":"","sources":["../../src/misc/stateCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAQxC,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAsC5G"}
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { cn } from '@myrjfa/state/dist/lib/utils';
3
+ import { cn } from '@myrjfa/state';
4
4
  import { Loader2 } from 'lucide-react';
5
5
  import Image from 'next/image';
6
6
  import { useRouter } from 'next/navigation';
7
7
  import { useState } from 'react';
8
8
  import { Card, CardContent } from './card';
9
- export default function StateCard({ state, index, className }) {
9
+ export function StateCard({ state, index, className }) {
10
10
  var _a;
11
11
  const [clicked, setClicked] = useState(false);
12
12
  const router = useRouter();
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import * as SwitchPrimitives from "@radix-ui/react-switch";
5
- import { cn } from "@myrjfa/state/dist/lib/utils";
5
+ import { cn } from "@myrjfa/state";
6
6
  const Switch = React.forwardRef(({ className, ...props }, ref) => (_jsx(SwitchPrimitives.Root, { className: cn("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input", className), ...props, ref: ref, children: _jsx(SwitchPrimitives.Thumb, { className: cn("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0") }) })));
7
7
  Switch.displayName = SwitchPrimitives.Root.displayName;
8
8
  export { Switch };
package/dist/misc/tabs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as TabsPrimitive from "@radix-ui/react-tabs";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  function Tabs({ className, ...props }) {
6
6
  return (_jsx(TabsPrimitive.Root, { "data-slot": "tabs", className: cn("flex flex-col gap-2", className), ...props }));
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "@myrjfa/state/dist/lib/utils";
2
+ import { cn } from "@myrjfa/state";
3
3
  function Textarea({ className, ...props }) {
4
4
  return (_jsx("textarea", { "data-slot": "textarea", className: cn("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className), ...props }));
5
5
  }
@@ -1,3 +1,4 @@
1
- import { TileProps } from "@myrjfa/state/dist/lib/models/tile";
1
+ import { TileProps } from "@myrjfa/state";
2
+ export type { TileProps };
2
3
  export declare function Tile({ slug, image, title, description, location, rating, skills, tileType, className, date, host, duration, price, currency, includeHost, }: TileProps): import("react/jsx-runtime").JSX.Element;
3
4
  //# sourceMappingURL=tile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tile.d.ts","sourceRoot":"","sources":["../../src/misc/tile.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAgB/D,wBAAgB,IAAI,CAAC,EACjB,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,MAAW,EACX,QAA0B,EAC1B,SAAS,EACT,IAAI,EACJ,IAAgB,EAChB,QAAY,EACZ,KAAW,EACX,QAAgB,EAChB,WAAkB,GACrB,EAAE,SAAS,2CA4KX"}
1
+ {"version":3,"file":"tile.d.ts","sourceRoot":"","sources":["../../src/misc/tile.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,YAAY,EAAE,SAAS,EAAE,CAAC;AAgB1B,wBAAgB,IAAI,CAAC,EACjB,IAAI,EACJ,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,MAAW,EACX,QAA0B,EAC1B,SAAS,EACT,IAAI,EACJ,IAAgB,EAChB,QAAY,EACZ,KAAW,EACX,QAAgB,EAChB,WAAkB,GACrB,EAAE,SAAS,2CAkLX"}
package/dist/misc/tile.js CHANGED
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { toggleUserWishlist } from "@myrjfa/state/dist/lib/actions";
4
- import { userAtom, userLoadingAtom } from "@myrjfa/state/dist/lib/userAtom";
5
- import { cn, formatDate, truncateText } from "@myrjfa/state/dist/lib/utils";
3
+ import { toggleUserWishlist } from "@myrjfa/state";
4
+ import { userAtom, userLoadingAtom } from "@myrjfa/state";
5
+ import { cn, formatDate, truncateText } from "@myrjfa/state";
6
6
  import { useAtom, useAtomValue } from "jotai";
7
7
  import { Clock, Heart, Loader2, MapPin, Star } from "lucide-react";
8
8
  import Image from "next/image";
@@ -12,6 +12,7 @@ import { showAlert } from "./alertdialogclaude";
12
12
  import { Badge } from "./badge";
13
13
  import { Button } from "./button";
14
14
  import { Card, CardContent } from "./card";
15
+ import { RentalTile } from "./rental-tile";
15
16
  function WishlistButton({ wishlisted, handleWishlisted }) {
16
17
  return _jsx(Button, { variant: "ghost", className: "absolute top-3 right-3 z-10 bg-white/70 hover:bg-white rounded-full transition", onClick: handleWishlisted, children: _jsx(Heart, { className: wishlisted ? "text-red-500 fill-red-500 drop-shadow" : "text-gray-400 fill-gray-400", size: 20 }) });
17
18
  }
@@ -30,7 +31,7 @@ export function Tile({ slug, image, title, description, location, rating, skills
30
31
  if (tileType == "opportunities") {
31
32
  setWishlisted((_b = (_a = user.wishlist) === null || _a === void 0 ? void 0 : _a.includes(slug)) !== null && _b !== void 0 ? _b : false);
32
33
  }
33
- else if (tileType == "packages") {
34
+ else if (tileType == "packages" || tileType == "rentals" || tileType == "adventures" || tileType == "guides") {
34
35
  setWishlisted((_d = (_c = user.favPackages) === null || _c === void 0 ? void 0 : _c.includes(slug)) !== null && _d !== void 0 ? _d : false);
35
36
  }
36
37
  }, [slug, loading, user]);
@@ -44,7 +45,7 @@ export function Tile({ slug, image, title, description, location, rating, skills
44
45
  if (tileType == "opportunities") {
45
46
  setUser((prev) => prev ? { ...prev, wishlist: response.wishlist } : prev);
46
47
  }
47
- else if (tileType == "packages") {
48
+ else if (tileType == "packages" || tileType == "rentals" || tileType == "adventures" || tileType == "guides") {
48
49
  setUser((prev) => prev ? { ...prev, favPackages: response.wishlist } : prev);
49
50
  }
50
51
  };
@@ -61,16 +62,19 @@ export function Tile({ slug, image, title, description, location, rating, skills
61
62
  maximumFractionDigits: 0
62
63
  }).format(price);
63
64
  };
65
+ if (tileType === "rentals") {
66
+ return _jsx(RentalTile, { ...arguments[0], onClick: handleTileClick, clicked: clicked });
67
+ }
64
68
  return (_jsxs(Card, { className: cn("h-full shadow-lg py-0 gap-0 group transition-shadow hover:shadow-2xl border border-gray-100 rounded-2xl overflow-hidden cursor-pointer relative bg-white", className, clicked && "opacity-60 pointer-events-none" // visual cue + blocking
65
69
  ), onClick: handleTileClick, children: [clicked && (_jsx("div", { className: "absolute inset-0 z-20 flex items-center justify-center bg-white/70 rounded-lg", children: _jsx(Loader2, { className: "animate-spin text-gray-600", size: 24 }) })), _jsxs("div", { className: "relative h-55 w-full p-0 overflow-hidden", children: [_jsx(Image, { src: image, alt: title, fill: true, priority: true, sizes: "(max-width: 768px) 100vw, 400px", className: "object-cover transition-transform duration-300 group-hover:scale-105", style: {
66
70
  WebkitMaskImage: "linear-gradient(to bottom, rgba(0,0,0,1) 90%, rgba(255, 255, 255, 0) 100%)",
67
71
  WebkitMaskRepeat: "no-repeat",
68
72
  WebkitMaskSize: "100% 100%",
69
- }, onError: (e) => console.error(e.target) }), _jsx("div", { className: "absolute bottom-0 left-0 right-0 h-5 pointer-events-none bg-gradient-to-b from-transparent to-white" }), user && user.role == "user" && tileType !== "blogs" && (_jsx(WishlistButton, { wishlisted: wishlisted, handleWishlisted: handleWishlisted })), tileType == "packages" && (_jsx("div", { className: "absolute top-4 left-4 bg-white/80 backdrop-blur px-3 py-1 rounded-full shadow text-gray-900 font-semibold text-base", children: formatPrice(price, currency) }))] }), _jsxs(CardContent, { className: "p-4 pt-0 flex flex-col gap-3 z-10", children: [tileType !== "blogs" && (_jsxs("div", { className: "flex justify-between text-sm text-muted-foreground", children: [location && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(MapPin, { size: 15 }), " ", truncateText(location, 30)] })), (rating && rating > 0) ? _jsxs("div", { className: "flex items-center gap-1 bg-green-50 px-2 py-1 rounded-full", children: [_jsx(Star, { className: "w-4 h-4 text-amber-400 fill-current" }), _jsx("span", { className: " font-semibold", children: rating })] })
70
- : null] })), _jsx("h4", { className: "text-lg font-semibold truncate-text", children: truncateText(title, 30) }), tileType !== "packages" &&
73
+ }, onError: (e) => console.error(e.target) }), _jsx("div", { className: "absolute bottom-0 left-0 right-0 h-5 pointer-events-none bg-gradient-to-b from-transparent to-white" }), user && user.role == "user" && tileType !== "blogs" && (_jsx(WishlistButton, { wishlisted: wishlisted, handleWishlisted: handleWishlisted })), (tileType == "packages" || tileType == "adventures" || tileType == "guides") && (_jsx("div", { className: "absolute top-4 left-4 bg-white/80 backdrop-blur px-3 py-1 rounded-full shadow text-gray-900 font-semibold text-base", children: formatPrice(price, currency) }))] }), _jsxs(CardContent, { className: "p-4 pt-0 flex flex-col gap-3 z-10", children: [tileType !== "blogs" && (_jsxs("div", { className: "flex justify-between text-sm text-muted-foreground", children: [location && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(MapPin, { size: 15 }), " ", truncateText(location, 30)] })), (rating && rating > 0) ? _jsxs("div", { className: "flex items-center gap-1 bg-green-50 px-2 py-1 rounded-full", children: [_jsx(Star, { className: "w-4 h-4 text-amber-400 fill-current" }), _jsx("span", { className: " font-semibold", children: rating })] })
74
+ : null] })), _jsx("h4", { className: "text-lg font-semibold truncate-text", children: truncateText(title, 30) }), (tileType !== "packages" && tileType !== "adventures" && tileType !== "guides") &&
71
75
  _jsx("p", { className: "text-sm text-muted-foreground truncate-text-3", children: description }), tileType == "opportunities" && skills.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2 mt-2 truncate-text", children: skills.slice(0, 3).map((skill, index) => (_jsx(Badge, { variant: "secondary", children: truncateText(skill, 10) }, index))) })), tileType == "blogs" && (includeHost ?
72
76
  _jsxs("div", { className: "flex items-center gap-3 pt-3 border-t min-h-12 max-h-15", children: [_jsx(Image, { src: (_a = host === null || host === void 0 ? void 0 : host.image) !== null && _a !== void 0 ? _a : "/images/profile_placeholder.webp", alt: "Host Image", width: 40, height: 40, className: "rounded-full object-cover" }), _jsxs("div", { className: "flex-1", children: [_jsxs("p", { className: "font-medium", children: ["By ", truncateText((_b = host === null || host === void 0 ? void 0 : host.name) !== null && _b !== void 0 ? _b : "Host", 18)] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["on ", formatDate(date)] })] })] }) :
73
- _jsxs("div", { className: "flex justify-between items-center text-xs text-gray-500", children: [_jsx("span", { children: formatDate(date) }), _jsxs("span", { children: [rating, " likes"] })] })), tileType == "packages" && (_jsxs("div", { className: "flex items-center justify-between pt-3 border-t border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-1 text-gray-600 whitespace-nowrap", children: [_jsx(Clock, { className: "w-4 h-4 mr-1" }), _jsxs("span", { className: "text-sm", children: [duration, " Days"] })] }), includeHost ?
77
+ _jsxs("div", { className: "flex justify-between items-center text-xs text-gray-500", children: [_jsx("span", { children: formatDate(date) }), _jsxs("span", { children: [rating, " likes"] })] })), (tileType == "packages" || tileType == "adventures" || tileType == "guides") && (_jsxs("div", { className: "flex items-center justify-between pt-3 border-t border-gray-100", children: [(tileType !== "guides") && (_jsxs("div", { className: "flex items-center gap-1 text-gray-600 whitespace-nowrap", children: [_jsx(Clock, { className: "w-4 h-4 mr-1" }), _jsxs("span", { className: "text-sm", children: [duration, " ", tileType == "adventures" ? "hrs" : "Days"] })] })), includeHost ?
74
78
  _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Image, { src: (_c = host === null || host === void 0 ? void 0 : host.image) !== null && _c !== void 0 ? _c : "/images/profile_placeholder.webp", alt: (_d = host === null || host === void 0 ? void 0 : host.name) !== null && _d !== void 0 ? _d : "DP", width: 25, height: 25, className: "rounded-full" }), _jsx("span", { className: "text-sm text-gray-500 max-w-40", children: host === null || host === void 0 ? void 0 : host.name })] }) :
75
79
  _jsx("div", { className: "flex justify-between items-center text-xs text-gray-500", children: _jsx("span", { children: formatDate(date) }) })] }))] })] }));
76
80
  }
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
4
- import { cn } from "@myrjfa/state/dist/lib/utils";
4
+ import { cn } from "@myrjfa/state";
5
5
  function TooltipProvider({ delayDuration = 0, ...props }) {
6
6
  return (_jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delayDuration: delayDuration, ...props }));
7
7
  }
@@ -1,4 +1,4 @@
1
- import { SocialPlatformType } from "@myrjfa/state/dist/lib/utils/socialMediaUrl";
1
+ export type SocialPlatformType = "instagram" | "youtube" | "linkedin" | "googleBusiness";
2
2
  interface SocialLinkFieldProps {
3
3
  platform: SocialPlatformType;
4
4
  url?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"socialLink.d.ts","sourceRoot":"","sources":["../../src/profile/socialLink.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAsB,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAGrG,UAAU,oBAAoB;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAeD,wBAAgB,eAAe,CAAC,EAC5B,QAAQ,EACR,GAAG,EACH,aAAa,EACb,oBAAoB,GACvB,EAAE,oBAAoB,kDAgFtB"}
1
+ {"version":3,"file":"socialLink.d.ts","sourceRoot":"","sources":["../../src/profile/socialLink.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEzF,UAAU,oBAAoB;IAC1B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAYD,wBAAgB,eAAe,CAAC,EAC5B,QAAQ,EACR,GAAG,EACH,aAAa,EACb,oBAAoB,GACvB,EAAE,oBAAoB,kDA8CtB"}
@@ -3,60 +3,30 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { Input } from "../misc/input";
5
5
  import { Button } from "../misc/button";
6
- import { GithubIcon, InstagramIcon, StoreIcon, YoutubeIcon } from "lucide-react";
7
- import { normalizeSocialUrl } from "@myrjfa/state/dist/lib/utils/socialMediaUrl";
8
- import { FacebookIcon, LinkedinIcon, TwitterIcon } from "react-share";
6
+ import { InstagramIcon, YoutubeIcon, LinkedinIcon, StoreIcon } from "lucide-react";
7
+ import { useRouter } from "next/navigation";
9
8
  const platformConfig = {
10
- instagram: { label: "Instagram", icon: InstagramIcon, color: "hover:text-pink-600", hint: "Enter username or profile URL" },
11
- youtube: { label: "YouTube", icon: YoutubeIcon, color: "hover:text-red-600", hint: "Enter @handle or profile URL" },
12
- twitter: { label: "Twitter", icon: TwitterIcon, color: "hover:text-blue-600", hint: "Enter @handle or profile URL" },
13
- facebook: { label: "Facebook", icon: FacebookIcon, color: "hover:text-blue-600", hint: "Enter @handle or profile URL" },
14
- github: { label: "GitHub", icon: GithubIcon, color: "hover:text-blue-600", hint: "Enter @handle or profile URL" },
15
- linkedin: { label: "LinkedIn", icon: LinkedinIcon, color: "hover:text-blue-600", hint: "Enter username or profile URL" },
16
- googleBusiness: { label: "Google Business", icon: StoreIcon, color: "hover:text-green-600", hint: "Enter full Google Business URL" },
9
+ instagram: { label: "Instagram", icon: InstagramIcon, color: "hover:text-pink-600" },
10
+ youtube: { label: "YouTube", icon: YoutubeIcon, color: "hover:text-red-600" },
11
+ linkedin: { label: "LinkedIn", icon: LinkedinIcon, color: "hover:text-blue-600" },
12
+ googleBusiness: { label: "Google Business", icon: StoreIcon, color: "hover:text-green-600" },
17
13
  };
18
14
  export function SocialLinkField({ platform, url, isCurrentUser, updateUserSocialLink, }) {
19
- const [input, setInput] = useState(url !== null && url !== void 0 ? url : "");
20
- const [urlError, setUrlError] = useState(null);
15
+ const [input, setInput] = useState(url);
21
16
  const [loading, setLoading] = useState(false);
22
- const { label, icon: Icon, color, hint } = platformConfig[platform];
23
- // #13: Validate and normalize the URL when focus leaves the input
24
- const handleBlur = () => {
25
- if (!input.trim() || platform === "googleBusiness")
26
- return;
27
- const { url: normalized, error } = normalizeSocialUrl(platform, input);
28
- setUrlError(error);
29
- if (!error)
30
- setInput(normalized); // auto-correct the field to canonical URL
31
- };
32
- const handleSave = async () => {
33
- if (!input.trim() || !updateUserSocialLink)
34
- return;
35
- // Final normalization before saving
36
- let finalUrl = input;
37
- if (platform !== "googleBusiness") {
38
- const { url: normalized, error } = normalizeSocialUrl(platform, input);
39
- if (error) {
40
- setUrlError(error);
41
- return;
42
- }
43
- finalUrl = normalized;
44
- setInput(normalized);
45
- }
46
- try {
47
- setLoading(true);
48
- await updateUserSocialLink(platform, finalUrl);
49
- setUrlError(null);
50
- }
51
- finally {
52
- setLoading(false);
53
- }
54
- };
17
+ const router = useRouter();
18
+ const { label, icon: Icon, color } = platformConfig[platform];
55
19
  if (isCurrentUser) {
56
- return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Icon, { className: `h-5 w-5 shrink-0 text-gray-400 ${color}` }), _jsx(Input, { type: "text", placeholder: hint, value: input, onChange: (e) => {
57
- setInput(e.target.value);
58
- setUrlError(null);
59
- }, onBlur: handleBlur, className: urlError ? "border-red-400 focus:ring-red-400" : "" }), _jsx(Button, { disabled: loading || !input.trim(), onClick: handleSave, children: loading ? "Adding..." : "Add" })] }), urlError && (_jsx("p", { className: "text-xs text-red-500 ml-6", children: urlError }))] }));
20
+ return (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Input, { type: "url", placeholder: `${label} profile url`, value: input, onChange: (e) => setInput(e.target.value) }), updateUserSocialLink &&
21
+ _jsx(Button, { disabled: loading || !input, onClick: async () => {
22
+ try {
23
+ setLoading(true);
24
+ await updateUserSocialLink(platform, input);
25
+ }
26
+ finally {
27
+ setLoading(false);
28
+ }
29
+ }, children: "Add" })] }));
60
30
  }
61
31
  else if (url) {
62
32
  return (_jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: `text-gray-500 ${color} flex flex-row gap-1`, children: _jsx(Icon, { className: "h-5 w-5" }) }));
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@myrjfa/ui",
3
- "version": "1.1.1",
3
+ "version": "2.0.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./dist/index.js",
7
+ "./*": "./*.js"
8
+ },
4
9
  "description": "Shared UI components for my apps",
5
10
  "main": "dist/index.js",
6
11
  "types": "dist/index.d.ts",
@@ -36,10 +41,11 @@
36
41
  "cmdk": "1.1.1",
37
42
  "embla-carousel-react": "^8.5.2",
38
43
  "emoji-picker-react": "^4.18.0",
44
+ "leaflet": "1.9.4",
39
45
  "pnpm": "^10.14.0",
40
- "react-easy-crop": "^5.5.6",
41
46
  "react-hook-form": "^7.54.2",
42
47
  "react-icons": "^5.5.0",
48
+ "react-leaflet": "^5.0.0",
43
49
  "react-share": "^5.2.2"
44
50
  },
45
51
  "peerDependencies": {
@@ -53,7 +59,8 @@
53
59
  "zod": "*"
54
60
  },
55
61
  "devDependencies": {
56
- "@myrjfa/state": "1.1.1",
62
+ "@myrjfa/state": "2.0.0",
63
+ "@types/leaflet": "1.9.21",
57
64
  "@types/react": "19.0.10",
58
65
  "@types/react-dom": "^19.0.4",
59
66
  "date-fns": "^3.0.0",
@@ -1,10 +0,0 @@
1
- interface UserProfileDialogProps {
2
- userId: string;
3
- userName: string;
4
- userImage?: string;
5
- open: boolean;
6
- onClose: () => void;
7
- }
8
- export declare function UserProfileDialog({ userId, userName, userImage, open, onClose }: UserProfileDialogProps): import("react/jsx-runtime").JSX.Element;
9
- export {};
10
- //# sourceMappingURL=UserProfileDialog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UserProfileDialog.d.ts","sourceRoot":"","sources":["../../../src/chat/dialogs/UserProfileDialog.tsx"],"names":[],"mappings":"AASA,UAAU,sBAAsB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,sBAAsB,2CAkFvG"}
@@ -1,100 +0,0 @@
1
- "use client";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
39
- import { useState, useEffect } from "react";
40
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../misc/dialog";
41
- import { Button } from "../../misc/button";
42
- import { Avatar, AvatarFallback, AvatarImage } from "../../misc/avatar";
43
- import { Ban, Shield } from "lucide-react";
44
- import { userApi } from "@myrjfa/state/dist/lib/actions/user";
45
- export function UserProfileDialog(_a) {
46
- var _this = this;
47
- var userId = _a.userId, userName = _a.userName, userImage = _a.userImage, open = _a.open, onClose = _a.onClose;
48
- var _b = useState(false), isBlocked = _b[0], setIsBlocked = _b[1];
49
- var _c = useState(false), loading = _c[0], setLoading = _c[1];
50
- useEffect(function () {
51
- if (open && userId) {
52
- checkBlockStatus();
53
- }
54
- }, [open, userId]);
55
- var checkBlockStatus = function () { return __awaiter(_this, void 0, void 0, function () {
56
- var blocked;
57
- return __generator(this, function (_a) {
58
- switch (_a.label) {
59
- case 0: return [4 /*yield*/, userApi.checkIfBlocked(userId)];
60
- case 1:
61
- blocked = _a.sent();
62
- setIsBlocked(blocked);
63
- return [2 /*return*/];
64
- }
65
- });
66
- }); };
67
- var handleBlockToggle = function () { return __awaiter(_this, void 0, void 0, function () {
68
- var error_1;
69
- return __generator(this, function (_a) {
70
- switch (_a.label) {
71
- case 0:
72
- setLoading(true);
73
- _a.label = 1;
74
- case 1:
75
- _a.trys.push([1, 6, 7, 8]);
76
- if (!isBlocked) return [3 /*break*/, 3];
77
- return [4 /*yield*/, userApi.unblockUser(userId)];
78
- case 2:
79
- _a.sent();
80
- setIsBlocked(false);
81
- return [3 /*break*/, 5];
82
- case 3: return [4 /*yield*/, userApi.blockUser(userId)];
83
- case 4:
84
- _a.sent();
85
- setIsBlocked(true);
86
- _a.label = 5;
87
- case 5: return [3 /*break*/, 8];
88
- case 6:
89
- error_1 = _a.sent();
90
- console.error("Failed to toggle block:", error_1);
91
- return [3 /*break*/, 8];
92
- case 7:
93
- setLoading(false);
94
- return [7 /*endfinally*/];
95
- case 8: return [2 /*return*/];
96
- }
97
- });
98
- }); };
99
- return (_jsx(Dialog, { open: open, onOpenChange: onClose, children: _jsxs(DialogContent, { className: "sm:max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: "User Profile" }) }), _jsxs("div", { className: "flex flex-col items-center space-y-4 py-4", children: [_jsxs(Avatar, { className: "h-24 w-24", children: [_jsx(AvatarImage, { src: userImage }), _jsx(AvatarFallback, { className: "text-2xl", children: userName.charAt(0).toUpperCase() })] }), _jsxs("div", { className: "text-center", children: [_jsx("h3", { className: "text-lg font-semibold", children: userName }), _jsxs("p", { className: "text-sm text-gray-500", children: ["@", userId] })] }), _jsx(Button, { onClick: handleBlockToggle, disabled: loading, variant: isBlocked ? "outline" : "destructive", className: "w-full", children: loading ? ("Processing...") : isBlocked ? (_jsxs(_Fragment, { children: [_jsx(Shield, { className: "w-4 h-4 mr-2" }), "Unblock User"] })) : (_jsxs(_Fragment, { children: [_jsx(Ban, { className: "w-4 h-4 mr-2" }), "Block User"] })) }), isBlocked && (_jsx("p", { className: "text-xs text-gray-500 text-center", children: "You have blocked this user. They cannot start chats with you." }))] })] }) }));
100
- }
@@ -1,2 +0,0 @@
1
- export default function PortfolioPage(): import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=temp-page.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"temp-page.d.ts","sourceRoot":"","sources":["../../../src/main/portfolio/temp-page.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAmKpC"}