Skip to content

Commit 9696573

Browse files
committed
2 parents 608914d + 5a5b148 commit 9696573

File tree

16 files changed

+542
-297
lines changed

16 files changed

+542
-297
lines changed

.eslintcache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"D:\\@linkcord\\linkcord\\next.config.js":"1"},{"size":161,"mtime":1754310908552,"results":"2","hashOfConfig":"3"},{"filePath":"4","messages":"5","suppressedMessages":"6","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"8pmxxm","D:\\@linkcord\\linkcord\\next.config.js",[],[]]
1+
[{"D:\\@linkcord\\linkcord\\next.config.js":"1","D:\\@lynkr\\lynkr.link\\hooks\\useAnalytics.js":"2","D:\\@lynkr\\lynkr.link\\hooks\\useDeviceAnalytics.js":"3","D:\\@lynkr\\lynkr.link\\hooks\\useLocationAnalytics.js":"4","D:\\@lynkr\\lynkr.link\\hooks\\useSections.js":"5","D:\\@lynkr\\lynkr.link\\lib\\db-edge.js":"6","D:\\@lynkr\\lynkr.link\\middleware.js":"7","D:\\@lynkr\\lynkr.link\\pages\\_document.js":"8","D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\clicks\\[id].js":"9","D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\device.js":"10","D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\index.js":"11","D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\location.js":"12","D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\record.js":"13","D:\\@lynkr\\lynkr.link\\pages\\api\\auth\\[...nextauth].js":"14","D:\\@lynkr\\lynkr.link\\pages\\api\\internal\\user.js":"15","D:\\@lynkr\\lynkr.link\\pages\\api\\links\\[linkId].js":"16","D:\\@lynkr\\lynkr.link\\pages\\api\\links\\index.js":"17","D:\\@lynkr\\lynkr.link\\pages\\api\\links\\reorder.js":"18","D:\\@lynkr\\lynkr.link\\pages\\api\\sections\\reorder.js":"19","D:\\@lynkr\\lynkr.link\\pages\\api\\user\\update-og-styles.js":"20","D:\\@lynkr\\lynkr.link\\pages\\api\\version.js":"21","D:\\@lynkr\\lynkr.link\\tailwind.config.js":"22","D:\\@lynkr\\lynkr.link\\utils\\geo-service.js":"23","D:\\@lynkr\\lynkr.link\\utils\\helpers.js":"24","D:\\@lynkr\\lynkr.link\\utils\\themes.js":"25"},{"size":161,"mtime":1754310908552,"results":"26","hashOfConfig":"27"},{"size":651,"mtime":1754548497003,"results":"28","hashOfConfig":"29"},{"size":653,"mtime":1754548497016,"results":"30","hashOfConfig":"29"},{"size":665,"mtime":1754548497034,"results":"31","hashOfConfig":"29"},{"size":660,"mtime":1754548497052,"results":"32","hashOfConfig":"29"},{"size":1265,"mtime":1754548497071,"results":"33","hashOfConfig":"29"},{"size":1586,"mtime":1754548497087,"results":"34","hashOfConfig":"29"},{"size":1721,"mtime":1754548497102,"results":"35","hashOfConfig":"29"},{"size":1832,"mtime":1754548497135,"results":"36","hashOfConfig":"29"},{"size":1323,"mtime":1754548497161,"results":"37","hashOfConfig":"29"},{"size":5850,"mtime":1754548497231,"results":"38","hashOfConfig":"29"},{"size":1799,"mtime":1754548497243,"results":"39","hashOfConfig":"29"},{"size":1607,"mtime":1754548497254,"results":"40","hashOfConfig":"29"},{"size":6142,"mtime":1754548497283,"results":"41","hashOfConfig":"29"},{"size":1814,"mtime":1754548497297,"results":"42","hashOfConfig":"29"},{"size":1596,"mtime":1754548497310,"results":"43","hashOfConfig":"29"},{"size":2047,"mtime":1754548497343,"results":"44","hashOfConfig":"29"},{"size":1036,"mtime":1754548497352,"results":"45","hashOfConfig":"29"},{"size":1592,"mtime":1754548497366,"results":"46","hashOfConfig":"29"},{"size":1309,"mtime":1754548497377,"results":"47","hashOfConfig":"29"},{"size":1730,"mtime":1754548497387,"results":"48","hashOfConfig":"29"},{"size":3235,"mtime":1754548497398,"results":"49","hashOfConfig":"29"},{"size":1028,"mtime":1754548497408,"results":"50","hashOfConfig":"29"},{"size":2711,"mtime":1754548497426,"results":"51","hashOfConfig":"29"},{"size":51081,"mtime":1754548497582,"results":"52","hashOfConfig":"29"},{"filePath":"53","messages":"54","suppressedMessages":"55","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"8pmxxm",{"filePath":"56","messages":"57","suppressedMessages":"58","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"sz7ybt",{"filePath":"59","messages":"60","suppressedMessages":"61","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"62","messages":"63","suppressedMessages":"64","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"65","messages":"66","suppressedMessages":"67","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"68","messages":"69","suppressedMessages":"70","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"71","messages":"72","suppressedMessages":"73","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"74","messages":"75","suppressedMessages":"76","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"77","messages":"78","suppressedMessages":"79","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"80","messages":"81","suppressedMessages":"82","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"83","messages":"84","suppressedMessages":"85","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"86","messages":"87","suppressedMessages":"88","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"89","messages":"90","suppressedMessages":"91","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"92","messages":"93","suppressedMessages":"94","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"95","messages":"96","suppressedMessages":"97","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"98","messages":"99","suppressedMessages":"100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"101","messages":"102","suppressedMessages":"103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"104","messages":"105","suppressedMessages":"106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"107","messages":"108","suppressedMessages":"109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"110","messages":"111","suppressedMessages":"112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"113","messages":"114","suppressedMessages":"115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"116","messages":"117","suppressedMessages":"118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"119","messages":"120","suppressedMessages":"121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"122","messages":"123","suppressedMessages":"124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"125","messages":"126","suppressedMessages":"127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"D:\\@linkcord\\linkcord\\next.config.js",[],[],"D:\\@lynkr\\lynkr.link\\hooks\\useAnalytics.js",[],[],"D:\\@lynkr\\lynkr.link\\hooks\\useDeviceAnalytics.js",[],[],"D:\\@lynkr\\lynkr.link\\hooks\\useLocationAnalytics.js",[],[],"D:\\@lynkr\\lynkr.link\\hooks\\useSections.js",[],[],"D:\\@lynkr\\lynkr.link\\lib\\db-edge.js",[],[],"D:\\@lynkr\\lynkr.link\\middleware.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\_document.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\clicks\\[id].js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\device.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\index.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\location.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\analytics\\views\\record.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\auth\\[...nextauth].js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\internal\\user.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\links\\[linkId].js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\links\\index.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\links\\reorder.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\sections\\reorder.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\user\\update-og-styles.js",[],[],"D:\\@lynkr\\lynkr.link\\pages\\api\\version.js",[],[],"D:\\@lynkr\\lynkr.link\\tailwind.config.js",[],[],"D:\\@lynkr\\lynkr.link\\utils\\geo-service.js",[],[],"D:\\@lynkr\\lynkr.link\\utils\\helpers.js",[],[],"D:\\@lynkr\\lynkr.link\\utils\\themes.js",[],[]]

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2424
- ✨ Updated navigation bar to match the slate theme of the footer
2525
- ✨ Added version display with git hash in the footer
2626
- ✨ Implemented changelog API for dynamic version history
27+
- ✨ Implemented a new "Tabbed Sections" layouts that breaks link sections into tabs
2728
- ✨ Improved footer layout with better grid structure and mobile responsiveness
2829
- ✨ Created glassmorphic tabbed sections component for better content organization
2930
- ✨ Enhanced social cards component with improved sizing and responsiveness

components/core/admin-panel/link.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ const LinkCard = (props) => {
3434
ref={setNodeRef}
3535
style={style}
3636
className={`flex bg-white items-center p-2 rounded-lg drop-shadow-md my-5 transition-all duration-200 ${isDragging || props.isDragging
37-
? 'shadow-2xl scale-105 rotate-2 z-50'
38-
: 'hover:shadow-lg'
37+
? 'shadow-2xl scale-105 rotate-2 z-50'
38+
: 'hover:shadow-lg'
3939
}`}
4040
>
4141
<div

components/core/admin-panel/sectioned-links-editor.jsx

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,11 @@ const SectionedLinksEditor = () => {
174174
const [draggedItem, setDraggedItem] = useState(null);
175175
const [dragOverSection, setDragOverSection] = useState(null);
176176
const [isDraggingOverSection, setIsDraggingOverSection] = useState(false);
177-
// Add state for active drag section
178177
const [activeDragSectionId, setActiveDragSectionId] = useState(null);
179178
const [collapseAllSections, setCollapseAllSections] = useState(false);
180179
const [isDraggingSection, setIsDraggingSection] = useState(false);
180+
// Add state to track whether we're in a link drag operation
181+
const [isDraggingLink, setIsDraggingLink] = useState(false);
181182

182183
// Add section reordering mutation
183184
const updateSectionsOrderMutation = useMutation(
@@ -234,29 +235,46 @@ const SectionedLinksEditor = () => {
234235
// Add the missing handleSectionDragStart function
235236
const handleSectionDragStart = useCallback((event) => {
236237
const { active } = event;
237-
setActiveDragSectionId(active.id);
238-
setIsDraggingSection(true);
239-
}, []);
238+
239+
// Check if the active item is a section
240+
const isSectionDrag = userSections?.some(section => section.id === active.id);
241+
242+
if (isSectionDrag) {
243+
setActiveDragSectionId(active.id);
244+
setIsDraggingSection(true);
245+
setIsDraggingLink(false); // Ensure we're not in link drag mode
246+
}
247+
}, [userSections]);
240248

241249
// Enhanced drag handlers with cross-section support and smoother animations
242250
const handleDragStart = useCallback((event) => {
243251
const { active } = event;
244-
setActiveDragId(active.id);
245252

246-
// Find the dragged item
247-
const draggedLink = userLinks?.find(link => link.id === active.id);
248-
setDraggedItem(draggedLink);
249-
setDragOverSection(null);
250-
setIsDraggingOverSection(false);
253+
// Check if the active item is a link
254+
const isLinkDrag = userLinks?.some(link => link.id === active.id);
255+
256+
if (isLinkDrag) {
257+
setActiveDragId(active.id);
258+
setIsDraggingLink(true);
259+
setIsDraggingSection(false); // Ensure we're not in section drag mode
260+
261+
// Find the dragged item
262+
const draggedLink = userLinks?.find(link => link.id === active.id);
263+
setDraggedItem(draggedLink);
264+
setDragOverSection(null);
265+
setIsDraggingOverSection(false);
266+
}
251267
}, [userLinks]);
252268

253269
const handleDragEnd = useCallback(async (event) => {
254270
const { active, over } = event;
255271

272+
// Reset all drag states
256273
setActiveDragId(null);
257274
setDraggedItem(null);
258275
setDragOverSection(null);
259276
setIsDraggingOverSection(false);
277+
setIsDraggingLink(false);
260278

261279
if (!over || active.id === over.id) return;
262280

@@ -507,7 +525,7 @@ const SectionedLinksEditor = () => {
507525
<span className="text-xs text-gray-500">({groupedLinks.unsectioned.length})</span>
508526
</div>
509527

510-
{/* Show links only if not dragging sections */}
528+
{/* Show links unless we're specifically dragging sections */}
511529
{!isDraggingSection && (
512530
<SortableContext items={groupedLinks.unsectioned.map(link => link.id)} strategy={verticalListSortingStrategy}>
513531
{groupedLinks.unsectioned
@@ -557,7 +575,7 @@ const SectionedLinksEditor = () => {
557575
onVisibilityToggle={() => toggleSectionVisibility(section.id, section.visible)}
558576
onDelete={() => deleteSection(section.id)}
559577
>
560-
{/* Section links - hide during section dragging */}
578+
{/* Section links - only hide during section dragging */}
561579
{!isDraggingSection && section.links.length > 0 ? (
562580
<SortableContext items={section.links.map(link => link.id)} strategy={verticalListSortingStrategy}>
563581
{section.links
@@ -618,7 +636,7 @@ const SectionedLinksEditor = () => {
618636
{/* Drag Overlay for smooth animations */}
619637
<DragOverlay dropAnimation={{ duration: 150, easing: 'cubic-bezier(0.18, 0.67, 0.6, 1.22)' }}>
620638
{activeDragId && draggedItem ? (
621-
<div className="transform shadow-2xl rotate-3 opacity-90 scale-105">
639+
<div className="transform scale-105 shadow-2xl rotate-3 opacity-90">
622640
<Link
623641
id={draggedItem.id}
624642
title={draggedItem.title}
@@ -643,10 +661,14 @@ const SectionedLinksEditor = () => {
643661
)}
644662
</DragOverlay>
645663

646-
{/* Help tooltip for dragging */}
664+
{/* Help tooltip for dragging - improved to show different messages */}
647665
{(activeDragId || activeDragSectionId) && (
648-
<div className="fixed bottom-4 left-1/2 transform -translate-x-1/2 bg-slate-800 text-white px-4 py-2 rounded-lg shadow-lg text-sm">
649-
{activeDragSectionId ? "Drop on another section to reorder" : "Drop on a section header to move this link"}
666+
<div className="fixed px-4 py-2 text-sm text-white transform -translate-x-1/2 rounded-lg shadow-lg bottom-4 left-1/2 bg-slate-800">
667+
{isDraggingSection
668+
? "Drop on another section to reorder sections"
669+
: isDraggingLink
670+
? "Drop on a section header to move this link to that section"
671+
: "Drag to reorder"}
650672
</div>
651673
)}
652674

0 commit comments

Comments
 (0)