@next-degree/pickle-shared-js 0.12.4 → 0.12.6

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 (65) hide show
  1. package/dist/{company_service_sanity-Br0R7m-A.d.cts → company_service_sanity-2J1ZuUnu.d.cts} +1 -1
  2. package/dist/{company_service_sanity-DF01qvTz.d.ts → company_service_sanity-KaAGfnNV.d.ts} +1 -1
  3. package/dist/components/jobCard/JobLocation.d.cts +1 -1
  4. package/dist/components/jobCard/JobLocation.d.ts +1 -1
  5. package/dist/components/jobPost/JobHeader.cjs +1 -1
  6. package/dist/components/jobPost/JobHeader.cjs.map +1 -1
  7. package/dist/components/jobPost/JobHeader.js +1 -1
  8. package/dist/components/jobPost/JobHeader.js.map +1 -1
  9. package/dist/components/jobPost/JobPost.cjs +24 -9
  10. package/dist/components/jobPost/JobPost.cjs.map +1 -1
  11. package/dist/components/jobPost/JobPost.d.cts +1 -1
  12. package/dist/components/jobPost/JobPost.d.ts +1 -1
  13. package/dist/components/jobPost/JobPost.js +24 -9
  14. package/dist/components/jobPost/JobPost.js.map +1 -1
  15. package/dist/components/primitives/command.d.cts +3 -3
  16. package/dist/components/primitives/command.d.ts +3 -3
  17. package/dist/components/primitives/input-otp.d.cts +2 -2
  18. package/dist/components/primitives/input-otp.d.ts +2 -2
  19. package/dist/components/ui/Button.d.cts +1 -1
  20. package/dist/components/ui/Button.d.ts +1 -1
  21. package/dist/components/ui/buttonShadcn.d.cts +1 -1
  22. package/dist/components/ui/buttonShadcn.d.ts +1 -1
  23. package/dist/{displayText-BDPndCI9.d.cts → displayText-DW0qiJqh.d.cts} +2 -2
  24. package/dist/{displayText-EpnIpZ38.d.ts → displayText-DahwdHdi.d.ts} +2 -2
  25. package/dist/hooks/useDisplayText.d.cts +3 -3
  26. package/dist/hooks/useDisplayText.d.ts +3 -3
  27. package/dist/index.cjs +5 -10
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +5 -5
  30. package/dist/index.d.ts +5 -5
  31. package/dist/index.js +5 -10
  32. package/dist/index.js.map +1 -1
  33. package/dist/{job_posting_service_sanity-BNQsNQs2.d.ts → job_posting_service_sanity-BKo9TBDT.d.ts} +40 -40
  34. package/dist/{job_posting_service_sanity-BN7XcVxU.d.cts → job_posting_service_sanity-BNq-Am9N.d.cts} +40 -40
  35. package/dist/lib/locations.d.cts +3 -3
  36. package/dist/lib/locations.d.ts +3 -3
  37. package/dist/lib/mappings.d.cts +3 -3
  38. package/dist/lib/mappings.d.ts +3 -3
  39. package/dist/lib/salaryRange.d.cts +1 -1
  40. package/dist/lib/salaryRange.d.ts +1 -1
  41. package/dist/services/displayText.d.cts +3 -3
  42. package/dist/services/displayText.d.ts +3 -3
  43. package/dist/types/data/job_posting_service_latest.d.cts +1 -1
  44. package/dist/types/data/job_posting_service_latest.d.ts +1 -1
  45. package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
  46. package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
  47. package/dist/types/index.d.cts +4 -4
  48. package/dist/types/index.d.ts +4 -4
  49. package/dist/types/latest/custom/company_service_sanity.d.cts +2 -2
  50. package/dist/types/latest/custom/company_service_sanity.d.ts +2 -2
  51. package/dist/types/latest/custom/job_posting_service_sanity.d.cts +3 -3
  52. package/dist/types/latest/custom/job_posting_service_sanity.d.ts +3 -3
  53. package/dist/types/latest/job_posting_service_latest.d.cts +1 -1
  54. package/dist/types/latest/job_posting_service_latest.d.ts +1 -1
  55. package/dist/types/latest/shared_pickle_output_latest.d.cts +1 -1
  56. package/dist/types/latest/shared_pickle_output_latest.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/dist/{job_posting_service_latest-B6Trs6sX.d.cts → job_posting_service_latest-C_TEBzCf.d.cts} +7 -7
  59. package/dist/{job_posting_service_latest-B6Trs6sX.d.ts → job_posting_service_latest-C_TEBzCf.d.ts} +7 -7
  60. package/dist/{job_posting_service_latest-BKz5U2Gp.d.cts → job_posting_service_latest-DdgK8Nnz.d.cts} +7 -7
  61. package/dist/{job_posting_service_latest-BKz5U2Gp.d.ts → job_posting_service_latest-DdgK8Nnz.d.ts} +7 -7
  62. package/dist/{shared_pickle_output_latest-DKOmTyYk.d.cts → shared_pickle_output_latest-CXBCG04N.d.cts} +4 -4
  63. package/dist/{shared_pickle_output_latest-DKOmTyYk.d.ts → shared_pickle_output_latest-CXBCG04N.d.ts} +4 -4
  64. package/dist/{shared_pickle_output_latest--XZhOUyE.d.cts → shared_pickle_output_latest-CtvHTPeX.d.cts} +4 -4
  65. package/dist/{shared_pickle_output_latest--XZhOUyE.d.ts → shared_pickle_output_latest-CtvHTPeX.d.ts} +4 -4
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { O as OfficeTypeEnum, P as PublishStatusEnum, T as TitleEnum, i as industrySchema, o as officeSchema, s as socialMediaSchema } from './company_service_latest-C7Moeufo.cjs';
3
- import { i as imageSchema } from './shared_pickle_output_latest--XZhOUyE.cjs';
3
+ import { i as imageSchema } from './shared_pickle_output_latest-CtvHTPeX.cjs';
4
4
 
5
5
  declare const foundingInformationSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<Omit<z.objectUtil.extendShape<{
6
6
  version: z.ZodDefault<z.ZodLiteral<"1.0.0">>;
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { O as OfficeTypeEnum, P as PublishStatusEnum, T as TitleEnum, i as industrySchema, o as officeSchema, s as socialMediaSchema } from './company_service_latest-C7Moeufo.js';
3
- import { i as imageSchema } from './shared_pickle_output_latest--XZhOUyE.js';
3
+ import { i as imageSchema } from './shared_pickle_output_latest-CtvHTPeX.js';
4
4
 
5
5
  declare const foundingInformationSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<Omit<z.objectUtil.extendShape<{
6
6
  version: z.ZodDefault<z.ZodLiteral<"1.0.0">>;
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { z } from 'zod';
3
- import { a as jobPostSchema } from '../../job_posting_service_latest-BKz5U2Gp.cjs';
3
+ import { a as jobPostSchema } from '../../job_posting_service_latest-DdgK8Nnz.cjs';
4
4
 
5
5
  type JobPost = z.infer<typeof jobPostSchema>;
6
6
  type JobLocationProps = {
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { z } from 'zod';
3
- import { a as jobPostSchema } from '../../job_posting_service_latest-BKz5U2Gp.js';
3
+ import { a as jobPostSchema } from '../../job_posting_service_latest-DdgK8Nnz.js';
4
4
 
5
5
  type JobPost = z.infer<typeof jobPostSchema>;
6
6
  type JobLocationProps = {
@@ -424,7 +424,7 @@ function JobHeader({
424
424
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: label })
425
425
  ]
426
426
  },
427
- name
427
+ `${name}-${label}`
428
428
  ))
429
429
  }
430
430
  )
@@ -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 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"]}
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}-${label}`}\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"]}
@@ -412,7 +412,7 @@ function JobHeader({
412
412
  /* @__PURE__ */ jsx7("span", { children: label })
413
413
  ]
414
414
  },
415
- name
415
+ `${name}-${label}`
416
416
  ))
417
417
  }
418
418
  )
@@ -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 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"]}
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}-${label}`}\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"]}
@@ -703,7 +703,7 @@ function JobHeader({
703
703
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: label })
704
704
  ]
705
705
  },
706
- name
706
+ `${name}-${label}`
707
707
  ))
708
708
  }
709
709
  )
@@ -1199,10 +1199,25 @@ function formattedAddress(address, isRemote = false) {
1199
1199
  if (addressCountry) return `${addressCountry + remoteMessage}`;
1200
1200
  return null;
1201
1201
  }
1202
- function formattedJobLocation(job) {
1203
- const address = job.jobLocation && formattedAddress(job.jobLocation);
1204
- const remote = job.isRemote ? "Remote" : "";
1205
- return [address, remote].filter(Boolean).join(" | ");
1202
+ function getAddressList(jobPost) {
1203
+ const locations = [];
1204
+ if (jobPost.jobLocation) {
1205
+ const address = formattedAddress(jobPost.jobLocation, jobPost.isRemote);
1206
+ if (address) locations.push(address);
1207
+ }
1208
+ if (jobPost.applicableOffices && jobPost.applicableOffices.length > 0) {
1209
+ jobPost.applicableOffices.map((office) => {
1210
+ const address = formattedAddress(office?.geoLocation?.address, jobPost.isRemote);
1211
+ if (address && !locations.includes(address)) locations.push(address);
1212
+ });
1213
+ }
1214
+ if (jobPost.applicantLocationRequirements && jobPost.applicantLocationRequirements.length > 0) {
1215
+ jobPost.applicantLocationRequirements.map((place) => {
1216
+ const address = formattedAddress(place?.address, jobPost.isRemote);
1217
+ if (address && !locations.includes(address)) locations.push(address);
1218
+ });
1219
+ }
1220
+ return locations;
1206
1221
  }
1207
1222
 
1208
1223
  // src/types/latest/company_service_latest.ts
@@ -1649,7 +1664,7 @@ function JobPost({
1649
1664
  const formattedEmploymentType = useDisplayText("employmentType", job.employmentType);
1650
1665
  const formattedEmploymentLevel = useDisplayText("employmentLevel", job.employmentLevel);
1651
1666
  const formattedJobFunction = useDisplayText("jobFunction", job.jobFunction);
1652
- const formattedLocation = formattedJobLocation(job);
1667
+ const formattedLocations = getAddressList(job);
1653
1668
  const formattedSalary = salaryRange(job.estimatedSalary);
1654
1669
  const formattedDate = DateFns.formatDistanceToNow(new Date(job.datePosted), {
1655
1670
  addSuffix: true
@@ -1675,11 +1690,11 @@ function JobPost({
1675
1690
  name: "jobFunction",
1676
1691
  label: formattedJobFunction
1677
1692
  },
1678
- !!formattedLocation && {
1693
+ ...formattedLocations.map((label) => ({
1679
1694
  icon: "map-pin",
1680
1695
  name: "location",
1681
- label: formattedLocation
1682
- }
1696
+ label
1697
+ }))
1683
1698
  ].filter((t) => !!t);
1684
1699
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1685
1700
  "div",