@next-degree/pickle-shared-js 0.11.0 → 0.12.2

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 (111) hide show
  1. package/dist/{company_service_sanity-CGNCrk8e.d.cts → company_service_sanity-2J1ZuUnu.d.cts} +384 -384
  2. package/dist/{company_service_sanity-CAyYirw5.d.ts → company_service_sanity-KaAGfnNV.d.ts} +384 -384
  3. package/dist/components/jobCard/JobLocation.cjs +97 -14
  4. package/dist/components/jobCard/JobLocation.cjs.map +1 -1
  5. package/dist/components/jobCard/JobLocation.d.cts +8 -6
  6. package/dist/components/jobCard/JobLocation.d.ts +8 -6
  7. package/dist/components/jobCard/JobLocation.js +93 -14
  8. package/dist/components/jobCard/JobLocation.js.map +1 -1
  9. package/dist/components/jobPost/JobDescription.cjs +3 -1
  10. package/dist/components/jobPost/JobDescription.cjs.map +1 -1
  11. package/dist/components/jobPost/JobDescription.js +3 -1
  12. package/dist/components/jobPost/JobDescription.js.map +1 -1
  13. package/dist/components/jobPost/JobHeader.cjs +1 -0
  14. package/dist/components/jobPost/JobHeader.cjs.map +1 -1
  15. package/dist/components/jobPost/JobHeader.js +1 -0
  16. package/dist/components/jobPost/JobHeader.js.map +1 -1
  17. package/dist/components/jobPost/JobPost.cjs +26 -18
  18. package/dist/components/jobPost/JobPost.cjs.map +1 -1
  19. package/dist/components/jobPost/JobPost.d.cts +1 -1
  20. package/dist/components/jobPost/JobPost.d.ts +1 -1
  21. package/dist/components/jobPost/JobPost.js +26 -18
  22. package/dist/components/jobPost/JobPost.js.map +1 -1
  23. package/dist/components/primitives/command.d.cts +3 -3
  24. package/dist/components/primitives/command.d.ts +3 -3
  25. package/dist/components/primitives/input-otp.d.cts +2 -2
  26. package/dist/components/primitives/input-otp.d.ts +2 -2
  27. package/dist/components/ui/Chip.cjs +1 -0
  28. package/dist/components/ui/Chip.cjs.map +1 -1
  29. package/dist/components/ui/Chip.d.cts +1 -1
  30. package/dist/components/ui/Chip.d.ts +1 -1
  31. package/dist/components/ui/Chip.js +1 -0
  32. package/dist/components/ui/Chip.js.map +1 -1
  33. package/dist/components/ui/Combobox.cjs +28 -19
  34. package/dist/components/ui/Combobox.cjs.map +1 -1
  35. package/dist/components/ui/Combobox.js +29 -20
  36. package/dist/components/ui/Combobox.js.map +1 -1
  37. package/dist/components/ui/DismissibleBanner.cjs +85 -0
  38. package/dist/components/ui/DismissibleBanner.cjs.map +1 -0
  39. package/dist/components/ui/DismissibleBanner.d.cts +11 -0
  40. package/dist/components/ui/DismissibleBanner.d.ts +11 -0
  41. package/dist/components/ui/DismissibleBanner.js +60 -0
  42. package/dist/components/ui/DismissibleBanner.js.map +1 -0
  43. package/dist/components/ui/ReadMore.cjs +3 -1
  44. package/dist/components/ui/ReadMore.cjs.map +1 -1
  45. package/dist/components/ui/ReadMore.js +3 -1
  46. package/dist/components/ui/ReadMore.js.map +1 -1
  47. package/dist/components/ui/Select.cjs +1 -0
  48. package/dist/components/ui/Select.cjs.map +1 -1
  49. package/dist/components/ui/Select.js +1 -0
  50. package/dist/components/ui/Select.js.map +1 -1
  51. package/dist/{displayText-DHKm6_JF.d.cts → displayText-DW0qiJqh.d.cts} +2 -2
  52. package/dist/{displayText-D8MYOaYK.d.ts → displayText-DahwdHdi.d.ts} +2 -2
  53. package/dist/hooks/useDisplayText.d.cts +3 -3
  54. package/dist/hooks/useDisplayText.d.ts +3 -3
  55. package/dist/index.cjs +1260 -1131
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.d.cts +10 -5
  58. package/dist/index.d.ts +10 -5
  59. package/dist/index.js +1198 -1072
  60. package/dist/index.js.map +1 -1
  61. package/dist/{job_posting_service_latest-DaKYQh30.d.cts → job_posting_service_latest-C_TEBzCf.d.cts} +289 -289
  62. package/dist/{job_posting_service_latest-DaKYQh30.d.ts → job_posting_service_latest-C_TEBzCf.d.ts} +289 -289
  63. package/dist/{job_posting_service_latest-C8PT9mxn.d.cts → job_posting_service_latest-DdgK8Nnz.d.cts} +290 -290
  64. package/dist/{job_posting_service_latest-C8PT9mxn.d.ts → job_posting_service_latest-DdgK8Nnz.d.ts} +290 -290
  65. package/dist/{job_posting_service_sanity-nyUCPROx.d.ts → job_posting_service_sanity-BKo9TBDT.d.ts} +630 -630
  66. package/dist/{job_posting_service_sanity-BK7jdr2W.d.cts → job_posting_service_sanity-BNq-Am9N.d.cts} +630 -630
  67. package/dist/lib/locations.cjs +32 -7
  68. package/dist/lib/locations.cjs.map +1 -1
  69. package/dist/lib/locations.d.cts +8 -5
  70. package/dist/lib/locations.d.ts +8 -5
  71. package/dist/lib/locations.js +30 -6
  72. package/dist/lib/locations.js.map +1 -1
  73. package/dist/lib/mappings.d.cts +3 -3
  74. package/dist/lib/mappings.d.ts +3 -3
  75. package/dist/lib/salaryRange.cjs +14 -12
  76. package/dist/lib/salaryRange.cjs.map +1 -1
  77. package/dist/lib/salaryRange.d.cts +2 -2
  78. package/dist/lib/salaryRange.d.ts +2 -2
  79. package/dist/lib/salaryRange.js +14 -12
  80. package/dist/lib/salaryRange.js.map +1 -1
  81. package/dist/services/displayText.d.cts +3 -3
  82. package/dist/services/displayText.d.ts +3 -3
  83. package/dist/styles/globals.css +3 -7
  84. package/dist/styles/globals.css.map +1 -1
  85. package/dist/types/data/company_service_latest.d.cts +1 -1
  86. package/dist/types/data/company_service_latest.d.ts +1 -1
  87. package/dist/types/data/job_posting_service_latest.d.cts +1 -1
  88. package/dist/types/data/job_posting_service_latest.d.ts +1 -1
  89. package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
  90. package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
  91. package/dist/types/index.d.cts +5 -5
  92. package/dist/types/index.d.ts +5 -5
  93. package/dist/types/latest/company_service_latest.d.cts +1 -1
  94. package/dist/types/latest/company_service_latest.d.ts +1 -1
  95. package/dist/types/latest/custom/company_service_sanity.d.cts +3 -3
  96. package/dist/types/latest/custom/company_service_sanity.d.ts +3 -3
  97. package/dist/types/latest/custom/job_posting_service_sanity.d.cts +3 -3
  98. package/dist/types/latest/custom/job_posting_service_sanity.d.ts +3 -3
  99. package/dist/types/latest/job_posting_service_latest.d.cts +1 -1
  100. package/dist/types/latest/job_posting_service_latest.d.ts +1 -1
  101. package/dist/types/latest/shared_pickle_output_latest.d.cts +1 -1
  102. package/dist/types/latest/shared_pickle_output_latest.d.ts +1 -1
  103. package/package.json +4 -3
  104. package/dist/{company_service_latest-o6X0atwz.d.cts → company_service_latest-C7Moeufo.d.cts} +228 -228
  105. package/dist/{company_service_latest-o6X0atwz.d.ts → company_service_latest-C7Moeufo.d.ts} +228 -228
  106. package/dist/{company_service_latest-DpBsftTD.d.cts → company_service_latest-CITz7F53.d.cts} +228 -228
  107. package/dist/{company_service_latest-DpBsftTD.d.ts → company_service_latest-CITz7F53.d.ts} +228 -228
  108. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.cts → shared_pickle_output_latest-CXBCG04N.d.cts} +15 -15
  109. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.ts → shared_pickle_output_latest-CXBCG04N.d.ts} +15 -15
  110. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.cts → shared_pickle_output_latest-CtvHTPeX.d.cts} +15 -15
  111. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.ts → shared_pickle_output_latest-CtvHTPeX.d.ts} +15 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/jobPost/JobHeader.tsx","../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx","../../../src/components/ui/Avatar.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Chip.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={name}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { X } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\n\nimport { Icon } from '@/components/ui/Icon'\nimport { useWindowHistory } from '@/hooks/useWindowHistory'\n\ninterface Props extends React.HTMLAttributes<HTMLButtonElement> {\n acceptedRoutes?: string[]\n fallbackHref?: string\n}\n\nexport function BackButton({ acceptedRoutes, fallbackHref, className, ...props }: Readonly<Props>) {\n const { history } = useWindowHistory()\n const router = useRouter()\n\n const isAcceptedRoute = (r: string) =>\n !!acceptedRoutes?.find((route) => new RegExp('^' + route + '$', 'i').test(new URL(r).pathname))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n if (history.length > 1 && isAcceptedRoute(previous)) {\n router.back()\n } else {\n router.push(fallbackHref ?? '/')\n }\n }\n\n return (\n <Icon\n aria-label=\"back button\"\n variant=\"transparent\"\n size=\"small\"\n onClick={goBack}\n className={className}\n {...props}\n >\n <X />\n </Icon>\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport { forwardRef } from 'react'\nimport { twMerge } from 'tailwind-merge'\n\nimport { cn } from '@/lib/utils'\n\ninterface IconProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof iconVariants> {\n active?: boolean\n readonly?: boolean\n}\n\nexport const Icon = forwardRef<HTMLButtonElement, IconProps>(\n ({ variant, size, active = false, readonly = false, className, ...props }, ref) => {\n const Component = readonly ? Slot : 'button'\n return (\n <Component\n className={cn(\n twMerge(iconVariants({ variant: active ? 'active' : variant, size })),\n className\n )}\n {...props}\n ref={ref}\n />\n )\n }\n)\n\nIcon.displayName = 'Icon'\n\nconst iconVariants = cva(\n [\n 'inline-flex',\n 'items-center',\n 'rounded-full',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n 'disabled:text-grey-40',\n 'disabled:bg-transparent',\n 'disabled:pointer-events-none',\n ],\n {\n variants: {\n variant: {\n filled: [\n 'border',\n 'border-green-80',\n 'bg-green-90',\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-80',\n 'focus:outline-pickle-100',\n 'disabled:bg-green-70',\n ],\n transparent: [\n 'text-black',\n 'hover:bg-grey-5',\n 'active:bg-grey-10',\n 'focus:outline-purple-100',\n ],\n tonal: [\n 'border',\n 'border-grey-5',\n 'hover:border-grey-10',\n 'active:border-grey-20',\n 'focus:outline-purple-100',\n ],\n active: ['text-black', 'bg-pickle-100'],\n },\n size: {\n small: ['h-10', 'w-10', 'p-3'],\n medium: ['h-12', 'w-12', 'p-4'],\n large: ['h-14', 'w-14', 'p-4'],\n },\n },\n defaultVariants: {\n variant: 'filled',\n size: 'medium',\n },\n }\n)\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { useContext } from 'react'\n\nimport {\n WindowHistoryContext,\n type WindowHistoryContextProps,\n} from '@/contexts/WindowHistoryProvider'\n\nexport function useWindowHistory(): WindowHistoryContextProps {\n const windowHistoryContext = useContext(WindowHistoryContext)\n\n return windowHistoryContext\n}\n","'use client'\n\nimport { useSearchParams } from 'next/navigation'\nimport { createContext, type PropsWithChildren, useEffect, useMemo, useState } from 'react'\n\nexport interface WindowHistoryContextProps {\n history: string[]\n}\n\nexport const WindowHistoryContext = createContext({} as WindowHistoryContextProps)\n\nexport function WindowHistoryProvider({ children }: Readonly<PropsWithChildren>) {\n const [history, setHistory] = useState<string[]>([])\n const searchParams = useSearchParams()\n\n useEffect(() => {\n setHistory((prev) =>\n prev.at(-1) === window.location.href ? prev : [...prev, window.location.href]\n )\n }, [searchParams])\n\n const contextValue = useMemo(() => ({ history }), [history])\n\n return (\n <WindowHistoryContext.Provider value={contextValue}>{children}</WindowHistoryContext.Provider>\n )\n}\n","import { cva, type VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { type ComponentProps } from 'react'\n\nimport { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\n\nexport type AvatarProps = VariantProps<typeof avatarVariants> &\n Omit<ComponentProps<'a'>, 'href'> & {\n src?: string\n href?: string\n name?: string\n }\n\nexport function Avatar({ size, src, href, name, ...linkProps }: AvatarProps) {\n const fallbackShort = name?.slice(0, 2)\n const fallbackWords = name\n ?.split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2)\n\n const fallback = fallbackWords && fallbackWords.length > 1 ? fallbackWords : fallbackShort\n\n const renderAvatar = () => (\n <AvatarBase className={avatarVariants({ size })}>\n <AvatarImage src={src} alt={name} />\n <AvatarFallback>{fallback?.toUpperCase()}</AvatarFallback>\n </AvatarBase>\n )\n\n if (href) {\n return (\n <Link href={href} {...linkProps}>\n {renderAvatar()}\n </Link>\n )\n }\n\n return renderAvatar()\n}\n\nexport const avatarVariants = cva('ring ring-white ring-2', {\n variants: {\n size: {\n large: 'h-16 w-16',\n medium: 'h-10 w-10',\n small: 'h-8 w-8',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n})\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/**\n * Adapted from Radix Primitives Avatar\n * https://ui.shadcn.com/docs/components/avatar\n * Changes made to support custom size prop and to export Avatar wrapper component\n */\n\nexport const AvatarBase = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatarBase.displayName = AvatarPrimitive.Root.displayName\n\nexport const AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n data-testid=\"job-card-avatar\"\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nexport const AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-pumpkin-100 py-2 text-sm font-bold capitalize leading-normal text-white md:text-lg',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","import {\n Banknote,\n Bell,\n BriefcaseBusiness,\n Building,\n Building2,\n CircleUser,\n CircleUserRound,\n Clock2,\n Contact,\n GalleryVerticalEnd,\n Home,\n KeyRound,\n Layers,\n LifeBuoy,\n MapPin,\n MessageSquareDot,\n Settings,\n SquareKanban,\n Users,\n Wallet,\n} from 'lucide-react'\n\nexport const iconMap = {\n house: Home,\n layers: Layers,\n users: Users,\n settings: Settings,\n building: Building,\n bell: Bell,\n wallet: Wallet,\n contact: Contact,\n banknote: Banknote,\n 'message-square-dot': MessageSquareDot,\n 'life-buoy': LifeBuoy,\n 'building-2': Building2,\n 'gallery-vertical-end': GalleryVerticalEnd,\n 'square-kanban': SquareKanban,\n 'briefcase-business': BriefcaseBusiness,\n 'circle-user': CircleUser,\n 'key-round': KeyRound,\n 'clock-2': Clock2,\n 'circle-user-round': CircleUserRound,\n 'map-pin': MapPin,\n} as const\n"],"mappings":"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","names":["import_lucide_react","import_navigation","import_tailwind_merge","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_cva","import_jsx_runtime","import_jsx_runtime","Link","import_cva","import_tailwind_merge","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Icon","Image"]}
1
+ {"version":3,"sources":["../../../src/components/jobPost/JobHeader.tsx","../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx","../../../src/components/ui/Avatar.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Chip.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={name}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { X } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\n\nimport { Icon } from '@/components/ui/Icon'\nimport { useWindowHistory } from '@/hooks/useWindowHistory'\n\ninterface Props extends React.HTMLAttributes<HTMLButtonElement> {\n acceptedRoutes?: string[]\n fallbackHref?: string\n}\n\nexport function BackButton({ acceptedRoutes, fallbackHref, className, ...props }: Readonly<Props>) {\n const { history } = useWindowHistory()\n const router = useRouter()\n\n const isAcceptedRoute = (r: string) =>\n !!acceptedRoutes?.find((route) => new RegExp('^' + route + '$', 'i').test(new URL(r).pathname))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n if (history.length > 1 && isAcceptedRoute(previous)) {\n router.back()\n } else {\n router.push(fallbackHref ?? '/')\n }\n }\n\n return (\n <Icon\n aria-label=\"back button\"\n variant=\"transparent\"\n size=\"small\"\n onClick={goBack}\n className={className}\n {...props}\n >\n <X />\n </Icon>\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport { forwardRef } from 'react'\nimport { twMerge } from 'tailwind-merge'\n\nimport { cn } from '@/lib/utils'\n\ninterface IconProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof iconVariants> {\n active?: boolean\n readonly?: boolean\n}\n\nexport const Icon = forwardRef<HTMLButtonElement, IconProps>(\n ({ variant, size, active = false, readonly = false, className, ...props }, ref) => {\n const Component = readonly ? Slot : 'button'\n return (\n <Component\n className={cn(\n twMerge(iconVariants({ variant: active ? 'active' : variant, size })),\n className\n )}\n {...props}\n ref={ref}\n />\n )\n }\n)\n\nIcon.displayName = 'Icon'\n\nconst iconVariants = cva(\n [\n 'inline-flex',\n 'items-center',\n 'rounded-full',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n 'disabled:text-grey-40',\n 'disabled:bg-transparent',\n 'disabled:pointer-events-none',\n ],\n {\n variants: {\n variant: {\n filled: [\n 'border',\n 'border-green-80',\n 'bg-green-90',\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-80',\n 'focus:outline-pickle-100',\n 'disabled:bg-green-70',\n ],\n transparent: [\n 'text-black',\n 'hover:bg-grey-5',\n 'active:bg-grey-10',\n 'focus:outline-purple-100',\n ],\n tonal: [\n 'border',\n 'border-grey-5',\n 'hover:border-grey-10',\n 'active:border-grey-20',\n 'focus:outline-purple-100',\n ],\n active: ['text-black', 'bg-pickle-100'],\n },\n size: {\n small: ['h-10', 'w-10', 'p-3'],\n medium: ['h-12', 'w-12', 'p-4'],\n large: ['h-14', 'w-14', 'p-4'],\n },\n },\n defaultVariants: {\n variant: 'filled',\n size: 'medium',\n },\n }\n)\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { useContext } from 'react'\n\nimport {\n WindowHistoryContext,\n type WindowHistoryContextProps,\n} from '@/contexts/WindowHistoryProvider'\n\nexport function useWindowHistory(): WindowHistoryContextProps {\n const windowHistoryContext = useContext(WindowHistoryContext)\n\n return windowHistoryContext\n}\n","'use client'\n\nimport { useSearchParams } from 'next/navigation'\nimport { createContext, type PropsWithChildren, useEffect, useMemo, useState } from 'react'\n\nexport interface WindowHistoryContextProps {\n history: string[]\n}\n\nexport const WindowHistoryContext = createContext({} as WindowHistoryContextProps)\n\nexport function WindowHistoryProvider({ children }: Readonly<PropsWithChildren>) {\n const [history, setHistory] = useState<string[]>([])\n const searchParams = useSearchParams()\n\n useEffect(() => {\n setHistory((prev) =>\n prev.at(-1) === window.location.href ? prev : [...prev, window.location.href]\n )\n }, [searchParams])\n\n const contextValue = useMemo(() => ({ history }), [history])\n\n return (\n <WindowHistoryContext.Provider value={contextValue}>{children}</WindowHistoryContext.Provider>\n )\n}\n","import { cva, type VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { type ComponentProps } from 'react'\n\nimport { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\n\nexport type AvatarProps = VariantProps<typeof avatarVariants> &\n Omit<ComponentProps<'a'>, 'href'> & {\n src?: string\n href?: string\n name?: string\n }\n\nexport function Avatar({ size, src, href, name, ...linkProps }: AvatarProps) {\n const fallbackShort = name?.slice(0, 2)\n const fallbackWords = name\n ?.split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2)\n\n const fallback = fallbackWords && fallbackWords.length > 1 ? fallbackWords : fallbackShort\n\n const renderAvatar = () => (\n <AvatarBase className={avatarVariants({ size })}>\n <AvatarImage src={src} alt={name} />\n <AvatarFallback>{fallback?.toUpperCase()}</AvatarFallback>\n </AvatarBase>\n )\n\n if (href) {\n return (\n <Link href={href} {...linkProps}>\n {renderAvatar()}\n </Link>\n )\n }\n\n return renderAvatar()\n}\n\nexport const avatarVariants = cva('ring ring-white ring-2', {\n variants: {\n size: {\n large: 'h-16 w-16',\n medium: 'h-10 w-10',\n small: 'h-8 w-8',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n})\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/**\n * Adapted from Radix Primitives Avatar\n * https://ui.shadcn.com/docs/components/avatar\n * Changes made to support custom size prop and to export Avatar wrapper component\n */\n\nexport const AvatarBase = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatarBase.displayName = AvatarPrimitive.Root.displayName\n\nexport const AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n data-testid=\"job-card-avatar\"\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nexport const AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-pumpkin-100 py-2 text-sm font-bold capitalize leading-normal text-white md:text-lg',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n jobLocation: ['text-grey-80', 'border-grey-10', 'bg-grey-5'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","import {\n Banknote,\n Bell,\n BriefcaseBusiness,\n Building,\n Building2,\n CircleUser,\n CircleUserRound,\n Clock2,\n Contact,\n GalleryVerticalEnd,\n Home,\n KeyRound,\n Layers,\n LifeBuoy,\n MapPin,\n MessageSquareDot,\n Settings,\n SquareKanban,\n Users,\n Wallet,\n} from 'lucide-react'\n\nexport const iconMap = {\n house: Home,\n layers: Layers,\n users: Users,\n settings: Settings,\n building: Building,\n bell: Bell,\n wallet: Wallet,\n contact: Contact,\n banknote: Banknote,\n 'message-square-dot': MessageSquareDot,\n 'life-buoy': LifeBuoy,\n 'building-2': Building2,\n 'gallery-vertical-end': GalleryVerticalEnd,\n 'square-kanban': SquareKanban,\n 'briefcase-business': BriefcaseBusiness,\n 'circle-user': CircleUser,\n 'key-round': KeyRound,\n 'clock-2': Clock2,\n 'circle-user-round': CircleUserRound,\n 'map-pin': MapPin,\n} as const\n"],"mappings":"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","names":["import_lucide_react","import_navigation","import_tailwind_merge","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_cva","import_jsx_runtime","import_jsx_runtime","Link","import_cva","import_tailwind_merge","import_jsx_runtime","import_lucide_react","import_jsx_runtime","Icon","Image"]}
@@ -216,6 +216,7 @@ var chipVariants = cva3(["flex", "items-center", "rounded-3xl", "border", "w-fit
216
216
  neutral: ["text-grey-80", "border-grey-10"],
217
217
  primary: ["text-purple-100", "border-purple-20"],
218
218
  danger: ["text-pumpkin-100", "border-pumpkin-20"],
219
+ jobLocation: ["text-grey-80", "border-grey-10", "bg-grey-5"],
219
220
  onboarding: ["text-green-100", "bg-green-10", "cursor-pointer"],
220
221
  onboardingSelected: ["text-white", "bg-green-90", "cursor-pointer"]
221
222
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/jobPost/JobHeader.tsx","../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx","../../../src/components/ui/Avatar.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Chip.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={name}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { X } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\n\nimport { Icon } from '@/components/ui/Icon'\nimport { useWindowHistory } from '@/hooks/useWindowHistory'\n\ninterface Props extends React.HTMLAttributes<HTMLButtonElement> {\n acceptedRoutes?: string[]\n fallbackHref?: string\n}\n\nexport function BackButton({ acceptedRoutes, fallbackHref, className, ...props }: Readonly<Props>) {\n const { history } = useWindowHistory()\n const router = useRouter()\n\n const isAcceptedRoute = (r: string) =>\n !!acceptedRoutes?.find((route) => new RegExp('^' + route + '$', 'i').test(new URL(r).pathname))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n if (history.length > 1 && isAcceptedRoute(previous)) {\n router.back()\n } else {\n router.push(fallbackHref ?? '/')\n }\n }\n\n return (\n <Icon\n aria-label=\"back button\"\n variant=\"transparent\"\n size=\"small\"\n onClick={goBack}\n className={className}\n {...props}\n >\n <X />\n </Icon>\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport { forwardRef } from 'react'\nimport { twMerge } from 'tailwind-merge'\n\nimport { cn } from '@/lib/utils'\n\ninterface IconProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof iconVariants> {\n active?: boolean\n readonly?: boolean\n}\n\nexport const Icon = forwardRef<HTMLButtonElement, IconProps>(\n ({ variant, size, active = false, readonly = false, className, ...props }, ref) => {\n const Component = readonly ? Slot : 'button'\n return (\n <Component\n className={cn(\n twMerge(iconVariants({ variant: active ? 'active' : variant, size })),\n className\n )}\n {...props}\n ref={ref}\n />\n )\n }\n)\n\nIcon.displayName = 'Icon'\n\nconst iconVariants = cva(\n [\n 'inline-flex',\n 'items-center',\n 'rounded-full',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n 'disabled:text-grey-40',\n 'disabled:bg-transparent',\n 'disabled:pointer-events-none',\n ],\n {\n variants: {\n variant: {\n filled: [\n 'border',\n 'border-green-80',\n 'bg-green-90',\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-80',\n 'focus:outline-pickle-100',\n 'disabled:bg-green-70',\n ],\n transparent: [\n 'text-black',\n 'hover:bg-grey-5',\n 'active:bg-grey-10',\n 'focus:outline-purple-100',\n ],\n tonal: [\n 'border',\n 'border-grey-5',\n 'hover:border-grey-10',\n 'active:border-grey-20',\n 'focus:outline-purple-100',\n ],\n active: ['text-black', 'bg-pickle-100'],\n },\n size: {\n small: ['h-10', 'w-10', 'p-3'],\n medium: ['h-12', 'w-12', 'p-4'],\n large: ['h-14', 'w-14', 'p-4'],\n },\n },\n defaultVariants: {\n variant: 'filled',\n size: 'medium',\n },\n }\n)\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { useContext } from 'react'\n\nimport {\n WindowHistoryContext,\n type WindowHistoryContextProps,\n} from '@/contexts/WindowHistoryProvider'\n\nexport function useWindowHistory(): WindowHistoryContextProps {\n const windowHistoryContext = useContext(WindowHistoryContext)\n\n return windowHistoryContext\n}\n","'use client'\n\nimport { useSearchParams } from 'next/navigation'\nimport { createContext, type PropsWithChildren, useEffect, useMemo, useState } from 'react'\n\nexport interface WindowHistoryContextProps {\n history: string[]\n}\n\nexport const WindowHistoryContext = createContext({} as WindowHistoryContextProps)\n\nexport function WindowHistoryProvider({ children }: Readonly<PropsWithChildren>) {\n const [history, setHistory] = useState<string[]>([])\n const searchParams = useSearchParams()\n\n useEffect(() => {\n setHistory((prev) =>\n prev.at(-1) === window.location.href ? prev : [...prev, window.location.href]\n )\n }, [searchParams])\n\n const contextValue = useMemo(() => ({ history }), [history])\n\n return (\n <WindowHistoryContext.Provider value={contextValue}>{children}</WindowHistoryContext.Provider>\n )\n}\n","import { cva, type VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { type ComponentProps } from 'react'\n\nimport { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\n\nexport type AvatarProps = VariantProps<typeof avatarVariants> &\n Omit<ComponentProps<'a'>, 'href'> & {\n src?: string\n href?: string\n name?: string\n }\n\nexport function Avatar({ size, src, href, name, ...linkProps }: AvatarProps) {\n const fallbackShort = name?.slice(0, 2)\n const fallbackWords = name\n ?.split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2)\n\n const fallback = fallbackWords && fallbackWords.length > 1 ? fallbackWords : fallbackShort\n\n const renderAvatar = () => (\n <AvatarBase className={avatarVariants({ size })}>\n <AvatarImage src={src} alt={name} />\n <AvatarFallback>{fallback?.toUpperCase()}</AvatarFallback>\n </AvatarBase>\n )\n\n if (href) {\n return (\n <Link href={href} {...linkProps}>\n {renderAvatar()}\n </Link>\n )\n }\n\n return renderAvatar()\n}\n\nexport const avatarVariants = cva('ring ring-white ring-2', {\n variants: {\n size: {\n large: 'h-16 w-16',\n medium: 'h-10 w-10',\n small: 'h-8 w-8',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n})\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/**\n * Adapted from Radix Primitives Avatar\n * https://ui.shadcn.com/docs/components/avatar\n * Changes made to support custom size prop and to export Avatar wrapper component\n */\n\nexport const AvatarBase = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatarBase.displayName = AvatarPrimitive.Root.displayName\n\nexport const AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n data-testid=\"job-card-avatar\"\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nexport const AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-pumpkin-100 py-2 text-sm font-bold capitalize leading-normal text-white md:text-lg',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","import {\n Banknote,\n Bell,\n BriefcaseBusiness,\n Building,\n Building2,\n CircleUser,\n CircleUserRound,\n Clock2,\n Contact,\n GalleryVerticalEnd,\n Home,\n KeyRound,\n Layers,\n LifeBuoy,\n MapPin,\n MessageSquareDot,\n Settings,\n SquareKanban,\n Users,\n Wallet,\n} from 'lucide-react'\n\nexport const iconMap = {\n house: Home,\n layers: Layers,\n users: Users,\n settings: Settings,\n building: Building,\n bell: Bell,\n wallet: Wallet,\n contact: Contact,\n banknote: Banknote,\n 'message-square-dot': MessageSquareDot,\n 'life-buoy': LifeBuoy,\n 'building-2': Building2,\n 'gallery-vertical-end': GalleryVerticalEnd,\n 'square-kanban': SquareKanban,\n 'briefcase-business': BriefcaseBusiness,\n 'circle-user': CircleUser,\n 'key-round': KeyRound,\n 'clock-2': Clock2,\n 'circle-user-round': CircleUserRound,\n 'map-pin': MapPin,\n} as const\n"],"mappings":"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","names":["Image","twMerge","twMerge","jsx","jsx","cva","jsx","jsx","cva","cva","twMerge","jsx","jsx","jsxs","Icon","Image"]}
1
+ {"version":3,"sources":["../../../src/components/jobPost/JobHeader.tsx","../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx","../../../src/components/ui/Avatar.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Chip.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={name}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { X } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\n\nimport { Icon } from '@/components/ui/Icon'\nimport { useWindowHistory } from '@/hooks/useWindowHistory'\n\ninterface Props extends React.HTMLAttributes<HTMLButtonElement> {\n acceptedRoutes?: string[]\n fallbackHref?: string\n}\n\nexport function BackButton({ acceptedRoutes, fallbackHref, className, ...props }: Readonly<Props>) {\n const { history } = useWindowHistory()\n const router = useRouter()\n\n const isAcceptedRoute = (r: string) =>\n !!acceptedRoutes?.find((route) => new RegExp('^' + route + '$', 'i').test(new URL(r).pathname))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n if (history.length > 1 && isAcceptedRoute(previous)) {\n router.back()\n } else {\n router.push(fallbackHref ?? '/')\n }\n }\n\n return (\n <Icon\n aria-label=\"back button\"\n variant=\"transparent\"\n size=\"small\"\n onClick={goBack}\n className={className}\n {...props}\n >\n <X />\n </Icon>\n )\n}\n","import { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport { forwardRef } from 'react'\nimport { twMerge } from 'tailwind-merge'\n\nimport { cn } from '@/lib/utils'\n\ninterface IconProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof iconVariants> {\n active?: boolean\n readonly?: boolean\n}\n\nexport const Icon = forwardRef<HTMLButtonElement, IconProps>(\n ({ variant, size, active = false, readonly = false, className, ...props }, ref) => {\n const Component = readonly ? Slot : 'button'\n return (\n <Component\n className={cn(\n twMerge(iconVariants({ variant: active ? 'active' : variant, size })),\n className\n )}\n {...props}\n ref={ref}\n />\n )\n }\n)\n\nIcon.displayName = 'Icon'\n\nconst iconVariants = cva(\n [\n 'inline-flex',\n 'items-center',\n 'rounded-full',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n 'disabled:text-grey-40',\n 'disabled:bg-transparent',\n 'disabled:pointer-events-none',\n ],\n {\n variants: {\n variant: {\n filled: [\n 'border',\n 'border-green-80',\n 'bg-green-90',\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-80',\n 'focus:outline-pickle-100',\n 'disabled:bg-green-70',\n ],\n transparent: [\n 'text-black',\n 'hover:bg-grey-5',\n 'active:bg-grey-10',\n 'focus:outline-purple-100',\n ],\n tonal: [\n 'border',\n 'border-grey-5',\n 'hover:border-grey-10',\n 'active:border-grey-20',\n 'focus:outline-purple-100',\n ],\n active: ['text-black', 'bg-pickle-100'],\n },\n size: {\n small: ['h-10', 'w-10', 'p-3'],\n medium: ['h-12', 'w-12', 'p-4'],\n large: ['h-14', 'w-14', 'p-4'],\n },\n },\n defaultVariants: {\n variant: 'filled',\n size: 'medium',\n },\n }\n)\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { useContext } from 'react'\n\nimport {\n WindowHistoryContext,\n type WindowHistoryContextProps,\n} from '@/contexts/WindowHistoryProvider'\n\nexport function useWindowHistory(): WindowHistoryContextProps {\n const windowHistoryContext = useContext(WindowHistoryContext)\n\n return windowHistoryContext\n}\n","'use client'\n\nimport { useSearchParams } from 'next/navigation'\nimport { createContext, type PropsWithChildren, useEffect, useMemo, useState } from 'react'\n\nexport interface WindowHistoryContextProps {\n history: string[]\n}\n\nexport const WindowHistoryContext = createContext({} as WindowHistoryContextProps)\n\nexport function WindowHistoryProvider({ children }: Readonly<PropsWithChildren>) {\n const [history, setHistory] = useState<string[]>([])\n const searchParams = useSearchParams()\n\n useEffect(() => {\n setHistory((prev) =>\n prev.at(-1) === window.location.href ? prev : [...prev, window.location.href]\n )\n }, [searchParams])\n\n const contextValue = useMemo(() => ({ history }), [history])\n\n return (\n <WindowHistoryContext.Provider value={contextValue}>{children}</WindowHistoryContext.Provider>\n )\n}\n","import { cva, type VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { type ComponentProps } from 'react'\n\nimport { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\n\nexport type AvatarProps = VariantProps<typeof avatarVariants> &\n Omit<ComponentProps<'a'>, 'href'> & {\n src?: string\n href?: string\n name?: string\n }\n\nexport function Avatar({ size, src, href, name, ...linkProps }: AvatarProps) {\n const fallbackShort = name?.slice(0, 2)\n const fallbackWords = name\n ?.split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2)\n\n const fallback = fallbackWords && fallbackWords.length > 1 ? fallbackWords : fallbackShort\n\n const renderAvatar = () => (\n <AvatarBase className={avatarVariants({ size })}>\n <AvatarImage src={src} alt={name} />\n <AvatarFallback>{fallback?.toUpperCase()}</AvatarFallback>\n </AvatarBase>\n )\n\n if (href) {\n return (\n <Link href={href} {...linkProps}>\n {renderAvatar()}\n </Link>\n )\n }\n\n return renderAvatar()\n}\n\nexport const avatarVariants = cva('ring ring-white ring-2', {\n variants: {\n size: {\n large: 'h-16 w-16',\n medium: 'h-10 w-10',\n small: 'h-8 w-8',\n },\n },\n defaultVariants: {\n size: 'medium',\n },\n})\n","'use client'\n\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/**\n * Adapted from Radix Primitives Avatar\n * https://ui.shadcn.com/docs/components/avatar\n * Changes made to support custom size prop and to export Avatar wrapper component\n */\n\nexport const AvatarBase = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatarBase.displayName = AvatarPrimitive.Root.displayName\n\nexport const AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n data-testid=\"job-card-avatar\"\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nexport const AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-pumpkin-100 py-2 text-sm font-bold capitalize leading-normal text-white md:text-lg',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n","import { cva, type VariantProps } from 'cva'\nimport React from 'react'\nimport { twMerge } from 'tailwind-merge'\n\ninterface ChipProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof chipVariants> {}\n\nconst Chip = ({ className, variant, size, ...props }: ChipProps) => (\n <div className={twMerge(chipVariants({ variant, size, className }))} {...props} />\n)\n\nconst chipVariants = cva(['flex', 'items-center', 'rounded-3xl', 'border', 'w-fit'], {\n variants: {\n variant: {\n neutral: ['text-grey-80', 'border-grey-10'],\n primary: ['text-purple-100', 'border-purple-20'],\n danger: ['text-pumpkin-100', 'border-pumpkin-20'],\n jobLocation: ['text-grey-80', 'border-grey-10', 'bg-grey-5'],\n onboarding: ['text-green-100', 'bg-green-10', 'cursor-pointer'],\n onboardingSelected: ['text-white', 'bg-green-90', 'cursor-pointer'],\n },\n size: {\n small: ['text-sm', 'leading-5', 'px-2', 'py-1', 'gap-1.5'],\n medium: ['text-base', 'leading-6', 'px-3', 'py-2', 'gap-2'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n})\n\nexport default Chip\n","import {\n Banknote,\n Bell,\n BriefcaseBusiness,\n Building,\n Building2,\n CircleUser,\n CircleUserRound,\n Clock2,\n Contact,\n GalleryVerticalEnd,\n Home,\n KeyRound,\n Layers,\n LifeBuoy,\n MapPin,\n MessageSquareDot,\n Settings,\n SquareKanban,\n Users,\n Wallet,\n} from 'lucide-react'\n\nexport const iconMap = {\n house: Home,\n layers: Layers,\n users: Users,\n settings: Settings,\n building: Building,\n bell: Bell,\n wallet: Wallet,\n contact: Contact,\n banknote: Banknote,\n 'message-square-dot': MessageSquareDot,\n 'life-buoy': LifeBuoy,\n 'building-2': Building2,\n 'gallery-vertical-end': GalleryVerticalEnd,\n 'square-kanban': SquareKanban,\n 'briefcase-business': BriefcaseBusiness,\n 'circle-user': CircleUser,\n 'key-round': KeyRound,\n 'clock-2': Clock2,\n 'circle-user-round': CircleUserRound,\n 'map-pin': MapPin,\n} as const\n"],"mappings":"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","names":["Image","twMerge","twMerge","jsx","jsx","cva","jsx","jsx","cva","cva","twMerge","jsx","jsx","jsxs","Icon","Image"]}
@@ -338,6 +338,7 @@ var import_jsx_runtime8 = require("react/jsx-runtime");
338
338
  function ReadMore({ text, ...props }) {
339
339
  const [isExpanded, setIsExpanded] = (0, import_react2.useState)(false);
340
340
  const [maxWords, setMaxWords] = (0, import_react2.useState)(160);
341
+ const isOverMaxWords = text.split(" ").length > maxWords;
341
342
  (0, import_react2.useEffect)(() => {
342
343
  const updateMaxWords = () => {
343
344
  const windowWidth = window.innerWidth;
@@ -352,6 +353,7 @@ function ReadMore({ text, ...props }) {
352
353
  return () => window.removeEventListener("resize", updateMaxWords);
353
354
  }, []);
354
355
  function createReadMoreText(text2, maxWords2, isExpanded2) {
356
+ if (!isOverMaxWords) return text2;
355
357
  const words = text2.split(" ");
356
358
  const snippet2 = isExpanded2 ? text2 : words.slice(0, maxWords2).join(" ");
357
359
  const readMoreText = isExpanded2 ? "" : "...";
@@ -361,7 +363,7 @@ function ReadMore({ text, ...props }) {
361
363
  const snippet = createReadMoreText(text, maxWords, isExpanded);
362
364
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { ...props, children: [
363
365
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { "data-testid": "read-more-text", className: "prose lg:prose-lg", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_markdown.default, { children: snippet }) }),
364
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
366
+ isOverMaxWords && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
365
367
  Button,
366
368
  {
367
369
  type: "button",
@@ -526,6 +528,7 @@ var chipVariants = (0, import_cva4.cva)(["flex", "items-center", "rounded-3xl",
526
528
  neutral: ["text-grey-80", "border-grey-10"],
527
529
  primary: ["text-purple-100", "border-purple-20"],
528
530
  danger: ["text-pumpkin-100", "border-pumpkin-20"],
531
+ jobLocation: ["text-grey-80", "border-grey-10", "bg-grey-5"],
529
532
  onboarding: ["text-green-100", "bg-green-10", "cursor-pointer"],
530
533
  onboardingSelected: ["text-white", "bg-green-90", "cursor-pointer"]
531
534
  },
@@ -1185,12 +1188,15 @@ var useDisplayText = (scope, value) => {
1185
1188
  };
1186
1189
 
1187
1190
  // src/lib/locations.ts
1188
- function formattedAddress(address) {
1191
+ function formattedAddress(address, isRemote = false) {
1192
+ if (!address) return null;
1189
1193
  const { addressLocality, addressRegion, addressCountry } = address;
1190
- if (addressLocality && addressRegion) return `${addressLocality}, ${addressRegion}`;
1191
- if (addressRegion && addressCountry) return `${addressRegion}, ${addressCountry}`;
1192
- if (addressRegion) return addressRegion;
1193
- if (addressCountry) return addressCountry;
1194
+ const remoteMessage = isRemote ? " | Remote" : "";
1195
+ if (addressLocality && addressRegion)
1196
+ return `${addressLocality}, ${addressRegion + remoteMessage}`;
1197
+ if (addressRegion && addressCountry) return `${addressRegion}, ${addressCountry + remoteMessage}`;
1198
+ if (addressRegion) return `${addressRegion + remoteMessage}`;
1199
+ if (addressCountry) return `${addressCountry + remoteMessage}`;
1194
1200
  return null;
1195
1201
  }
1196
1202
  function formattedJobLocation(job) {
@@ -1593,7 +1599,7 @@ var jobPostSchema2 = jobPostSchema.extend({
1593
1599
 
1594
1600
  // src/lib/salaryRange.ts
1595
1601
  var CurrencyEnum2 = shared_pickle_output_latest_exports.CurrencyEnum;
1596
- function salaryRange(salary) {
1602
+ function salaryRange(salary, showUnitText = true) {
1597
1603
  if (!salary) return null;
1598
1604
  let min = salary.minValue;
1599
1605
  let max = salary.maxValue;
@@ -1612,17 +1618,19 @@ function salaryRange(salary) {
1612
1618
  single = value.value;
1613
1619
  unitText = value.unitText;
1614
1620
  }
1615
- if (unitText === "YEAR") unitText = "per year";
1616
- if (unitText === "MONTH") unitText = "per month";
1617
- if (unitText === "WEEK") unitText = "per week";
1618
- if (unitText === "DAY") unitText = "per day";
1619
- if (unitText === "PER_ACTIVITY") unitText = "per activity";
1620
- if (unitText === "HOUR") unitText = "per hour";
1621
- if (min == null && max == null && single == null) return null;
1622
- if (single != null) return sign + single.toLocaleString() + " " + unitText;
1623
- if (min === max) return sign + min?.toLocaleString() + " " + unitText;
1624
- if (min != null && max != null)
1625
- return sign + min?.toLocaleString() + " - " + sign + max?.toLocaleString() + " " + unitText;
1621
+ if (unitText === "YEAR") unitText = " per year";
1622
+ if (unitText === "MONTH") unitText = " per month";
1623
+ if (unitText === "WEEK") unitText = " per week";
1624
+ if (unitText === "DAY") unitText = " per day";
1625
+ if (unitText === "PER_ACTIVITY") unitText = " per activity";
1626
+ if (unitText === "HOUR") unitText = " per hour";
1627
+ if (showUnitText === false) unitText = "";
1628
+ const isValid = (v) => v != null && v >= 0;
1629
+ if (!isValid(min) && !isValid(max) && !isValid(single)) return null;
1630
+ if (isValid(single)) return sign + single.toLocaleString() + unitText;
1631
+ if (min === max) return sign + min?.toLocaleString() + unitText;
1632
+ if (isValid(min) && isValid(max))
1633
+ return sign + min?.toLocaleString() + " - " + sign + max?.toLocaleString() + unitText;
1626
1634
  return null;
1627
1635
  }
1628
1636