@next-degree/pickle-shared-js 0.6.45 → 0.6.47
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.
- package/dist/{company_service_latest-DQ5joNqO.d.cts → company_service_latest-uu3w8AR6.d.cts} +305 -1907
- package/dist/{company_service_latest-DQ5joNqO.d.ts → company_service_latest-uu3w8AR6.d.ts} +305 -1907
- package/dist/components/buttons/BackButton.cjs +0 -3
- package/dist/components/buttons/BackButton.cjs.map +1 -1
- package/dist/components/buttons/BackButton.js +0 -3
- package/dist/components/buttons/BackButton.js.map +1 -1
- package/dist/components/company/CompanyTake.cjs.map +1 -1
- package/dist/components/company/CompanyTake.js.map +1 -1
- package/dist/components/jobPost/JobDescription.cjs.map +1 -1
- package/dist/components/jobPost/JobDescription.js.map +1 -1
- package/dist/components/jobPost/JobHeader.cjs +0 -3
- package/dist/components/jobPost/JobHeader.cjs.map +1 -1
- package/dist/components/jobPost/JobHeader.js +0 -3
- package/dist/components/jobPost/JobHeader.js.map +1 -1
- package/dist/components/jobPost/JobPost.cjs +6 -31
- package/dist/components/jobPost/JobPost.cjs.map +1 -1
- package/dist/components/jobPost/JobPost.d.cts +1 -1
- package/dist/components/jobPost/JobPost.d.ts +1 -1
- package/dist/components/jobPost/JobPost.js +6 -31
- package/dist/components/jobPost/JobPost.js.map +1 -1
- package/dist/components/primitives/avatar.cjs.map +1 -1
- package/dist/components/primitives/avatar.js.map +1 -1
- package/dist/components/primitives/command.cjs.map +1 -1
- package/dist/components/primitives/command.d.cts +1 -1
- package/dist/components/primitives/command.d.ts +1 -1
- package/dist/components/primitives/command.js.map +1 -1
- package/dist/components/primitives/dialog.cjs.map +1 -1
- package/dist/components/primitives/dialog.js.map +1 -1
- package/dist/components/primitives/input-otp.cjs +99 -0
- package/dist/components/primitives/input-otp.cjs.map +1 -0
- package/dist/components/primitives/input-otp.d.cts +38 -0
- package/dist/components/primitives/input-otp.d.ts +38 -0
- package/dist/components/primitives/input-otp.js +62 -0
- package/dist/components/primitives/input-otp.js.map +1 -0
- package/dist/components/primitives/popover.cjs.map +1 -1
- package/dist/components/primitives/popover.js.map +1 -1
- package/dist/components/primitives/separator.cjs.map +1 -1
- package/dist/components/primitives/separator.js.map +1 -1
- package/dist/components/primitives/tooltip.cjs.map +1 -1
- package/dist/components/primitives/tooltip.js.map +1 -1
- package/dist/components/ui/Avatar.cjs.map +1 -1
- package/dist/components/ui/Avatar.js.map +1 -1
- package/dist/components/ui/Badge.cjs.map +1 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.cjs.map +1 -1
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Checkbox.cjs.map +1 -1
- package/dist/components/ui/Checkbox.js.map +1 -1
- package/dist/components/ui/Combobox.cjs.map +1 -1
- package/dist/components/ui/Combobox.js.map +1 -1
- package/dist/components/ui/Counter.cjs.map +1 -1
- package/dist/components/ui/Counter.js.map +1 -1
- package/dist/components/ui/ErrorMessage.cjs.map +1 -1
- package/dist/components/ui/ErrorMessage.js.map +1 -1
- package/dist/components/ui/Icon.cjs.map +1 -1
- package/dist/components/ui/Icon.js.map +1 -1
- package/dist/components/ui/Input.cjs.map +1 -1
- package/dist/components/ui/Input.js.map +1 -1
- package/dist/components/ui/InputOtp.cjs +187 -0
- package/dist/components/ui/InputOtp.cjs.map +1 -0
- package/dist/components/ui/InputOtp.d.cts +14 -0
- package/dist/components/ui/InputOtp.d.ts +14 -0
- package/dist/components/ui/InputOtp.js +152 -0
- package/dist/components/ui/InputOtp.js.map +1 -0
- package/dist/components/ui/Label.cjs.map +1 -1
- package/dist/components/ui/Label.js.map +1 -1
- package/dist/components/ui/ListItem.cjs.map +1 -1
- package/dist/components/ui/ListItem.js.map +1 -1
- package/dist/components/ui/MapComponent.cjs +2 -9
- package/dist/components/ui/MapComponent.cjs.map +1 -1
- package/dist/components/ui/MapComponent.d.cts +1 -1
- package/dist/components/ui/MapComponent.d.ts +1 -1
- package/dist/components/ui/MapComponent.js +2 -9
- package/dist/components/ui/MapComponent.js.map +1 -1
- package/dist/components/ui/PlacesQueryInput.cjs.map +1 -1
- package/dist/components/ui/PlacesQueryInput.js.map +1 -1
- package/dist/components/ui/ReadMore.cjs.map +1 -1
- package/dist/components/ui/ReadMore.js.map +1 -1
- package/dist/components/ui/Select.cjs.map +1 -1
- package/dist/components/ui/Select.js.map +1 -1
- package/dist/{displayText-Dl2hcn02.d.ts → displayText-CcePAspL.d.ts} +2 -2
- package/dist/{displayText-C5jAFYZY.d.cts → displayText-D3BX6YTj.d.cts} +2 -2
- package/dist/hooks/useDisplayText.d.cts +3 -3
- package/dist/hooks/useDisplayText.d.ts +3 -3
- package/dist/hooks/useWindowHistory.cjs +0 -3
- package/dist/hooks/useWindowHistory.cjs.map +1 -1
- package/dist/hooks/useWindowHistory.js +0 -3
- package/dist/hooks/useWindowHistory.js.map +1 -1
- package/dist/index.cjs +241 -189
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +205 -154
- package/dist/index.js.map +1 -1
- package/dist/{job_posting_service_latest-D3PatPBh.d.cts → job_posting_service_latest-CWuc_SuJ.d.cts} +302 -1622
- package/dist/{job_posting_service_latest-D3PatPBh.d.ts → job_posting_service_latest-CWuc_SuJ.d.ts} +302 -1622
- package/dist/lib/locations.d.cts +2 -2
- package/dist/lib/locations.d.ts +2 -2
- package/dist/lib/mappings.d.cts +3 -3
- package/dist/lib/mappings.d.ts +3 -3
- package/dist/lib/salaryRange.cjs +4 -25
- package/dist/lib/salaryRange.cjs.map +1 -1
- package/dist/lib/salaryRange.d.cts +1 -1
- package/dist/lib/salaryRange.d.ts +1 -1
- package/dist/lib/salaryRange.js +4 -25
- package/dist/lib/salaryRange.js.map +1 -1
- package/dist/lib/utils.cjs.map +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/services/displayText.d.cts +3 -3
- package/dist/services/displayText.d.ts +3 -3
- package/dist/{shared_pickle_output_latest-DUO_efBh.d.cts → shared_pickle_output_latest-CxZJXPOS.d.cts} +8 -148
- package/dist/{shared_pickle_output_latest-DUO_efBh.d.ts → shared_pickle_output_latest-CxZJXPOS.d.ts} +8 -148
- package/dist/styles/globals.css +109 -37
- package/dist/styles/globals.css.map +1 -1
- package/dist/types/data/company_service_latest.cjs +31 -52
- package/dist/types/data/company_service_latest.cjs.map +1 -1
- package/dist/types/data/company_service_latest.d.cts +1 -1
- package/dist/types/data/company_service_latest.d.ts +1 -1
- package/dist/types/data/company_service_latest.js +29 -51
- package/dist/types/data/company_service_latest.js.map +1 -1
- package/dist/types/data/job_posting_service_latest.cjs +28 -51
- package/dist/types/data/job_posting_service_latest.cjs.map +1 -1
- package/dist/types/data/job_posting_service_latest.d.cts +1 -1
- package/dist/types/data/job_posting_service_latest.d.ts +1 -1
- package/dist/types/data/job_posting_service_latest.js +28 -51
- package/dist/types/data/job_posting_service_latest.js.map +1 -1
- package/dist/types/data/shared_pickle_output_latest.cjs +4 -29
- package/dist/types/data/shared_pickle_output_latest.cjs.map +1 -1
- package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
- package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
- package/dist/types/data/shared_pickle_output_latest.js +4 -27
- package/dist/types/data/shared_pickle_output_latest.js.map +1 -1
- package/package.json +6 -4
|
@@ -125,9 +125,6 @@ var WindowHistoryContext = (0, import_react2.createContext)({});
|
|
|
125
125
|
// src/hooks/useWindowHistory.ts
|
|
126
126
|
function useWindowHistory() {
|
|
127
127
|
const windowHistoryContext = (0, import_react3.useContext)(WindowHistoryContext);
|
|
128
|
-
if (Object.keys(windowHistoryContext).length === 0) {
|
|
129
|
-
throw new Error("useWindowHistory was used outside of its WindowHistoryContext");
|
|
130
|
-
}
|
|
131
128
|
return windowHistoryContext;
|
|
132
129
|
}
|
|
133
130
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx"],"sourcesContent":["'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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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
|
|
1
|
+
{"version":3,"sources":["../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx"],"sourcesContent":["'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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 { clsx, type ClassValue } 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,0BAAkB;AAClB,IAAAA,qBAA0B;;;ACH1B,wBAAqB;AACrB,iBAAuC;AACvC,mBAA2B;AAC3B,IAAAC,yBAAwB;;;ACHxB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADaM;AAJC,IAAM,WAAO;AAAA,EAClB,CAAC,EAAE,SAAS,MAAM,SAAS,OAAO,WAAW,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACjF,UAAM,YAAY,WAAW,yBAAO;AACpC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,cACT,gCAAQ,aAAa,EAAE,SAAS,SAAS,WAAW,SAAS,KAAK,CAAC,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QACJ;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,KAAK,cAAc;AAEnB,IAAM,mBAAe;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ,CAAC,cAAc,eAAe;AAAA,MACxC;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,CAAC,QAAQ,QAAQ,KAAK;AAAA,QAC7B,QAAQ,CAAC,QAAQ,QAAQ,KAAK;AAAA,QAC9B,OAAO,CAAC,QAAQ,QAAQ,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AEpFA,IAAAC,gBAA2B;;;ACE3B,wBAAgC;AAChC,IAAAC,gBAAoF;AAqBhF,IAAAC,sBAAA;AAfG,IAAM,2BAAuB,6BAAc,CAAC,CAA8B;;;ADF1E,SAAS,mBAA8C;AAC5D,QAAM,2BAAuB,0BAAW,oBAAoB;AAE5D,SAAO;AACT;;;AHyBM,IAAAC,sBAAA;AAvBC,SAAS,WAAW,EAAE,gBAAgB,cAAc,WAAW,GAAG,MAAM,GAAoB;AACjG,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,aAAS,8BAAU;AAEzB,QAAM,kBAAkB,CAAC,MACvB,CAAC,CAAC,gBAAgB,KAAK,CAAC,UAAU,IAAI,OAAO,MAAM,QAAQ,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;AAE9E,QAAM,SAAS,MAAM;AACnB,UAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC;AAC3C,YAAQ,SAAS,KAAK,gBAAgB,QAAQ,IAC1C,OAAO,KAAK,IACZ,OAAO,KAAK,gBAAgB,GAAG;AAAA,EACrC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACC,GAAG;AAAA,MAEJ,uDAAC,yBAAE;AAAA;AAAA,EACL;AAEJ;","names":["import_navigation","import_tailwind_merge","import_react","import_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
@@ -102,9 +102,6 @@ var WindowHistoryContext = createContext({});
|
|
|
102
102
|
// src/hooks/useWindowHistory.ts
|
|
103
103
|
function useWindowHistory() {
|
|
104
104
|
const windowHistoryContext = useContext(WindowHistoryContext);
|
|
105
|
-
if (Object.keys(windowHistoryContext).length === 0) {
|
|
106
|
-
throw new Error("useWindowHistory was used outside of its WindowHistoryContext");
|
|
107
|
-
}
|
|
108
105
|
return windowHistoryContext;
|
|
109
106
|
}
|
|
110
107
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx"],"sourcesContent":["'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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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
|
|
1
|
+
{"version":3,"sources":["../../../src/components/buttons/BackButton.tsx","../../../src/components/ui/Icon.tsx","../../../src/lib/utils.ts","../../../src/hooks/useWindowHistory.ts","../../../src/contexts/WindowHistoryProvider.tsx"],"sourcesContent":["'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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 { clsx, type ClassValue } 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"],"mappings":";;;AAEA,SAAS,SAAS;AAClB,SAAS,iBAAiB;;;ACH1B,SAAS,YAAY;AACrB,SAAS,WAA8B;AACvC,SAAS,kBAAkB;AAC3B,SAAS,WAAAA,gBAAe;;;ACHxB,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADaM;AAJC,IAAM,OAAO;AAAA,EAClB,CAAC,EAAE,SAAS,MAAM,SAAS,OAAO,WAAW,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACjF,UAAM,YAAY,WAAW,OAAO;AACpC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACTC,SAAQ,aAAa,EAAE,SAAS,SAAS,WAAW,SAAS,KAAK,CAAC,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QACJ;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,KAAK,cAAc;AAEnB,IAAM,eAAe;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ,CAAC,cAAc,eAAe;AAAA,MACxC;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,CAAC,QAAQ,QAAQ,KAAK;AAAA,QAC7B,QAAQ,CAAC,QAAQ,QAAQ,KAAK;AAAA,QAC9B,OAAO,CAAC,QAAQ,QAAQ,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AEpFA,SAAS,kBAAkB;;;ACE3B,SAAS,uBAAuB;AAChC,SAAS,eAAuC,WAAW,SAAS,gBAAgB;AAqBhF,gBAAAC,YAAA;AAfG,IAAM,uBAAuB,cAAc,CAAC,CAA8B;;;ADF1E,SAAS,mBAA8C;AAC5D,QAAM,uBAAuB,WAAW,oBAAoB;AAE5D,SAAO;AACT;;;AHyBM,gBAAAC,YAAA;AAvBC,SAAS,WAAW,EAAE,gBAAgB,cAAc,WAAW,GAAG,MAAM,GAAoB;AACjG,QAAM,EAAE,QAAQ,IAAI,iBAAiB;AACrC,QAAM,SAAS,UAAU;AAEzB,QAAM,kBAAkB,CAAC,MACvB,CAAC,CAAC,gBAAgB,KAAK,CAAC,UAAU,IAAI,OAAO,MAAM,QAAQ,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;AAE9E,QAAM,SAAS,MAAM;AACnB,UAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC;AAC3C,YAAQ,SAAS,KAAK,gBAAgB,QAAQ,IAC1C,OAAO,KAAK,IACZ,OAAO,KAAK,gBAAgB,GAAG;AAAA,EACrC;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA,KAAC,KAAE;AAAA;AAAA,EACL;AAEJ;","names":["twMerge","twMerge","jsx","jsx"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/company/CompanyTake.tsx","../../../src/components/primitives/avatar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Avatar.tsx"],"sourcesContent":["'use client'\n\nimport { Avatar } from '@/components/ui/Avatar'\n\ninterface Props {\n content?: string\n avatarSrc?: string\n}\n\nexport function CompanyTake({ content, avatarSrc }: Readonly<Props>) {\n if (!content) return null\n\n return (\n <div\n data-testid=\"company-take\"\n className=\"align-center w-full justify-start rounded-2xl bg-green-90 p-6\"\n >\n <p className=\"text-lg font-bold text-white sm:text-xl\">The Real Dill ☘️</p>\n <div className=\"mt-2 flex items-center justify-start\">\n <p className=\"text-sm font-normal text-grey-10\">{content}</p>\n </div>\n <div className=\"mt-8 flex w-full items-center gap-3\">\n <Avatar name=\"Jon Lee\" src={avatarSrc} />\n <div className=\"flex flex-col flex-wrap items-start\">\n <p className=\"text-sm font-bold text-white\">Jon Lee, PT, DPT, OCS, FAAOMPT, MBA</p>\n <p className=\"text-xs font-normal text-grey-30\">Pickle co-founder</p>\n </div>\n </div>\n </div>\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 { type ClassValue
|
|
1
|
+
{"version":3,"sources":["../../../src/components/company/CompanyTake.tsx","../../../src/components/primitives/avatar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Avatar.tsx"],"sourcesContent":["'use client'\n\nimport { Avatar } from '@/components/ui/Avatar'\n\ninterface Props {\n content?: string\n avatarSrc?: string\n}\n\nexport function CompanyTake({ content, avatarSrc }: Readonly<Props>) {\n if (!content) return null\n\n return (\n <div\n data-testid=\"company-take\"\n className=\"align-center w-full justify-start rounded-2xl bg-green-90 p-6\"\n >\n <p className=\"text-lg font-bold text-white sm:text-xl\">The Real Dill ☘️</p>\n <div className=\"mt-2 flex items-center justify-start\">\n <p className=\"text-sm font-normal text-grey-10\">{content}</p>\n </div>\n <div className=\"mt-8 flex w-full items-center gap-3\">\n <Avatar name=\"Jon Lee\" src={avatarSrc} />\n <div className=\"flex flex-col flex-wrap items-start\">\n <p className=\"text-sm font-bold text-white\">Jon Lee, PT, DPT, OCS, FAAOMPT, MBA</p>\n <p className=\"text-xs font-normal text-grey-30\">Pickle co-founder</p>\n </div>\n </div>\n </div>\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 { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,sBAAiC;AACjC,YAAuB;;;ACHvB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADYE;AAJK,IAAM,aAAmB,iBAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,uDAAuD,SAAS;AAAA,IAC7E,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAA8B,qBAAK;AAEvC,IAAM,cAAoB,iBAG/B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,IACtD,eAAY;AAAA,IACX,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEzC,IAAM,iBAAuB,iBAGlC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA8B,yBAAS;;;AElDtD,iBAAkC;AAClC,kBAAiB;AAqBb,IAAAA,sBAAA;AAXG,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,GAAG,UAAU,GAAgB;AAC3E,QAAM,gBAAgB,MAAM,MAAM,GAAG,CAAC;AACtC,QAAM,gBAAgB,MAClB,MAAM,GAAG,EACV,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,KAAK,EAAE,EACP,MAAM,GAAG,CAAC;AAEb,QAAM,WAAW,iBAAiB,cAAc,SAAS,IAAI,gBAAgB;AAE7E,QAAM,eAAe,MACnB,8CAAC,cAAW,WAAW,eAAe,EAAE,KAAK,CAAC,GAC5C;AAAA,iDAAC,eAAY,KAAU,KAAK,MAAM;AAAA,IAClC,6CAAC,kBAAgB,oBAAU,YAAY,GAAE;AAAA,KAC3C;AAGF,MAAI,MAAM;AACR,WACE,6CAAC,YAAAC,SAAA,EAAK,MAAa,GAAG,WACnB,uBAAa,GAChB;AAAA,EAEJ;AAEA,SAAO,aAAa;AACtB;AAEO,IAAM,qBAAiB,gBAAI,0BAA0B;AAAA,EAC1D,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;;;AHlCK,IAAAC,sBAAA;AARC,SAAS,YAAY,EAAE,SAAS,UAAU,GAAoB;AACnE,MAAI,CAAC,QAAS,QAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV;AAAA,qDAAC,OAAE,WAAU,2CAA0C,wCAAgB;AAAA,QACvE,6CAAC,SAAI,WAAU,wCACb,uDAAC,OAAE,WAAU,oCAAoC,mBAAQ,GAC3D;AAAA,QACA,8CAAC,SAAI,WAAU,uCACb;AAAA,uDAAC,UAAO,MAAK,WAAU,KAAK,WAAW;AAAA,UACvC,8CAAC,SAAI,WAAU,uCACb;AAAA,yDAAC,OAAE,WAAU,gCAA+B,iDAAmC;AAAA,YAC/E,6CAAC,OAAE,WAAU,oCAAmC,+BAAiB;AAAA,aACnE;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["import_jsx_runtime","Link","import_jsx_runtime"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/primitives/avatar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Avatar.tsx","../../../src/components/company/CompanyTake.tsx"],"sourcesContent":["'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 { type ClassValue
|
|
1
|
+
{"version":3,"sources":["../../../src/components/primitives/avatar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Avatar.tsx","../../../src/components/company/CompanyTake.tsx"],"sourcesContent":["'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 { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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 { Avatar } from '@/components/ui/Avatar'\n\ninterface Props {\n content?: string\n avatarSrc?: string\n}\n\nexport function CompanyTake({ content, avatarSrc }: Readonly<Props>) {\n if (!content) return null\n\n return (\n <div\n data-testid=\"company-take\"\n className=\"align-center w-full justify-start rounded-2xl bg-green-90 p-6\"\n >\n <p className=\"text-lg font-bold text-white sm:text-xl\">The Real Dill ☘️</p>\n <div className=\"mt-2 flex items-center justify-start\">\n <p className=\"text-sm font-normal text-grey-10\">{content}</p>\n </div>\n <div className=\"mt-8 flex w-full items-center gap-3\">\n <Avatar name=\"Jon Lee\" src={avatarSrc} />\n <div className=\"flex flex-col flex-wrap items-start\">\n <p className=\"text-sm font-bold text-white\">Jon Lee, PT, DPT, OCS, FAAOMPT, MBA</p>\n <p className=\"text-xs font-normal text-grey-30\">Pickle co-founder</p>\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":";;;AAEA,YAAY,qBAAqB;AACjC,YAAY,WAAW;;;ACHvB,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADYE;AAJK,IAAM,aAAmB,iBAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,uDAAuD,SAAS;AAAA,IAC7E,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAA8B,qBAAK;AAEvC,IAAM,cAAoB,iBAG/B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,IACtD,eAAY;AAAA,IACX,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEzC,IAAM,iBAAuB,iBAGlC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA8B,yBAAS;;;AElDtD,SAAS,WAAyB;AAClC,OAAO,UAAU;AAqBb,SACE,OAAAA,MADF;AAXG,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,GAAG,UAAU,GAAgB;AAC3E,QAAM,gBAAgB,MAAM,MAAM,GAAG,CAAC;AACtC,QAAM,gBAAgB,MAClB,MAAM,GAAG,EACV,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,KAAK,EAAE,EACP,MAAM,GAAG,CAAC;AAEb,QAAM,WAAW,iBAAiB,cAAc,SAAS,IAAI,gBAAgB;AAE7E,QAAM,eAAe,MACnB,qBAAC,cAAW,WAAW,eAAe,EAAE,KAAK,CAAC,GAC5C;AAAA,oBAAAA,KAAC,eAAY,KAAU,KAAK,MAAM;AAAA,IAClC,gBAAAA,KAAC,kBAAgB,oBAAU,YAAY,GAAE;AAAA,KAC3C;AAGF,MAAI,MAAM;AACR,WACE,gBAAAA,KAAC,QAAK,MAAa,GAAG,WACnB,uBAAa,GAChB;AAAA,EAEJ;AAEA,SAAO,aAAa;AACtB;AAEO,IAAM,iBAAiB,IAAI,0BAA0B;AAAA,EAC1D,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;;;AClCK,gBAAAC,MAME,QAAAC,aANF;AARC,SAAS,YAAY,EAAE,SAAS,UAAU,GAAoB;AACnE,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV;AAAA,wBAAAD,KAAC,OAAE,WAAU,2CAA0C,wCAAgB;AAAA,QACvE,gBAAAA,KAAC,SAAI,WAAU,wCACb,0BAAAA,KAAC,OAAE,WAAU,oCAAoC,mBAAQ,GAC3D;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,uCACb;AAAA,0BAAAD,KAAC,UAAO,MAAK,WAAU,KAAK,WAAW;AAAA,UACvC,gBAAAC,MAAC,SAAI,WAAU,uCACb;AAAA,4BAAAD,KAAC,OAAE,WAAU,gCAA+B,iDAAmC;AAAA,YAC/E,gBAAAA,KAAC,OAAE,WAAU,oCAAmC,+BAAiB;AAAA,aACnE;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["jsx","jsx","jsxs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/jobPost/JobDescription.tsx","../../../src/components/ui/ReadMore.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Button.tsx"],"sourcesContent":["import { ReadMore } from '@/components/ui/ReadMore'\n\nexport type JobDescriptionProps = {\n description?: string\n}\n\nexport function JobDescription({ description }: JobDescriptionProps) {\n if (!description) return null\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <h3 className=\"text-xl font-bold\">Job Description</h3>\n <ReadMore text={description} />\n </div>\n )\n}\n","'use client'\n\nimport { ComponentProps, useEffect, useState } from 'react'\nimport Markdown from 'react-markdown'\n\nimport { Button } from '@/components/ui/Button'\n\nexport type ReadMoreProps = ComponentProps<'div'> & {\n text: string\n}\n\nexport function ReadMore({ text, ...props }: Readonly<ReadMoreProps>) {\n const [isExpanded, setIsExpanded] = useState(false)\n const [maxWords, setMaxWords] = useState(160)\n\n useEffect(() => {\n const updateMaxWords = () => {\n const windowWidth = window.innerWidth\n if (windowWidth <= 768) {\n setMaxWords(50)\n } else {\n setMaxWords(160)\n }\n }\n\n updateMaxWords()\n window.addEventListener('resize', updateMaxWords)\n\n return () => window.removeEventListener('resize', updateMaxWords)\n }, [])\n\n function createReadMoreText(text: string, maxWords: number, isExpanded: boolean): string {\n const words = text.split(' ')\n\n const snippet = isExpanded ? text : words.slice(0, maxWords).join(' ')\n const readMoreText = isExpanded ? '' : '...'\n return `${snippet} ${readMoreText}`\n }\n\n const toggleText = () => setIsExpanded(!isExpanded)\n\n const snippet = createReadMoreText(text, maxWords, isExpanded)\n\n return (\n <div {...props}>\n <div data-testid=\"read-more-text\" className=\"prose lg:prose-lg\">\n <Markdown>{snippet}</Markdown>\n </div>\n <Button className=\"mt-2 flex items-center justify-center\" variant=\"link\" onClick={toggleText}>\n <p className=\"text-sm font-bold underline underline-offset-2\">\n Read {isExpanded ? 'less' : 'more'}\n </p>\n </Button>\n </div>\n )\n}\n","import { type ClassValue
|
|
1
|
+
{"version":3,"sources":["../../../src/components/jobPost/JobDescription.tsx","../../../src/components/ui/ReadMore.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Button.tsx"],"sourcesContent":["import { ReadMore } from '@/components/ui/ReadMore'\n\nexport type JobDescriptionProps = {\n description?: string\n}\n\nexport function JobDescription({ description }: JobDescriptionProps) {\n if (!description) return null\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <h3 className=\"text-xl font-bold\">Job Description</h3>\n <ReadMore text={description} />\n </div>\n )\n}\n","'use client'\n\nimport { ComponentProps, useEffect, useState } from 'react'\nimport Markdown from 'react-markdown'\n\nimport { Button } from '@/components/ui/Button'\n\nexport type ReadMoreProps = ComponentProps<'div'> & {\n text: string\n}\n\nexport function ReadMore({ text, ...props }: Readonly<ReadMoreProps>) {\n const [isExpanded, setIsExpanded] = useState(false)\n const [maxWords, setMaxWords] = useState(160)\n\n useEffect(() => {\n const updateMaxWords = () => {\n const windowWidth = window.innerWidth\n if (windowWidth <= 768) {\n setMaxWords(50)\n } else {\n setMaxWords(160)\n }\n }\n\n updateMaxWords()\n window.addEventListener('resize', updateMaxWords)\n\n return () => window.removeEventListener('resize', updateMaxWords)\n }, [])\n\n function createReadMoreText(text: string, maxWords: number, isExpanded: boolean): string {\n const words = text.split(' ')\n\n const snippet = isExpanded ? text : words.slice(0, maxWords).join(' ')\n const readMoreText = isExpanded ? '' : '...'\n return `${snippet} ${readMoreText}`\n }\n\n const toggleText = () => setIsExpanded(!isExpanded)\n\n const snippet = createReadMoreText(text, maxWords, isExpanded)\n\n return (\n <div {...props}>\n <div data-testid=\"read-more-text\" className=\"prose lg:prose-lg\">\n <Markdown>{snippet}</Markdown>\n </div>\n <Button className=\"mt-2 flex items-center justify-center\" variant=\"link\" onClick={toggleText}>\n <p className=\"text-sm font-bold underline underline-offset-2\">\n Read {isExpanded ? 'less' : 'more'}\n </p>\n </Button>\n </div>\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cn } from '@/lib/utils'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport React, { forwardRef } from 'react'\n\ninterface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : 'button'\n\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nconst buttonVariants = cva(\n [\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'rounded-full',\n 'font-bold',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n ],\n {\n variants: {\n variant: {\n neutral: [\n 'bg-black',\n 'text-white',\n 'hover:bg-grey-90',\n 'active:bg-grey-80',\n 'focus:outline-purple-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n primary: [\n 'bg-pickle-100',\n 'text-black',\n 'hover:bg-pickle-80',\n 'active:bg-pickle-60',\n 'focus:outline-purple-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n secondary: [\n 'bg-green-80',\n 'text-white',\n 'hover:bg-green-90',\n 'active:bg-green-100',\n 'focus:outline-pickle-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n transparent: [\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-100',\n 'focus:outline-pickle-100',\n 'disabled:text-grey-40',\n ],\n link: [\n 'leading-tight',\n 'text-black',\n 'underline',\n 'hover:text-purple-100',\n 'focus:text-black',\n 'focus:outline-purple-100',\n 'active:text-purple-80',\n ],\n },\n size: {\n small: ['h-10', 'text-sm', 'px-4', 'py-2'],\n medium: ['h-12', 'text-base', 'px-6', 'py-3'],\n large: ['h-14', 'text-lg', 'px-8', 'py-4'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n compoundVariants: [\n {\n variant: 'link',\n size: 'small',\n class: ['h-3', 'text-xs', 'p-0'],\n },\n {\n variant: 'link',\n size: 'medium',\n class: ['h-4', 'text-sm', 'p-0'],\n },\n {\n variant: 'link',\n size: 'large',\n class: ['h-6', 'text-base', 'p-0'],\n },\n ],\n }\n)\n"],"mappings":"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","names":["import_react","import_jsx_runtime","text","maxWords","isExpanded","snippet","Markdown","import_jsx_runtime"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/ReadMore.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Button.tsx","../../../src/components/jobPost/JobDescription.tsx"],"sourcesContent":["'use client'\n\nimport { ComponentProps, useEffect, useState } from 'react'\nimport Markdown from 'react-markdown'\n\nimport { Button } from '@/components/ui/Button'\n\nexport type ReadMoreProps = ComponentProps<'div'> & {\n text: string\n}\n\nexport function ReadMore({ text, ...props }: Readonly<ReadMoreProps>) {\n const [isExpanded, setIsExpanded] = useState(false)\n const [maxWords, setMaxWords] = useState(160)\n\n useEffect(() => {\n const updateMaxWords = () => {\n const windowWidth = window.innerWidth\n if (windowWidth <= 768) {\n setMaxWords(50)\n } else {\n setMaxWords(160)\n }\n }\n\n updateMaxWords()\n window.addEventListener('resize', updateMaxWords)\n\n return () => window.removeEventListener('resize', updateMaxWords)\n }, [])\n\n function createReadMoreText(text: string, maxWords: number, isExpanded: boolean): string {\n const words = text.split(' ')\n\n const snippet = isExpanded ? text : words.slice(0, maxWords).join(' ')\n const readMoreText = isExpanded ? '' : '...'\n return `${snippet} ${readMoreText}`\n }\n\n const toggleText = () => setIsExpanded(!isExpanded)\n\n const snippet = createReadMoreText(text, maxWords, isExpanded)\n\n return (\n <div {...props}>\n <div data-testid=\"read-more-text\" className=\"prose lg:prose-lg\">\n <Markdown>{snippet}</Markdown>\n </div>\n <Button className=\"mt-2 flex items-center justify-center\" variant=\"link\" onClick={toggleText}>\n <p className=\"text-sm font-bold underline underline-offset-2\">\n Read {isExpanded ? 'less' : 'more'}\n </p>\n </Button>\n </div>\n )\n}\n","import { type ClassValue
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/ReadMore.tsx","../../../src/lib/utils.ts","../../../src/components/ui/Button.tsx","../../../src/components/jobPost/JobDescription.tsx"],"sourcesContent":["'use client'\n\nimport { ComponentProps, useEffect, useState } from 'react'\nimport Markdown from 'react-markdown'\n\nimport { Button } from '@/components/ui/Button'\n\nexport type ReadMoreProps = ComponentProps<'div'> & {\n text: string\n}\n\nexport function ReadMore({ text, ...props }: Readonly<ReadMoreProps>) {\n const [isExpanded, setIsExpanded] = useState(false)\n const [maxWords, setMaxWords] = useState(160)\n\n useEffect(() => {\n const updateMaxWords = () => {\n const windowWidth = window.innerWidth\n if (windowWidth <= 768) {\n setMaxWords(50)\n } else {\n setMaxWords(160)\n }\n }\n\n updateMaxWords()\n window.addEventListener('resize', updateMaxWords)\n\n return () => window.removeEventListener('resize', updateMaxWords)\n }, [])\n\n function createReadMoreText(text: string, maxWords: number, isExpanded: boolean): string {\n const words = text.split(' ')\n\n const snippet = isExpanded ? text : words.slice(0, maxWords).join(' ')\n const readMoreText = isExpanded ? '' : '...'\n return `${snippet} ${readMoreText}`\n }\n\n const toggleText = () => setIsExpanded(!isExpanded)\n\n const snippet = createReadMoreText(text, maxWords, isExpanded)\n\n return (\n <div {...props}>\n <div data-testid=\"read-more-text\" className=\"prose lg:prose-lg\">\n <Markdown>{snippet}</Markdown>\n </div>\n <Button className=\"mt-2 flex items-center justify-center\" variant=\"link\" onClick={toggleText}>\n <p className=\"text-sm font-bold underline underline-offset-2\">\n Read {isExpanded ? 'less' : 'more'}\n </p>\n </Button>\n </div>\n )\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { cn } from '@/lib/utils'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'cva'\nimport React, { forwardRef } from 'react'\n\ninterface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : 'button'\n\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nconst buttonVariants = cva(\n [\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'rounded-full',\n 'font-bold',\n 'outline-2',\n 'outline-offset-2',\n 'outline-dashed',\n 'outline-transparent',\n ],\n {\n variants: {\n variant: {\n neutral: [\n 'bg-black',\n 'text-white',\n 'hover:bg-grey-90',\n 'active:bg-grey-80',\n 'focus:outline-purple-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n primary: [\n 'bg-pickle-100',\n 'text-black',\n 'hover:bg-pickle-80',\n 'active:bg-pickle-60',\n 'focus:outline-purple-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n secondary: [\n 'bg-green-80',\n 'text-white',\n 'hover:bg-green-90',\n 'active:bg-green-100',\n 'focus:outline-pickle-100',\n 'disabled:text-grey-40',\n 'disabled:bg-grey-10',\n ],\n transparent: [\n 'text-white',\n 'hover:bg-green-80',\n 'active:bg-green-100',\n 'focus:outline-pickle-100',\n 'disabled:text-grey-40',\n ],\n link: [\n 'leading-tight',\n 'text-black',\n 'underline',\n 'hover:text-purple-100',\n 'focus:text-black',\n 'focus:outline-purple-100',\n 'active:text-purple-80',\n ],\n },\n size: {\n small: ['h-10', 'text-sm', 'px-4', 'py-2'],\n medium: ['h-12', 'text-base', 'px-6', 'py-3'],\n large: ['h-14', 'text-lg', 'px-8', 'py-4'],\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'medium',\n },\n compoundVariants: [\n {\n variant: 'link',\n size: 'small',\n class: ['h-3', 'text-xs', 'p-0'],\n },\n {\n variant: 'link',\n size: 'medium',\n class: ['h-4', 'text-sm', 'p-0'],\n },\n {\n variant: 'link',\n size: 'large',\n class: ['h-6', 'text-base', 'p-0'],\n },\n ],\n }\n)\n","import { ReadMore } from '@/components/ui/ReadMore'\n\nexport type JobDescriptionProps = {\n description?: string\n}\n\nexport function JobDescription({ description }: JobDescriptionProps) {\n if (!description) return null\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <h3 className=\"text-xl font-bold\">Job Description</h3>\n <ReadMore text={description} />\n </div>\n )\n}\n"],"mappings":"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","names":["jsx","text","maxWords","isExpanded","snippet","jsx","jsxs"]}
|
|
@@ -139,9 +139,6 @@ var WindowHistoryContext = (0, import_react2.createContext)({});
|
|
|
139
139
|
// src/hooks/useWindowHistory.ts
|
|
140
140
|
function useWindowHistory() {
|
|
141
141
|
const windowHistoryContext = (0, import_react3.useContext)(WindowHistoryContext);
|
|
142
|
-
if (Object.keys(windowHistoryContext).length === 0) {
|
|
143
|
-
throw new Error("useWindowHistory was used outside of its WindowHistoryContext");
|
|
144
|
-
}
|
|
145
142
|
return windowHistoryContext;
|
|
146
143
|
}
|
|
147
144
|
|
|
@@ -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/Chip.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Avatar.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport Chip from '@/components/ui/Chip'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/components/ui/Avatar'\nimport { iconMap } from '@/lib/icons'\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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 if (Object.keys(windowHistoryContext).length === 0) {\n throw new Error('useWindowHistory was used outside of its WindowHistoryContext')\n }\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 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","'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 { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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","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_tailwind_merge","import_jsx_runtime","import_jsx_runtime","import_cva","import_jsx_runtime","Link","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/Chip.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Avatar.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport Chip from '@/components/ui/Chip'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/components/ui/Avatar'\nimport { iconMap } from '@/lib/icons'\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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 { clsx, type ClassValue } 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 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","'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 { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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","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_tailwind_merge","import_jsx_runtime","import_jsx_runtime","import_cva","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","Icon","Image"]}
|
|
@@ -106,9 +106,6 @@ var WindowHistoryContext = createContext({});
|
|
|
106
106
|
// src/hooks/useWindowHistory.ts
|
|
107
107
|
function useWindowHistory() {
|
|
108
108
|
const windowHistoryContext = useContext(WindowHistoryContext);
|
|
109
|
-
if (Object.keys(windowHistoryContext).length === 0) {
|
|
110
|
-
throw new Error("useWindowHistory was used outside of its WindowHistoryContext");
|
|
111
|
-
}
|
|
112
109
|
return windowHistoryContext;
|
|
113
110
|
}
|
|
114
111
|
|
|
@@ -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/Chip.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Avatar.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport Chip from '@/components/ui/Chip'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/components/ui/Avatar'\nimport { iconMap } from '@/lib/icons'\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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 if (Object.keys(windowHistoryContext).length === 0) {\n throw new Error('useWindowHistory was used outside of its WindowHistoryContext')\n }\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 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","'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 { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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","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","twMerge","jsx","jsx","cva","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/Chip.tsx","../../../src/components/primitives/avatar.tsx","../../../src/components/ui/Avatar.tsx","../../../src/lib/icons.ts"],"sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport Chip from '@/components/ui/Chip'\nimport { cn } from '@/lib/utils'\nimport { Avatar } from '@/components/ui/Avatar'\nimport { iconMap } from '@/lib/icons'\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(r))\n\n const goBack = () => {\n const previous = history[history.length - 2]\n history.length > 1 && isAcceptedRoute(previous)\n ? router.back()\n : router.push(fallbackHref ?? '/')\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 { clsx, type ClassValue } 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 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","'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 { AvatarBase, AvatarFallback, AvatarImage } from '@/components/primitives/avatar'\nimport { cva, VariantProps } from 'cva'\nimport Link from 'next/link'\nimport { ComponentProps } from 'react'\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","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","twMerge","jsx","jsx","cva","jsx","jsx","jsxs","Icon","Image"]}
|