{"version":3,"file":"static/chunks/app/blog/[category]/[slug]/page-3865ec79b568c852.js","mappings":"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","sources":["webpack://_N_E/./src/components/ui/breadcrumb.tsx","webpack://_N_E/./src/utils/thumbsUp.ts","webpack://_N_E/./src/components/Article/CommentSection.tsx","webpack://_N_E/./src/components/ui/dropdown-menu.tsx","webpack://_N_E/./src/components/Breadcrumb/BreadCrumb.tsx","webpack://_N_E/./src/components/Breadcrumb/BreadCrumbWrapper.tsx","webpack://_N_E/./src/utils/image-loader.js","webpack://_N_E/./src/components/ui/Container.tsx","webpack://_N_E/./src/components/SocialSharing/SocialShareButton.tsx","webpack://_N_E/./src/lib/utils.ts","webpack://_N_E/./src/components/contentNodes/CodeNode.tsx","webpack://_N_E/?f4cc","webpack://_N_E/./src/components/ui/button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { ChevronRightIcon, DotsHorizontalIcon } from \"@radix-ui/react-icons\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cn } from \"@/lib/utils\";\nconst Breadcrumb = React.forwardRef<HTMLElement, React.ComponentPropsWithoutRef<\"nav\"> & {\n  separator?: React.ReactNode;\n}>(({\n  ...props\n}, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />);\nBreadcrumb.displayName = \"Breadcrumb\";\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<\"ol\">>(({\n  className,\n  ...props\n}, ref) => <ol ref={ref} className={cn(\"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\", className)} {...props} />);\nBreadcrumbList.displayName = \"BreadcrumbList\";\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<\"li\">>(({\n  className,\n  ...props\n}, ref) => <li ref={ref} className={cn(\"inline-flex items-center gap-1.5\", className)} {...props} />);\nBreadcrumbItem.displayName = \"BreadcrumbItem\";\nconst BreadcrumbLink = React.forwardRef<HTMLAnchorElement, React.ComponentPropsWithoutRef<\"a\"> & {\n  asChild?: boolean;\n}>(({\n  asChild,\n  className,\n  ...props\n}, ref) => {\n  const Comp = asChild ? Slot : \"a\";\n  return <Comp ref={ref} className={cn(\"transition-colors hover:text-foreground\", className)} {...props} />;\n});\nBreadcrumbLink.displayName = \"BreadcrumbLink\";\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<\"span\">>(({\n  className,\n  ...props\n}, ref) => <span ref={ref} role=\"link\" aria-disabled=\"true\" aria-current=\"page\" className={cn(\"font-normal text-foreground\", className)} {...props} />);\nBreadcrumbPage.displayName = \"BreadcrumbPage\";\nconst BreadcrumbSeparator = ({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<\"li\">) => <li role=\"presentation\" aria-hidden=\"true\" className={cn(\"[&>svg]:size-3.5\", className)} {...props} data-sentry-component=\"BreadcrumbSeparator\" data-sentry-source-file=\"breadcrumb.tsx\">\n    {children ?? <ChevronRightIcon />}\n  </li>;\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\";\nconst BreadcrumbEllipsis = ({\n  className,\n  ...props\n}: React.ComponentProps<\"span\">) => <span role=\"presentation\" aria-hidden=\"true\" className={cn(\"flex h-9 w-9 items-center justify-center\", className)} {...props} data-sentry-component=\"BreadcrumbEllipsis\" data-sentry-source-file=\"breadcrumb.tsx\">\n    <DotsHorizontalIcon className=\"h-4 w-4\" data-sentry-element=\"DotsHorizontalIcon\" data-sentry-source-file=\"breadcrumb.tsx\" />\n    <span className=\"sr-only\">More</span>\n  </span>;\nBreadcrumbEllipsis.displayName = \"BreadcrumbElipssis\";\nexport { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis };","export const getThumbsUpComments = (): string[] => {\n    if (typeof window === 'undefined') return [];\n    const data = localStorage.getItem('thumbsUpComments');\n    return data ? JSON.parse(data) : [];\n};\n\nexport const addThumbsUpComment = (commentId: string) => {\n    const thumbsUpComments = getThumbsUpComments();\n    if (!thumbsUpComments.includes(commentId)) {\n        thumbsUpComments.push(commentId);\n        localStorage.setItem('thumbsUpComments', JSON.stringify(thumbsUpComments));\n    }\n};\n\nexport const hasThumbsUped = (commentId: string): boolean => {\n    const thumbsUpComments = getThumbsUpComments();\n    return thumbsUpComments.includes(commentId);\n};","'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport useSWRInfinite from 'swr/infinite';\nimport { useForm } from 'react-hook-form';\nimport { Send, Clock, ThumbsUp, ChevronDown } from 'lucide-react';\nimport { Comment, Post } from '@/types/payload-types';\nimport { addThumbsUpComment, hasThumbsUped } from '@/utils/thumbsUp';\nimport { Button } from '@/components/ui/button';\ninterface CommentSectionProps {\n  post: Post;\n}\ninterface CommentFormData {\n  name: string;\n  email: string;\n  content: string;\n}\ninterface CommentsResponse {\n  docs: Comment[];\n  hasNextPage: boolean;\n}\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\nconst CommentSection: React.FC<CommentSectionProps> = ({\n  post\n}) => {\n  const [isCommentingOpen, setIsCommentingOpen] = useState(false);\n  const [formMessage, setFormMessage] = useState<{\n    type: 'error' | 'success';\n    text: string;\n  } | null>(null);\n  const {\n    register,\n    handleSubmit,\n    reset,\n    formState: {\n      errors,\n      isSubmitting\n    }\n  } = useForm<CommentFormData>();\n  const getKey = (pageIndex: number, previousPageData: CommentsResponse | null) => {\n    if (previousPageData && !previousPageData.hasNextPage) return null;\n    return `/api/comments?postId=${post.id}&limit=2&page=${pageIndex + 1}`;\n  };\n  const {\n    data,\n    error,\n    size,\n    setSize,\n    mutate\n  } = useSWRInfinite<CommentsResponse>(getKey, fetcher, {\n    revalidateOnFocus: false\n  });\n  const comments = data ? data.reduce((acc, page) => [...acc, ...page.docs], [] as Comment[]) : [];\n  const hasNextPage = data ? data[data.length - 1].hasNextPage : false;\n  const isLoadingInitialData = !data && !error;\n  const isLoadingMore = isLoadingInitialData || size > 0 && data && typeof data[size - 1] === 'undefined';\n  const loadMoreComments = useCallback(() => {\n    if (hasNextPage && !isLoadingMore) {\n      setSize(size + 1);\n    }\n  }, [hasNextPage, isLoadingMore, setSize, size]);\n  const onSubmit = async (formData: CommentFormData) => {\n    try {\n      const response = await fetch('/api/comments', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          post: post.id,\n          author_name: formData.name,\n          author_email: formData.email,\n          content: formData.content,\n          status: 'pending'\n        })\n      });\n      if (!response.ok) throw new Error('Failed to post comment');\n      setIsCommentingOpen(false);\n      reset();\n      setFormMessage({\n        type: 'success',\n        text: 'Your comment has been submitted for review and will be public after approval.'\n      });\n      mutate();\n    } catch (error: unknown) {\n      console.error('Error posting comment:', error);\n      setFormMessage({\n        type: 'error',\n        text: 'Failed to post comment. Please try again.'\n      });\n    }\n  };\n  const handleThumbsUp = async (commentId: string) => {\n    if (hasThumbsUped(commentId)) {\n      setFormMessage({\n        type: 'error',\n        text: 'You have already given a thumbs-up to this comment.'\n      });\n      return;\n    }\n    mutate(pages => {\n      if (!pages) return pages;\n      return pages.map(page => ({\n        ...page,\n        docs: page.docs.map(comment => comment.id === commentId ? {\n          ...comment,\n          thumbs_up_count: (comment.thumbs_up_count || 0) + 1\n        } : comment)\n      }));\n    }, false);\n    try {\n      const response = await fetch(`/api/comments/${commentId}/thumbs-up`, {\n        method: 'POST'\n      });\n      if (!response.ok) throw new Error('Failed to update thumbs up');\n      await response.json();\n      addThumbsUpComment(commentId);\n      mutate();\n    } catch (error: unknown) {\n      console.error('Error updating thumbs up:', error);\n      mutate(pages => {\n        if (!pages) return pages;\n        return pages.map(page => ({\n          ...page,\n          docs: page.docs.map(comment => comment.id === commentId ? {\n            ...comment,\n            thumbs_up_count: (comment.thumbs_up_count || 1) - 1\n          } : comment)\n        }));\n      }, false);\n      setFormMessage({\n        type: 'error',\n        text: 'Failed to update thumbs up. Please try again.'\n      });\n    }\n  };\n  if (error) return <div className=\"text-red-500\">Failed to load comments.</div>;\n  if (isLoadingInitialData) return <div>Loading comments...</div>;\n  const CommentBubble = ({\n    comment\n  }: {\n    comment: Comment;\n  }) => {\n    const date = new Date(comment.createdAt);\n    const formattedDate = date.toLocaleDateString('en-US', {\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric'\n    });\n    const alreadyThumbsUped = hasThumbsUped(comment.id);\n    return <div className=\"bg-gray-50 dark:bg-gray-800 p-4 rounded-lg shadow-sm mb-6\" data-sentry-component=\"CommentBubble\" data-sentry-source-file=\"CommentSection.tsx\">\n        <div className=\"flex items-center justify-between mb-2\">\n          <h3 className=\"text-lg font-semibold text-gray-800 dark:text-gray-100\">{comment.author_name}</h3>\n          <span className=\"text-xs text-gray-500 dark:text-gray-400 flex items-center\">\n            <Clock size={12} className=\"mr-1\" data-sentry-element=\"Clock\" data-sentry-source-file=\"CommentSection.tsx\" />\n            {formattedDate}\n          </span>\n        </div>\n        <p className=\"text-gray-600 dark:text-gray-300 mb-3\">{comment.content}</p>\n        <div className=\"flex items-center text-xs text-gray-500 dark:text-gray-400\">\n          <button onClick={() => handleThumbsUp(comment.id)} disabled={alreadyThumbsUped} className={`flex items-center transition-colors duration-200 ${alreadyThumbsUped ? 'text-gray-400 cursor-not-allowed' : 'hover:text-indigo-600 dark:hover:text-indigo-400'}`} title={alreadyThumbsUped ? 'You have already liked this comment' : 'Like this comment'}>\n            <ThumbsUp size={12} className=\"mr-1\" data-sentry-element=\"ThumbsUp\" data-sentry-source-file=\"CommentSection.tsx\" />\n            <span>Helpful ({comment.thumbs_up_count})</span>\n          </button>\n        </div>\n      </div>;\n  };\n  return <div className=\"mt-12 max-w-7xl mx-auto \" data-sentry-component=\"CommentSection\" data-sentry-source-file=\"CommentSection.tsx\">\n      <h2 className=\"text-2xl md:text-3xl font-bold mb-6 text-gray-800 dark:text-gray-100 border-b border-gray-300 dark:border-gray-700 pb-2\">\n        Reader Insights\n      </h2>\n      {formMessage && <div className={`mb-4 p-3 rounded ${formMessage.type === 'error' ? 'bg-red-600 text-white' : 'bg-green-600 text-white'}`}>\n          {formMessage.text}\n        </div>}\n      {comments.length > 0 ? <>\n          {comments.map(comment => <CommentBubble key={comment.id} comment={comment} />)}\n          {hasNextPage && <Button variant={'secondary'} onClick={loadMoreComments} disabled={isLoadingMore} className=\"w-full text-gray-800 dark:text-gray-200 font-semibold py-2 px-4 flex items-center justify-center\">\n              {isLoadingMore ? 'Loading...' : <>\n                  <ChevronDown size={18} className=\"mr-2\" />\n                  Load More Comments\n                </>}\n            </Button>}\n        </> : <p className=\"text-gray-600 dark:text-gray-400\">No comments yet. Be the first to share your thoughts!</p>}\n      {!isCommentingOpen ? <button onClick={() => setIsCommentingOpen(true)} className=\"mt-6 w-full bg-primary hover:bg-red-800 text-white font-semibold py-4 px-4 rounded-md transition duration-200 flex items-center justify-center\">\n          Share Your Thoughts\n        </button> : <form onSubmit={handleSubmit(onSubmit)} className=\"mt-8 space-y-4 bg-gray-100 dark:bg-gray-800 bg-opacity-20 p-6 rounded-lg shadow-md\">\n          <div className=\"relative\">\n            <input {...register('name', {\n          required: 'Name is required'\n        })} id=\"name\" type=\"text\" className={`block w-full px-4 py-2 bg-transparent border-b-2 ${errors.name ? 'border-red-500' : 'border-gray-500 dark:border-gray-400'} focus:outline-none focus:border-indigo-500 text-gray-800 dark:text-gray-100 transition-colors duration-200`} placeholder=\"Your Name\" />\n\n            {errors.name && <span className=\"text-xs text-red-400 mt-1\">{errors.name.message}</span>}\n          </div>\n\n          <div className=\"relative\">\n            <input {...register('email', {\n          required: 'Email is required',\n          pattern: {\n            value: /\\S+@\\S+\\.\\S+/,\n            message: \"Invalid email address\"\n          }\n        })} id=\"email\" type=\"email\" className={`block w-full px-4 py-2 bg-transparent border-b-2 ${errors.email ? 'border-red-500' : 'border-gray-500 dark:border-gray-400'} focus:outline-none focus:border-indigo-500 text-gray-800 dark:text-gray-100 transition-colors duration-200`} placeholder=\"Your Email\" />\n\n            {errors.email && <span className=\"text-xs text-red-400 mt-1\">{errors.email.message}</span>}\n          </div>\n\n          <div className=\"relative\">\n            <textarea {...register('content', {\n          required: 'Comment is required'\n        })} id=\"content\" className={`block w-full px-4 py-2 bg-transparent border-b-2 ${errors.content ? 'border-red-500' : 'border-gray-500 dark:border-gray-400'} focus:outline-none focus:border-indigo-500 text-gray-800 dark:text-gray-100 transition-colors duration-200 resize-none h-32`} placeholder=\"Your Comment\" />\n\n            {errors.content && <span className=\"text-xs text-red-400 mt-1\">{errors.content.message}</span>}\n          </div>\n\n          <Button type=\"submit\" disabled={isSubmitting} className=\"w-full py-6 flex items-center justify-center bg-primary hover:bg-red-800 text-white font-semibold px-4 rounded-md transition duration-200\">\n            <Send size={18} className=\"mr-3\" />\n            {isSubmitting ? 'Submitting...' : 'Submit Comment'}\n          </Button>\n        </form>}\n    </div>;\n};\nexport default CommentSection;","\"use client\";\n\nimport * as React from \"react\";\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from \"@radix-ui/react-icons\";\nimport { cn } from \"@/lib/utils\";\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\nconst DropdownMenuSubTrigger = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n  inset?: boolean;\n}>(({\n  className,\n  inset,\n  children,\n  ...props\n}, ref) => <DropdownMenuPrimitive.SubTrigger ref={ref} className={cn(\"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\", inset && \"pl-8\", className)} {...props}>\n    {children}\n    <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n  </DropdownMenuPrimitive.SubTrigger>);\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\nconst DropdownMenuSubContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.SubContent>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>>(({\n  className,\n  ...props\n}, ref) => <DropdownMenuPrimitive.SubContent ref={ref} className={cn(\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg 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\", className)} {...props} />);\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\nconst DropdownMenuContent = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Content>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>>(({\n  className,\n  sideOffset = 4,\n  ...props\n}, ref) => <DropdownMenuPrimitive.Portal>\n    <DropdownMenuPrimitive.Content ref={ref} sideOffset={sideOffset} className={cn(\"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\", \"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\", className)} {...props} />\n  </DropdownMenuPrimitive.Portal>);\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\nconst DropdownMenuItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Item>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n  inset?: boolean;\n}>(({\n  className,\n  inset,\n  ...props\n}, ref) => <DropdownMenuPrimitive.Item ref={ref} className={cn(\"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\", inset && \"pl-8\", className)} {...props} />);\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\nconst DropdownMenuCheckboxItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>>(({\n  className,\n  children,\n  checked,\n  ...props\n}, ref) => <DropdownMenuPrimitive.CheckboxItem ref={ref} className={cn(\"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\", className)} checked={checked} {...props}>\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <CheckIcon className=\"h-4 w-4\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.CheckboxItem>);\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\nconst DropdownMenuRadioItem = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>>(({\n  className,\n  children,\n  ...props\n}, ref) => <DropdownMenuPrimitive.RadioItem ref={ref} className={cn(\"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\", className)} {...props}>\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.RadioItem>);\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\nconst DropdownMenuLabel = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Label>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n  inset?: boolean;\n}>(({\n  className,\n  inset,\n  ...props\n}, ref) => <DropdownMenuPrimitive.Label ref={ref} className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)} {...props} />);\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\nconst DropdownMenuSeparator = React.forwardRef<React.ElementRef<typeof DropdownMenuPrimitive.Separator>, React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>>(({\n  className,\n  ...props\n}, ref) => <DropdownMenuPrimitive.Separator ref={ref} className={cn(\"-mx-1 my-1 h-px bg-muted\", className)} {...props} />);\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\nconst DropdownMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return <span className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)} {...props} data-sentry-component=\"DropdownMenuShortcut\" data-sentry-source-file=\"dropdown-menu.tsx\" />;\n};\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\nexport { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup };","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport Script from \"next/script\";\nimport React, { useState } from \"react\";\nimport { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator } from \"@/components/ui/breadcrumb\";\nimport Container from \"@/components/ui/Container\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@/components/ui/dropdown-menu\";\ninterface BreadcrumbItem {\n  href: string;\n  text: string;\n}\nconst Breadcrumbs: React.FC = () => {\n  const pathname = usePathname();\n  const pathSegments = pathname.split(\"/\").filter(x => x);\n  const [open, setOpen] = useState(false);\n  const breadcrumbs: BreadcrumbItem[] = [{\n    href: \"/\",\n    text: \"Home\"\n  }, ...pathSegments.map((segment, index) => {\n    const href = `/${pathSegments.slice(0, index + 1).join(\"/\")}`;\n    const text = segment.split(\"-\").map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(\" \");\n    return {\n      href,\n      text\n    };\n  })];\n  const shouldUseDropdown = breadcrumbs.length > 3;\n  const jsonLd = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"BreadcrumbList\",\n    itemListElement: breadcrumbs.map((breadcrumb, index) => ({\n      \"@type\": \"ListItem\",\n      position: index + 1,\n      item: {\n        \"@id\": `https://tantainnovatives.com${breadcrumb.href}`,\n        name: breadcrumb.text\n      }\n    }))\n  };\n  return <>\n        <Script id=\"breadcrumbJsonLD\" type=\"application/ld+json\" dangerouslySetInnerHTML={{\n      __html: JSON.stringify(jsonLd)\n    }} data-sentry-element=\"Script\" data-sentry-source-file=\"BreadCrumb.tsx\" />\n        <nav aria-label=\"Breadcrumb\">\n          <Container data-sentry-element=\"Container\" data-sentry-source-file=\"BreadCrumb.tsx\">\n            <ol itemScope itemType=\"https://schema.org/BreadcrumbList\" className=\"flex items-center space-x-1.5 text-sm py-3\">\n              {breadcrumbs.map((breadcrumb, index) => <React.Fragment key={index}>\n                    {index !== 0 && <BreadcrumbSeparator />}\n                    {shouldUseDropdown && index === 1 ? <DropdownMenu open={open} onOpenChange={setOpen}>\n                          <DropdownMenuTrigger className=\"flex items-center gap-1\">\n                            <BreadcrumbEllipsis className=\"h-4 w-4\" />\n                            <span className=\"sr-only\">Toggle menu</span>\n                          </DropdownMenuTrigger>\n                          <DropdownMenuContent>\n                            {breadcrumbs.slice(1, -1).map((item, idx) => <DropdownMenuItem key={idx}>\n                                  <BreadcrumbLink href={item.href}>{item.text}</BreadcrumbLink>\n                                </DropdownMenuItem>)}\n                          </DropdownMenuContent>\n                        </DropdownMenu> : <BreadcrumbItem itemScope itemProp=\"itemListElement\" itemType=\"https://schema.org/ListItem\">\n                          {index === breadcrumbs.length - 1 ? <span itemProp=\"name\" className=\"line-clamp-1 text-gray-500 dark:text-gray-400\">\n                        {breadcrumb.text}\n                      </span> : <BreadcrumbLink href={breadcrumb.href} itemProp=\"item\" className=\"text-primary dark:text-primary/80 line-clamp-1 hover:text-primary-dark dark:hover:text-primary transition-colors duration-200 font-medium\">\n                                <span itemProp=\"name\">{breadcrumb.text}</span>\n                              </BreadcrumbLink>}\n                          <meta itemProp=\"position\" content={`${index + 1}`} />\n                        </BreadcrumbItem>}\n                  </React.Fragment>)}\n            </ol>\n          </Container>\n        </nav>\n      </>;\n};\nexport default Breadcrumbs;","\"use client\";\n\nimport React from \"react\";\nimport Breadcrumbs from \"./BreadCrumb\";\ntype BreadcrumbWrapperProps = {\n  className?: string;\n};\n\n/**\n * A standardized wrapper for breadcrumbs to ensure consistent positioning and spacing\n * across all pages in the application.\n */\nconst BreadcrumbWrapper: React.FC<BreadcrumbWrapperProps> = ({\n  className = \"\"\n}) => {\n  return <div className={`lg:mt-2 xl:mt-0 bg-white dark:bg-black border-b border-gray-100 dark:border-gray-800 ${className}`} data-sentry-component=\"BreadcrumbWrapper\" data-sentry-source-file=\"BreadCrumbWrapper.tsx\">\n      <Breadcrumbs data-sentry-element=\"Breadcrumbs\" data-sentry-source-file=\"BreadCrumbWrapper.tsx\" />\n    </div>;\n};\nexport default BreadcrumbWrapper;","/**\n * Custom image loader for optimizing CloudFront image loading\n * This helps reduce image load times and improve LCP scores\n */\n\nexport default function cloudFrontImageLoader({ src, width, quality }) {\n  // If the image is from our cloudfront distribution\n  if (src.includes('cloudfront.net')) {\n    // Check if image already has query parameters\n    const hasParams = src.includes('?');\n    const separator = hasParams ? '&' : '?';\n    \n    // For CloudFront images, we'll add optimization parameters\n    // Some CDNs like CloudFront can optimize images on-the-fly\n    return `${src}${separator}w=${width}&q=${quality || 75}&auto=format`;\n  }\n  \n  // Handle other image sources with the default loader behavior\n  const imageParams = new URLSearchParams({\n    url: src,\n    w: width,\n    q: quality || 75,\n  });\n  \n  return `/_next/image?${imageParams.toString()}`;\n} ","import { cn } from \"@/lib/utils\";\nimport React from \"react\";\ntype Props = {\n  children?: React.ReactNode;\n  className?: string;\n};\nconst Container = ({\n  children,\n  className\n}: Props) => {\n  return <div className={cn(\"container mx-auto px-4 xl:px-24\", className)} data-sentry-component=\"Container\" data-sentry-source-file=\"Container.tsx\">\n            {children}\n        </div>;\n};\nexport default Container;","'use client';\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { Share2, Link, Check, Link2, MoreHorizontal } from 'lucide-react';\nimport { BiLogoFacebook, BiLogoLinkedin, BiLogoTwitter } from \"react-icons/bi\";\ninterface SocialSharingProps {\n  url: string;\n  title: string;\n  postId: string;\n}\nconst SocialSharing: React.FC<SocialSharingProps> = ({\n  url,\n  title,\n  postId\n}) => {\n  const [isOpen, setIsOpen] = useState(false);\n  const [friendLink, setFriendLink] = useState<string | null>(null);\n  const [copySuccess, setCopySuccess] = useState(false);\n  const [isGeneratingFriendLink, setIsGeneratingFriendLink] = useState(false);\n  const dropdownRef = useRef<HTMLDivElement>(null);\n  const encodedUrl = encodeURIComponent(url);\n  const encodedTitle = encodeURIComponent(title);\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n        setIsOpen(false);\n      }\n    };\n    document.addEventListener('mousedown', handleClickOutside);\n    return () => {\n      document.removeEventListener('mousedown', handleClickOutside);\n    };\n  }, []);\n  const copyToClipboard = (textToCopy: string) => {\n    navigator.clipboard.writeText(textToCopy).then(() => {\n      setCopySuccess(true);\n      setTimeout(() => setCopySuccess(false), 2000);\n    });\n  };\n  const generateFriendLink = async () => {\n    if (isGeneratingFriendLink) return;\n    setIsGeneratingFriendLink(true);\n    try {\n      const response = await fetch(`/api/create-short-url?postId=${postId}`);\n      if (!response.ok) throw new Error('Failed to generate short URL');\n      const data = await response.json();\n      const shortUrl = `${process.env.NEXT_PUBLIC_SITE_URL}/s/${data.shortCode}`;\n      setFriendLink(shortUrl);\n      copyToClipboard(shortUrl);\n    } catch (error) {\n      console.error('Error generating friend link:', error);\n      alert('Failed to generate friend link. Please try again.');\n    } finally {\n      setIsGeneratingFriendLink(false);\n    }\n  };\n  const shareLinks = [{\n    name: 'Copy link',\n    icon: copySuccess ? <Check className=\"w-5 h-5 text-green-500\" /> : <Link className=\"w-5 h-5\" />,\n    action: () => copyToClipboard(friendLink || url)\n  }, {\n    name: 'Friendly Link',\n    icon: <Link2 className={`w-5 h-5 ${friendLink ? 'text-red-500' : ''}`} />,\n    action: generateFriendLink\n  }, {\n    name: 'Share on X',\n    icon: <BiLogoTwitter className=\"w-5 h-5\" />,\n    href: `https://twitter.com/intent/tweet?url=${friendLink || encodedUrl}&text=${encodedTitle}`\n  }, {\n    name: 'Share on Facebook',\n    icon: <BiLogoFacebook className=\"w-5 h-5\" />,\n    href: `https://www.facebook.com/sharer/sharer.php?u=${friendLink || encodedUrl}`\n  }, {\n    name: 'Share on LinkedIn',\n    icon: <BiLogoLinkedin className=\"w-5 h-5\" />,\n    href: `https://www.linkedin.com/shareArticle?mini=true&url=${friendLink || encodedUrl}&title=${encodedTitle}`\n  }];\n  return <div className=\"relative\" ref={dropdownRef} data-sentry-component=\"SocialSharing\" data-sentry-source-file=\"SocialShareButton.tsx\">\n            <button className=\"flex items-center text-gray-500 hover:text-gray-700\" onClick={() => setIsOpen(!isOpen)}>\n                <Share2 className=\"w-5 h-5 mr-2\" data-sentry-element=\"Share2\" data-sentry-source-file=\"SocialShareButton.tsx\" />\n                Share\n            </button>\n            {isOpen && <div className=\"absolute right-0 z-10 w-64 mt-2 bg-white rounded-md shadow-lg\">\n                    <div className=\"py-1\">\n                        {shareLinks.map(item => <a key={item.name} href={item.href} className=\"flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\" onClick={e => {\n          if (!item.href) {\n            e.preventDefault();\n            item.action && item.action();\n          }\n        }} target=\"_blank\" rel=\"noopener noreferrer\">\n                <span className=\"w-8 h-8 flex items-center justify-center text-gray-400\">\n                  {item.icon}\n                </span>\n                                <span className=\"ml-3\">{item.name}</span>\n                                {item.name === 'Friendly Link' && <span className=\"ml-auto text-xs\">\n                    {isGeneratingFriendLink ? 'Generating...' : friendLink ? 'Active' : ''}\n                  </span>}\n                            </a>)}\n                    </div>\n                    <div className=\"border-t border-gray-100\">\n                        <button onClick={() => {}} className=\"flex w-full items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\">\n              <span className=\"w-8 h-8 flex items-center justify-center text-gray-400\">\n                <MoreHorizontal className=\"w-5 h-5\" />\n              </span>\n                            <span className=\"ml-3\">More options</span>\n                        </button>\n                    </div>\n                </div>}\n\n        </div>;\n};\nexport default SocialSharing;","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { tomorrow as theme } from 'react-syntax-highlighter/dist/cjs/styles/prism';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\nimport { Clipboard, Check } from 'lucide-react';\ninterface CodeNodeProps {\n  node: any;\n}\nconst CodeNode: React.FC<CodeNodeProps> = ({\n  node\n}) => {\n  const language = node.language || 'javascript';\n  const code = node.code || '';\n  const highlightLines: number[] = node.highlightLines || [];\n  const [copied, setCopied] = useState(false);\n  const handleCopy = () => {\n    setCopied(true);\n    setTimeout(() => setCopied(false), 2000);\n  };\n  return <div className=\"relative my-6 text-sm\" data-sentry-component=\"CodeNode\" data-sentry-source-file=\"CodeNode.tsx\">\n            <CopyToClipboard text={code} onCopy={handleCopy} data-sentry-element=\"CopyToClipboard\" data-sentry-source-file=\"CodeNode.tsx\">\n                <button className=\"absolute top-2 right-2 p-2 bg-gray-700 text-gray-200 rounded-md hover:bg-gray-600 focus:outline-none\" aria-label=\"Copy code to clipboard\">\n                    {copied ? <Check className=\"w-4 h-4\" /> : <Clipboard className=\"w-4 h-4\" />}\n                </button>\n            </CopyToClipboard>\n\n            {/* Code Block */}\n            <SyntaxHighlighter language={language} style={theme} showLineNumbers wrapLines lineNumberStyle={{\n      color: '#a0aec0'\n    }} lineProps={lineNumber => {\n      const style = {\n        display: 'block'\n      };\n      if (highlightLines.includes(lineNumber)) {\n        // style.backgroundColor = '#4a5568'; // Tailwind's gray-700\n        // style.borderRadius = '0.25rem';\n      }\n      return {\n        style\n      };\n    }} customStyle={{\n      borderRadius: '0.5rem',\n      paddingTop: '1rem',\n      paddingBottom: '1rem'\n    }} data-sentry-element=\"SyntaxHighlighter\" data-sentry-source-file=\"CodeNode.tsx\">\n                {code}\n            </SyntaxHighlighter>\n        </div>;\n};\nexport default CodeNode;","import(/* webpackMode: \"eager\" */ \"/codebuild/output/src3027583125/src/main-tanta-web/node_modules/.pnpm/next@15.2.4_@babel+core@7.26.10_@opentelemetry+api@1.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/app-dir/link.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src3027583125/src/main-tanta-web/node_modules/.pnpm/next@15.2.4_@babel+core@7.26.10_@opentelemetry+api@1.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/image-component.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src3027583125/src/main-tanta-web/node_modules/.pnpm/next@15.2.4_@babel+core@7.26.10_@opentelemetry+api@1.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/lazy-dynamic/dynamic-bailout-to-csr.js\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src3027583125/src/main-tanta-web/node_modules/.pnpm/next@15.2.4_@babel+core@7.26.10_@opentelemetry+api@1.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/lazy-dynamic/preload-chunks.js\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"default\"] */ \"/codebuild/output/src3027583125/src/main-tanta-web/src/components/Article/CommentSection.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"default\"] */ \"/codebuild/output/src3027583125/src/main-tanta-web/src/components/Breadcrumb/BreadCrumbWrapper.tsx\");\n;\nimport(/* webpackMode: \"eager\" */ \"/codebuild/output/src3027583125/src/main-tanta-web/src/components/contentNodes/CodeNode.tsx\");\n;\nimport(/* webpackMode: \"eager\", webpackExports: [\"default\"] */ \"/codebuild/output/src3027583125/src/main-tanta-web/src/components/SocialSharing/SocialShareButton.tsx\");\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nconst buttonVariants = cva(\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\", {\n  variants: {\n    variant: {\n      default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n      destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n      outline: \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n      secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n      ghost: \"hover:bg-accent hover:text-accent-foreground\",\n      link: \"text-primary underline-offset-4 hover:underline\"\n    },\n    size: {\n      default: \"h-9 px-4 py-2\",\n      sm: \"h-8 rounded-md px-3 text-xs\",\n      lg: \"h-10 rounded-md px-8\",\n      icon: \"h-9 w-9\"\n    }\n  },\n  defaultVariants: {\n    variant: \"default\",\n    size: \"default\"\n  }\n});\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n}\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(({\n  className,\n  variant,\n  size,\n  asChild = false,\n  ...props\n}, ref) => {\n  const Comp = asChild ? Slot : \"button\";\n  return <Comp className={cn(buttonVariants({\n    variant,\n    size,\n    className\n  }))} ref={ref} {...props} />;\n});\nButton.displayName = \"Button\";\nexport { Button, buttonVariants };"],"names":["Breadcrumb","React","ref","props","nav","aria-label","displayName","className","ol","cn","BreadcrumbItem","li","BreadcrumbLink","asChild","Comp","Slot","span","role","aria-disabled","aria-current","BreadcrumbSeparator","children","aria-hidden","data-sentry-component","data-sentry-source-file","ChevronRightIcon","BreadcrumbEllipsis","DotsHorizontalIcon","data-sentry-element","getThumbsUpComments","data","localStorage","getItem","JSON","parse","thumbsUpComments","includes","commentId","push","setItem","stringify","fetcher","fetch","url","then","res","json","post","isCommentingOpen","setIsCommentingOpen","useState","formMessage","setFormMessage","register","handleSubmit","reset","formState","errors","isSubmitting","useForm","error","size","setSize","mutate","useSWRInfinite","getKey","pageIndex","previousPageData","hasNextPage","id","revalidateOnFocus","comments","reduce","acc","page","docs","length","isLoadingInitialData","isLoadingMore","loadMoreComments","useCallback","onSubmit","formData","response","method","headers","body","author_name","name","author_email","email","content","status","ok","type","text","handleThumbsUp","hasThumbsUped","pages","map","comment","thumbs_up_count","addThumbsUpComment","div","CommentBubble","formattedDate","Date","createdAt","toLocaleDateString","year","month","day","alreadyThumbsUped","h3","Clock","p","button","onClick","disabled","title","ThumbsUp","h2","Button","variant","ChevronDown","form","input","required","placeholder","message","pattern","value","textarea","Send","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","inset","DropdownMenuContent","sideOffset","DropdownMenuItem","checked","CheckIcon","DotFilledIcon","pathSegments","usePathname","split","Breadcrumbs","filter","x","open","setOpen","breadcrumbs","href","segment","index","slice","join","word","charAt","toUpperCase","shouldUseDropdown","jsonLd","itemListElement","breadcrumb","position","item","Script","dangerouslySetInnerHTML","__html","Container","itemScope","itemType","onOpenChange","idx","itemProp","meta","BreadcrumbWrapper","cloudFrontImageLoader","src","width","quality","hasParams","separator","imageParams","URLSearchParams","w","q","toString","SocialSharing","postId","isOpen","setIsOpen","friendLink","setFriendLink","copySuccess","setCopySuccess","isGeneratingFriendLink","setIsGeneratingFriendLink","dropdownRef","useRef","encodedUrl","encodeURIComponent","encodedTitle","useEffect","handleClickOutside","current","contains","event","target","document","addEventListener","removeEventListener","copyToClipboard","navigator","clipboard","writeText","textToCopy","setTimeout","generateFriendLink","shortUrl","process","shortCode","alert","shareLinks","icon","Check","Link","action","Link2","BiLogoTwitter","BiLogoFacebook","BiLogoLinkedin","Share2","a","e","preventDefault","rel","MoreHorizontal","inputs","twMerge","clsx","node","language","CodeNode","code","highlightLines","copied","setCopied","CopyToClipboard","onCopy","handleCopy","Clipboard","SyntaxHighlighter","style","theme","showLineNumbers","wrapLines","lineNumberStyle","color","lineProps","lineNumber","display","customStyle","borderRadius","paddingTop","paddingBottom","buttonVariants","cva","variants","default","destructive","outline","secondary","ghost","link","sm","lg","defaultVariants"],"sourceRoot":"","ignoreList":[]}