@next-degree/pickle-shared-js 0.15.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/{chunk-FE76CE2N.cjs → chunk-5EUHR4DQ.cjs} +3 -3
  2. package/dist/{chunk-FE76CE2N.cjs.map → chunk-5EUHR4DQ.cjs.map} +1 -1
  3. package/dist/{chunk-TOEADI6J.cjs → chunk-AMMLIOH5.cjs} +4 -4
  4. package/dist/{chunk-TOEADI6J.cjs.map → chunk-AMMLIOH5.cjs.map} +1 -1
  5. package/dist/{chunk-NE6KKGGM.cjs → chunk-CU67BLKX.cjs} +3 -3
  6. package/dist/{chunk-NE6KKGGM.cjs.map → chunk-CU67BLKX.cjs.map} +1 -1
  7. package/dist/{chunk-NEKYNDRG.js → chunk-IXCAC2PV.js} +3 -3
  8. package/dist/{chunk-NEKYNDRG.js.map → chunk-IXCAC2PV.js.map} +1 -1
  9. package/dist/{chunk-TAQTWTKL.js → chunk-JGZ2TDX4.js} +5 -5
  10. package/dist/{chunk-TAQTWTKL.js.map → chunk-JGZ2TDX4.js.map} +1 -1
  11. package/dist/{chunk-BIW5IBTK.cjs → chunk-KKJS3J3C.cjs} +6 -6
  12. package/dist/{chunk-BIW5IBTK.cjs.map → chunk-KKJS3J3C.cjs.map} +1 -1
  13. package/dist/{chunk-6Z6T5WWS.js → chunk-MSOLVPPR.js} +4 -4
  14. package/dist/{chunk-6Z6T5WWS.js.map → chunk-MSOLVPPR.js.map} +1 -1
  15. package/dist/{chunk-CEVBQ664.cjs → chunk-U6RELZ6H.cjs} +3 -3
  16. package/dist/{chunk-CEVBQ664.cjs.map → chunk-U6RELZ6H.cjs.map} +1 -1
  17. package/dist/{chunk-TZRT26E2.js → chunk-W4QQBNJD.js} +3 -3
  18. package/dist/{chunk-TZRT26E2.js.map → chunk-W4QQBNJD.js.map} +1 -1
  19. package/dist/{chunk-3LZJNNTD.js → chunk-W4QTU3U6.js} +3 -3
  20. package/dist/{chunk-3LZJNNTD.js.map → chunk-W4QTU3U6.js.map} +1 -1
  21. package/dist/{company_service_sanity-CCbS8ElX.d.cts → company_service_sanity-Br0R7m-A.d.cts} +271 -271
  22. package/dist/{company_service_sanity-B1Xg7ISJ.d.ts → company_service_sanity-DF01qvTz.d.ts} +271 -271
  23. package/dist/components/jobCard/JobLocation.cjs +1 -1
  24. package/dist/components/jobCard/JobLocation.d.cts +1 -1
  25. package/dist/components/jobCard/JobLocation.d.ts +1 -1
  26. package/dist/components/jobCard/JobLocation.js +1 -1
  27. package/dist/components/jobPost/JobHeader.cjs +4 -4
  28. package/dist/components/jobPost/JobHeader.js +3 -3
  29. package/dist/components/jobPost/JobPost.cjs +18 -18
  30. package/dist/components/jobPost/JobPost.d.cts +1 -1
  31. package/dist/components/jobPost/JobPost.d.ts +1 -1
  32. package/dist/components/jobPost/JobPost.js +17 -17
  33. package/dist/components/primitives/command.d.cts +1 -1
  34. package/dist/components/primitives/command.d.ts +1 -1
  35. package/dist/components/ui/Combobox.cjs +4 -4
  36. package/dist/components/ui/Combobox.js +3 -3
  37. package/dist/components/ui/DatePicker.cjs +1 -1
  38. package/dist/components/ui/DatePicker.js +1 -1
  39. package/dist/components/ui/InputOtp.cjs +1 -1
  40. package/dist/components/ui/InputOtp.js +1 -1
  41. package/dist/components/ui/ModalDialog.cjs +2 -2
  42. package/dist/components/ui/ModalDialog.js +1 -1
  43. package/dist/components/ui/PlacesQueryInput.cjs +3 -3
  44. package/dist/components/ui/PlacesQueryInput.js +2 -2
  45. package/dist/{displayText-Ck0qovrl.d.cts → displayText-DM6guUAX.d.cts} +2 -2
  46. package/dist/{displayText-ClDGmi1J.d.ts → displayText-qEuo9Wam.d.ts} +2 -2
  47. package/dist/hooks/useDisplayText.d.cts +3 -3
  48. package/dist/hooks/useDisplayText.d.ts +3 -3
  49. package/dist/index.cjs +59 -59
  50. package/dist/index.d.cts +6 -6
  51. package/dist/index.d.ts +6 -6
  52. package/dist/index.js +26 -26
  53. package/dist/{job_posting_service_latest-DfX8Y4gB.d.cts → job_posting_service_latest-BXd2nu_U.d.cts} +179 -179
  54. package/dist/{job_posting_service_latest-DfX8Y4gB.d.ts → job_posting_service_latest-BXd2nu_U.d.ts} +179 -179
  55. package/dist/{job_posting_service_latest-Bk53vj02.d.cts → job_posting_service_latest-Dok46B7B.d.cts} +179 -179
  56. package/dist/{job_posting_service_latest-Bk53vj02.d.ts → job_posting_service_latest-Dok46B7B.d.ts} +179 -179
  57. package/dist/{job_posting_service_sanity-BSxLNte3.d.cts → job_posting_service_sanity-BEg9UHdK.d.cts} +363 -363
  58. package/dist/{job_posting_service_sanity-C6aPb8kp.d.ts → job_posting_service_sanity-BEwJ08pV.d.ts} +363 -363
  59. package/dist/lib/locations.d.cts +3 -3
  60. package/dist/lib/locations.d.ts +3 -3
  61. package/dist/lib/mappings.d.cts +3 -3
  62. package/dist/lib/mappings.d.ts +3 -3
  63. package/dist/lib/salaryRange.d.cts +1 -1
  64. package/dist/lib/salaryRange.d.ts +1 -1
  65. package/dist/services/displayText.d.cts +3 -3
  66. package/dist/services/displayText.d.ts +3 -3
  67. package/dist/types/data/company_service_latest.d.cts +1 -1
  68. package/dist/types/data/company_service_latest.d.ts +1 -1
  69. package/dist/types/data/job_posting_service_latest.d.cts +1 -1
  70. package/dist/types/data/job_posting_service_latest.d.ts +1 -1
  71. package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
  72. package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
  73. package/dist/types/index.d.cts +5 -5
  74. package/dist/types/index.d.ts +5 -5
  75. package/dist/types/latest/company_service_latest.d.cts +1 -1
  76. package/dist/types/latest/company_service_latest.d.ts +1 -1
  77. package/dist/types/latest/custom/company_service_sanity.d.cts +3 -3
  78. package/dist/types/latest/custom/company_service_sanity.d.ts +3 -3
  79. package/dist/types/latest/custom/job_posting_service_sanity.d.cts +3 -3
  80. package/dist/types/latest/custom/job_posting_service_sanity.d.ts +3 -3
  81. package/dist/types/latest/job_posting_service_latest.d.cts +1 -1
  82. package/dist/types/latest/job_posting_service_latest.d.ts +1 -1
  83. package/dist/types/latest/shared_pickle_output_latest.d.cts +1 -1
  84. package/dist/types/latest/shared_pickle_output_latest.d.ts +1 -1
  85. package/package.json +1 -1
  86. package/dist/{company_service_latest-CVgoQ8Mc.d.cts → company_service_latest-C7Moeufo.d.cts} +174 -174
  87. package/dist/{company_service_latest-CVgoQ8Mc.d.ts → company_service_latest-C7Moeufo.d.ts} +174 -174
  88. package/dist/{company_service_latest-oWEnaiRd.d.cts → company_service_latest-CITz7F53.d.cts} +174 -174
  89. package/dist/{company_service_latest-oWEnaiRd.d.ts → company_service_latest-CITz7F53.d.ts} +174 -174
  90. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.ts → shared_pickle_output_latest--XZhOUyE.d.cts} +11 -11
  91. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.cts → shared_pickle_output_latest--XZhOUyE.d.ts} +11 -11
  92. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.cts → shared_pickle_output_latest-DKOmTyYk.d.cts} +11 -11
  93. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.ts → shared_pickle_output_latest-DKOmTyYk.d.ts} +11 -11
@@ -53,7 +53,7 @@ function ModalDialog({
53
53
  ]
54
54
  }
55
55
  ),
56
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkMGWZXPMF_cjs.cn("p-6", classNames?.body), children }),
56
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkMGWZXPMF_cjs.cn("px-6", classNames?.body), children }),
57
57
  footer && (footer.primary || footer.secondary || footer.tertiary) && /* @__PURE__ */ jsxRuntime.jsxs(
58
58
  chunkZILKCCXQ_cjs.DialogFooter,
59
59
  {
@@ -108,5 +108,5 @@ function ModalDialog({
108
108
  }
109
109
 
110
110
  exports.ModalDialog = ModalDialog;
111
- //# sourceMappingURL=chunk-FE76CE2N.cjs.map
112
- //# sourceMappingURL=chunk-FE76CE2N.cjs.map
111
+ //# sourceMappingURL=chunk-5EUHR4DQ.cjs.map
112
+ //# sourceMappingURL=chunk-5EUHR4DQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/ModalDialog.tsx"],"names":["jsx","Dialog","jsxs","DialogContent","cn","DialogHeader","DialogTitle","DialogDescription","DialogClose","X","DialogFooter","Button"],"mappings":"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","file":"chunk-FE76CE2N.cjs","sourcesContent":["'use client'\n\nimport { X } from 'lucide-react'\nimport { type ReactNode } from 'react'\n\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/primitives/dialog'\nimport { Button } from '@/components/ui/Button'\nimport { cn } from '@/lib/utils'\n\ntype FooterButton = {\n text: string\n onClick: () => void\n variant?: 'primary' | 'secondary' | 'neutral' | 'link'\n size?: 'extra-small' | 'small' | 'medium' | 'large'\n disabled?: boolean\n isLoading?: boolean\n className?: string\n}\n\ntype ModalDialogProps = Readonly<{\n isOpen: boolean\n onOpenChange?: (open: boolean) => void\n onClose?: () => void\n isSubmitting?: boolean\n title: string\n titleIcon?: ReactNode\n description?: ReactNode\n children: ReactNode\n footer?: {\n primary?: FooterButton\n secondary?: FooterButton\n tertiary?: FooterButton\n }\n classNames?: {\n content?: string\n header?: string\n title?: string\n description?: string\n footer?: string\n body?: string\n }\n}>\n\n/**\n * Reusable modal dialog component using Radix UI Dialog\n * Features:\n * - Escape key handling (built into Dialog)\n * - Backdrop click to close (built into Dialog)\n * - Close button with X icon\n * - Accessible with ARIA attributes\n * - Customizable container classNames\n * - Prevents closing when isSubmitting is true\n */\nexport function ModalDialog({\n isOpen,\n onOpenChange,\n onClose,\n isSubmitting = false,\n title,\n titleIcon,\n description,\n children,\n footer,\n classNames,\n}: ModalDialogProps) {\n const handleOpenChange = (open: boolean) => {\n // Prevent closing when submitting\n if (!open && isSubmitting) {\n return\n }\n\n // Call onOpenChange if provided (for boolean-based API)\n if (onOpenChange) {\n onOpenChange(open)\n return\n }\n\n // Call onClose if provided (for callback-based API)\n if (!open && onClose) {\n onClose()\n }\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogContent className={cn('flex flex-col', classNames?.content)}>\n <DialogHeader\n className={cn(\n 'flex flex-row items-center justify-between gap-2 border-b border-grey-10 px-6 py-4',\n classNames?.header\n )}\n >\n <div className=\"flex flex-col gap-1\">\n <DialogTitle className={cn(classNames?.title)}>\n {titleIcon && (\n <div className=\"flex flex-row items-center gap-2\">\n {titleIcon}\n <span>{title}</span>\n </div>\n )}\n {!titleIcon && title}\n </DialogTitle>\n {description ? (\n <DialogDescription className={cn(classNames?.description)}>\n {description}\n </DialogDescription>\n ) : (\n <DialogDescription className=\"sr-only\">No description provided</DialogDescription>\n )}\n </div>\n <DialogClose disabled={isSubmitting} className=\"m-0\" aria-label=\"Close\">\n <X className=\"h-5 w-5\" />\n </DialogClose>\n </DialogHeader>\n\n <div className={cn('p-6', classNames?.body)}>{children}</div>\n\n {footer && (footer.primary || footer.secondary || footer.tertiary) && (\n <DialogFooter\n className={cn(\n 'flex items-center gap-2 border-t border-grey-10 px-6 py-4',\n classNames?.footer\n )}\n >\n {footer.tertiary && (\n <Button\n type=\"button\"\n size={footer.tertiary.size || 'small'}\n variant={footer.tertiary.variant || 'link'}\n onClick={footer.tertiary.onClick}\n disabled={footer.tertiary.disabled || isSubmitting}\n isLoading={footer.tertiary.isLoading}\n className={cn('w-auto', footer.tertiary.className)}\n >\n {footer.tertiary.text}\n </Button>\n )}\n {footer.secondary && (\n <Button\n type=\"button\"\n size={footer.secondary.size || 'small'}\n variant={footer.secondary.variant || 'neutral'}\n onClick={footer.secondary.onClick}\n disabled={footer.secondary.disabled || isSubmitting}\n isLoading={footer.secondary.isLoading}\n className={cn('w-auto', footer.secondary.className)}\n >\n {footer.secondary.text}\n </Button>\n )}\n {footer.primary && (\n <Button\n type=\"button\"\n size={footer.primary.size || 'small'}\n variant={footer.primary.variant || 'primary'}\n onClick={footer.primary.onClick}\n disabled={footer.primary.disabled || isSubmitting}\n isLoading={footer.primary.isLoading}\n className={cn('w-auto', footer.primary.className)}\n >\n {footer.primary.text}\n </Button>\n )}\n </DialogFooter>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ui/ModalDialog.tsx"],"names":["jsx","Dialog","jsxs","DialogContent","cn","DialogHeader","DialogTitle","DialogDescription","DialogClose","X","DialogFooter","Button"],"mappings":";;;;;;;;AA6DO,SAAS,WAAY,CAAA;AAAA,EAC1B,MAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAe,GAAA,KAAA;AAAA,EACf,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAqB,EAAA;AACnB,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAAkB,KAAA;AAE1C,IAAI,IAAA,CAAC,QAAQ,YAAc,EAAA;AACzB,MAAA;AAAA;AAIF,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA;AAAA;AAIF,IAAI,IAAA,CAAC,QAAQ,OAAS,EAAA;AACpB,MAAQ,OAAA,EAAA;AAAA;AACV,GACF;AAEA,EAAA,uBACGA,cAAA,CAAAC,wBAAA,EAAA,EAAO,IAAM,EAAA,MAAA,EAAQ,YAAc,EAAA,gBAAA,EAClC,QAAC,kBAAAC,eAAA,CAAAC,+BAAA,EAAA,EAAc,SAAW,EAAAC,oBAAA,CAAG,eAAiB,EAAA,UAAA,EAAY,OAAO,CAC/D,EAAA,QAAA,EAAA;AAAA,oBAAAF,eAAA;AAAA,MAACG,8BAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAAD,oBAAA;AAAA,UACT,oFAAA;AAAA,UACA,UAAY,EAAA;AAAA,SACd;AAAA,QAEA,QAAA,EAAA;AAAA,0BAACF,eAAA,CAAA,KAAA,EAAA,EAAI,WAAU,qBACb,EAAA,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAACI,6BAAY,EAAA,EAAA,SAAA,EAAWF,oBAAG,CAAA,UAAA,EAAY,KAAK,CACzC,EAAA,QAAA,EAAA;AAAA,cACC,SAAA,oBAAAF,eAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,kCACZ,EAAA,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gCACDF,cAAA,CAAC,UAAM,QAAM,EAAA,KAAA,EAAA;AAAA,eACf,EAAA,CAAA;AAAA,cAED,CAAC,SAAa,IAAA;AAAA,aACjB,EAAA,CAAA;AAAA,YACC,WACC,mBAAAA,cAAA,CAACO,mCAAkB,EAAA,EAAA,SAAA,EAAWH,qBAAG,UAAY,EAAA,WAAW,CACrD,EAAA,QAAA,EAAA,WAAA,EACH,CAEA,mBAAAJ,cAAA,CAACO,mCAAkB,EAAA,EAAA,SAAA,EAAU,WAAU,QAAuB,EAAA,yBAAA,EAAA;AAAA,WAElE,EAAA,CAAA;AAAA,0BACCP,cAAA,CAAAQ,6BAAA,EAAA,EAAY,QAAU,EAAA,YAAA,EAAc,SAAU,EAAA,KAAA,EAAM,YAAW,EAAA,OAAA,EAC9D,QAAC,kBAAAR,cAAA,CAAAS,aAAA,EAAA,EAAE,SAAU,EAAA,SAAA,EAAU,CACzB,EAAA;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAT,cAAA,CAAC,SAAI,SAAW,EAAAI,oBAAA,CAAG,QAAQ,UAAY,EAAA,IAAI,GAAI,QAAS,EAAA,CAAA;AAAA,IAEvD,WAAW,MAAO,CAAA,OAAA,IAAW,MAAO,CAAA,SAAA,IAAa,OAAO,QACvD,CAAA,oBAAAF,eAAA;AAAA,MAACQ,8BAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAAN,oBAAA;AAAA,UACT,2DAAA;AAAA,UACA,UAAY,EAAA;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,QACN,oBAAAJ,cAAA;AAAA,YAACW,wBAAA;AAAA,YAAA;AAAA,cACC,IAAK,EAAA,QAAA;AAAA,cACL,IAAA,EAAM,MAAO,CAAA,QAAA,CAAS,IAAQ,IAAA,OAAA;AAAA,cAC9B,OAAA,EAAS,MAAO,CAAA,QAAA,CAAS,OAAW,IAAA,MAAA;AAAA,cACpC,OAAA,EAAS,OAAO,QAAS,CAAA,OAAA;AAAA,cACzB,QAAA,EAAU,MAAO,CAAA,QAAA,CAAS,QAAY,IAAA,YAAA;AAAA,cACtC,SAAA,EAAW,OAAO,QAAS,CAAA,SAAA;AAAA,cAC3B,SAAW,EAAAP,oBAAA,CAAG,QAAU,EAAA,MAAA,CAAO,SAAS,SAAS,CAAA;AAAA,cAEhD,iBAAO,QAAS,CAAA;AAAA;AAAA,WACnB;AAAA,UAED,OAAO,SACN,oBAAAJ,cAAA;AAAA,YAACW,wBAAA;AAAA,YAAA;AAAA,cACC,IAAK,EAAA,QAAA;AAAA,cACL,IAAA,EAAM,MAAO,CAAA,SAAA,CAAU,IAAQ,IAAA,OAAA;AAAA,cAC/B,OAAA,EAAS,MAAO,CAAA,SAAA,CAAU,OAAW,IAAA,SAAA;AAAA,cACrC,OAAA,EAAS,OAAO,SAAU,CAAA,OAAA;AAAA,cAC1B,QAAA,EAAU,MAAO,CAAA,SAAA,CAAU,QAAY,IAAA,YAAA;AAAA,cACvC,SAAA,EAAW,OAAO,SAAU,CAAA,SAAA;AAAA,cAC5B,SAAW,EAAAP,oBAAA,CAAG,QAAU,EAAA,MAAA,CAAO,UAAU,SAAS,CAAA;AAAA,cAEjD,iBAAO,SAAU,CAAA;AAAA;AAAA,WACpB;AAAA,UAED,OAAO,OACN,oBAAAJ,cAAA;AAAA,YAACW,wBAAA;AAAA,YAAA;AAAA,cACC,IAAK,EAAA,QAAA;AAAA,cACL,IAAA,EAAM,MAAO,CAAA,OAAA,CAAQ,IAAQ,IAAA,OAAA;AAAA,cAC7B,OAAA,EAAS,MAAO,CAAA,OAAA,CAAQ,OAAW,IAAA,SAAA;AAAA,cACnC,OAAA,EAAS,OAAO,OAAQ,CAAA,OAAA;AAAA,cACxB,QAAA,EAAU,MAAO,CAAA,OAAA,CAAQ,QAAY,IAAA,YAAA;AAAA,cACrC,SAAA,EAAW,OAAO,OAAQ,CAAA,SAAA;AAAA,cAC1B,SAAW,EAAAP,oBAAA,CAAG,QAAU,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,cAE/C,iBAAO,OAAQ,CAAA;AAAA;AAAA;AAClB;AAAA;AAAA;AAEJ,GAAA,EAEJ,CACF,EAAA,CAAA;AAEJ","file":"chunk-5EUHR4DQ.cjs","sourcesContent":["'use client'\n\nimport { X } from 'lucide-react'\nimport { type ReactNode } from 'react'\n\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/primitives/dialog'\nimport { Button } from '@/components/ui/Button'\nimport { cn } from '@/lib/utils'\n\ntype FooterButton = {\n text: string\n onClick: () => void\n variant?: 'primary' | 'secondary' | 'neutral' | 'link'\n size?: 'extra-small' | 'small' | 'medium' | 'large'\n disabled?: boolean\n isLoading?: boolean\n className?: string\n}\n\ntype ModalDialogProps = Readonly<{\n isOpen: boolean\n onOpenChange?: (open: boolean) => void\n onClose?: () => void\n isSubmitting?: boolean\n title: string\n titleIcon?: ReactNode\n description?: ReactNode\n children: ReactNode\n footer?: {\n primary?: FooterButton\n secondary?: FooterButton\n tertiary?: FooterButton\n }\n classNames?: {\n content?: string\n header?: string\n title?: string\n description?: string\n footer?: string\n body?: string\n }\n}>\n\n/**\n * Reusable modal dialog component using Radix UI Dialog\n * Features:\n * - Escape key handling (built into Dialog)\n * - Backdrop click to close (built into Dialog)\n * - Close button with X icon\n * - Accessible with ARIA attributes\n * - Customizable container classNames\n * - Prevents closing when isSubmitting is true\n */\nexport function ModalDialog({\n isOpen,\n onOpenChange,\n onClose,\n isSubmitting = false,\n title,\n titleIcon,\n description,\n children,\n footer,\n classNames,\n}: ModalDialogProps) {\n const handleOpenChange = (open: boolean) => {\n // Prevent closing when submitting\n if (!open && isSubmitting) {\n return\n }\n\n // Call onOpenChange if provided (for boolean-based API)\n if (onOpenChange) {\n onOpenChange(open)\n return\n }\n\n // Call onClose if provided (for callback-based API)\n if (!open && onClose) {\n onClose()\n }\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogContent className={cn('flex flex-col', classNames?.content)}>\n <DialogHeader\n className={cn(\n 'flex flex-row items-center justify-between gap-2 border-b border-grey-10 px-6 py-4',\n classNames?.header\n )}\n >\n <div className=\"flex flex-col gap-1\">\n <DialogTitle className={cn(classNames?.title)}>\n {titleIcon && (\n <div className=\"flex flex-row items-center gap-2\">\n {titleIcon}\n <span>{title}</span>\n </div>\n )}\n {!titleIcon && title}\n </DialogTitle>\n {description ? (\n <DialogDescription className={cn(classNames?.description)}>\n {description}\n </DialogDescription>\n ) : (\n <DialogDescription className=\"sr-only\">No description provided</DialogDescription>\n )}\n </div>\n <DialogClose disabled={isSubmitting} className=\"m-0\" aria-label=\"Close\">\n <X className=\"h-5 w-5\" />\n </DialogClose>\n </DialogHeader>\n\n <div className={cn('px-6', classNames?.body)}>{children}</div>\n\n {footer && (footer.primary || footer.secondary || footer.tertiary) && (\n <DialogFooter\n className={cn(\n 'flex items-center gap-2 border-t border-grey-10 px-6 py-4',\n classNames?.footer\n )}\n >\n {footer.tertiary && (\n <Button\n type=\"button\"\n size={footer.tertiary.size || 'small'}\n variant={footer.tertiary.variant || 'link'}\n onClick={footer.tertiary.onClick}\n disabled={footer.tertiary.disabled || isSubmitting}\n isLoading={footer.tertiary.isLoading}\n className={cn('w-auto', footer.tertiary.className)}\n >\n {footer.tertiary.text}\n </Button>\n )}\n {footer.secondary && (\n <Button\n type=\"button\"\n size={footer.secondary.size || 'small'}\n variant={footer.secondary.variant || 'neutral'}\n onClick={footer.secondary.onClick}\n disabled={footer.secondary.disabled || isSubmitting}\n isLoading={footer.secondary.isLoading}\n className={cn('w-auto', footer.secondary.className)}\n >\n {footer.secondary.text}\n </Button>\n )}\n {footer.primary && (\n <Button\n type=\"button\"\n size={footer.primary.size || 'small'}\n variant={footer.primary.variant || 'primary'}\n onClick={footer.primary.onClick}\n disabled={footer.primary.disabled || isSubmitting}\n isLoading={footer.primary.isLoading}\n className={cn('w-auto', footer.primary.className)}\n >\n {footer.primary.text}\n </Button>\n )}\n </DialogFooter>\n )}\n </DialogContent>\n </Dialog>\n )\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkW2UGL7QI_cjs = require('./chunk-W2UGL7QI.cjs');
4
3
  var chunk6BFFHI2V_cjs = require('./chunk-6BFFHI2V.cjs');
4
+ var chunkW2UGL7QI_cjs = require('./chunk-W2UGL7QI.cjs');
5
+ var chunkSMDQTPJE_cjs = require('./chunk-SMDQTPJE.cjs');
5
6
  var chunkHD3VN7GE_cjs = require('./chunk-HD3VN7GE.cjs');
6
7
  var chunkMGWZXPMF_cjs = require('./chunk-MGWZXPMF.cjs');
7
- var chunkSMDQTPJE_cjs = require('./chunk-SMDQTPJE.cjs');
8
8
  var lucideReact = require('lucide-react');
9
9
  var Image = require('next/image');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -156,5 +156,5 @@ function JobHeader({
156
156
  }
157
157
 
158
158
  exports.JobHeader = JobHeader;
159
- //# sourceMappingURL=chunk-TOEADI6J.cjs.map
160
- //# sourceMappingURL=chunk-TOEADI6J.cjs.map
159
+ //# sourceMappingURL=chunk-AMMLIOH5.cjs.map
160
+ //# sourceMappingURL=chunk-AMMLIOH5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/jobPost/JobHeader.tsx"],"names":["iconMap","jsx","jsxs","cn","Image","BackButton","Avatar","Dot","Chip_default"],"mappings":"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","file":"chunk-TOEADI6J.cjs","sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={`${name}-${label}`}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/jobPost/JobHeader.tsx"],"names":["iconMap","jsx","jsxs","cn","Image","BackButton","Avatar","Dot","Chip_default"],"mappings":"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","file":"chunk-AMMLIOH5.cjs","sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={`${name}-${label}`}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -3,10 +3,10 @@
3
3
  var chunkXKLOANYB_cjs = require('./chunk-XKLOANYB.cjs');
4
4
  var chunkXWQI5MC3_cjs = require('./chunk-XWQI5MC3.cjs');
5
5
  var chunkLTJXX7NG_cjs = require('./chunk-LTJXX7NG.cjs');
6
+ var chunkRKLUMDJB_cjs = require('./chunk-RKLUMDJB.cjs');
6
7
  var chunkXO6LO5CU_cjs = require('./chunk-XO6LO5CU.cjs');
7
8
  var chunkYNREEZ75_cjs = require('./chunk-YNREEZ75.cjs');
8
9
  var chunkVBLDMVVW_cjs = require('./chunk-VBLDMVVW.cjs');
9
- var chunkRKLUMDJB_cjs = require('./chunk-RKLUMDJB.cjs');
10
10
  var chunkMGWZXPMF_cjs = require('./chunk-MGWZXPMF.cjs');
11
11
  var cva = require('cva');
12
12
  var lucideReact = require('lucide-react');
@@ -220,5 +220,5 @@ var triggerVariants = cva.cva(
220
220
  );
221
221
 
222
222
  exports.Combobox = Combobox;
223
- //# sourceMappingURL=chunk-NE6KKGGM.cjs.map
224
- //# sourceMappingURL=chunk-NE6KKGGM.cjs.map
223
+ //# sourceMappingURL=chunk-CU67BLKX.cjs.map
224
+ //# sourceMappingURL=chunk-CU67BLKX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/Combobox.tsx"],"names":["forwardRef","useState","useRef","icons","useEffect","value","cn","jsx","Label_default","jsxs","Popover","PopoverTrigger","Badge","ChevronDownIcon","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","id","CommandItem","ListItem_default","Separator","CircleX","ErrorMessage_default","cva"],"mappings":"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","file":"chunk-NE6KKGGM.cjs","sourcesContent":["'use client'\n\nimport { cva, type VariantProps } from 'cva'\nimport { ChevronDownIcon, CircleX, icons } from 'lucide-react'\nimport { type ComponentProps, forwardRef, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/primitives/popover'\nimport { Separator } from '@/components/primitives/separator'\nimport { Badge } from '@/components/ui/Badge'\nimport ErrorMessage from '@/components/ui/ErrorMessage'\nimport Label from '@/components/ui/Label'\nimport ListItem from '@/components/ui/ListItem'\nimport { cn } from '@/lib/utils'\n\ntype Icon = { icon?: keyof typeof icons }\ntype LabelProps = { label?: string; description?: string }\ntype Children = { children?: (props: { close: () => void }) => JSX.Element }\ntype Option = {\n id: string\n value: string\n title: string\n description?: string\n icon?: string\n disabled?: boolean\n}\ntype ClassNames = { label?: string; trigger?: string; items?: string; content?: string }\ntype Shared = { options: Option[]; classNames?: ClassNames; placeholder?: string; error?: string }\ntype MultiSelect = { multiselect: true; value?: string[]; onChange?: (v: string[]) => void }\ntype SingleSelect = { multiselect?: false; value?: string; onChange?: (v: string) => void }\ntype TriggerVariants = VariantProps<typeof triggerVariants>\ntype SelectProps = Omit<ComponentProps<'select'>, 'value' | 'onChange' | 'size' | 'children'>\ntype Props = TriggerVariants & SelectProps & Children & Shared & Icon & LabelProps\ntype MultiSelectProps = Props & MultiSelect\ntype SingleSelectProps = Props & SingleSelect\ntype ComboboxProps = MultiSelectProps | SingleSelectProps\n\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>((props, ref) => {\n const {\n id,\n name,\n value,\n label,\n options,\n required,\n description,\n classNames,\n multiselect,\n placeholder,\n error,\n variant = 'default',\n size,\n icon,\n className,\n onChange: handleChange,\n children: footer,\n } = props\n const [selected, setSelected] = useState<Option[]>([])\n const [open, setOpen] = useState(false)\n const isUserUpdate = useRef(false)\n const IconComponent = icon && icons[icon]\n const hideSearchBox = options?.length <= 5\n const isDefault = variant === 'default'\n const isChip = variant === 'chip'\n const isEmpty = selected.length === 0\n const showChevron = isDefault ? isEmpty : true\n const close = () => setOpen(false)\n\n useEffect(() => {\n if (!isUserUpdate.current) {\n const valueArray = multiselect ? (value ?? []) : value ? [value] : []\n setSelected(\n valueArray.map((v) => options.find((o) => o.value === v)).filter((v) => v !== undefined)\n )\n }\n }, [value, options, multiselect])\n\n useEffect(() => {\n if (isUserUpdate.current) {\n if (multiselect) {\n handleChange?.(selected.map((o) => o.value))\n } else {\n handleChange?.(selected[0]?.value ?? '')\n }\n isUserUpdate.current = false\n }\n }, [selected, multiselect, handleChange])\n\n const updateMultiSelect = (prev: Option[], option: Option) => {\n return prev.some((o) => o.value === option.value)\n ? prev.filter((v) => v !== option)\n : [...prev, option]\n }\n\n const handleSelect = (value: string) => {\n const option = options.find((o) => o.value === value)\n if (!option || option.disabled) return\n\n isUserUpdate.current = true\n if (multiselect) {\n setSelected((prev) => updateMultiSelect(prev, option))\n } else {\n setSelected([option])\n close()\n }\n }\n\n const handleClear = () => {\n isUserUpdate.current = true\n setSelected([])\n }\n\n const handleDisplayValue = () => {\n const defaultLabel = !isEmpty ? selected.map((s) => s.title).join(', ') : placeholder\n return isDefault ? defaultLabel : label\n }\n\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n {isDefault && (\n <Label\n text={label}\n htmlFor={name}\n required={required}\n description={description}\n className={classNames?.label}\n />\n )}\n\n <div className=\"relative flex\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n asChild\n disabled={options.length === 0}\n data-testid={`${id ?? name}-combobox-trigger`}\n >\n <div\n ref={ref}\n className={cn(\n triggerVariants({ variant, size }),\n isDefault && !isEmpty && 'pr-10',\n classNames?.trigger\n )}\n aria-expanded={open}\n >\n {isDefault && IconComponent && <IconComponent className=\"h-4 w-4 shrink-0\" />}\n {isChip && !isEmpty && <Badge variant=\"purple\">{selected.length}</Badge>}\n\n <span\n className={cn(\n 'w-full truncate leading-normal',\n isDefault && isEmpty && 'text-grey-50'\n )}\n >\n {handleDisplayValue()}\n </span>\n\n {showChevron && (\n <ChevronDownIcon\n className=\"shrink-0 transform group-data-[state=open]:rotate-180\"\n size=\"16\"\n />\n )}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className={cn(\n 'flex w-full max-w-xs flex-col overflow-hidden p-0',\n 'max-h-[--radix-popover-content-available-height]',\n classNames?.content\n )}\n collisionPadding={8}\n sideOffset={4}\n align=\"start\"\n >\n <Command>\n {!hideSearchBox && <CommandInput placeholder=\"Search...\" />}\n\n <CommandList>\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {options.map(({ id, disabled, ...option }) => (\n <CommandItem\n key={id}\n value={option.title}\n disabled={disabled}\n onSelect={() => handleSelect(option.value)}\n className={cn(disabled && 'cursor-not-allowed opacity-50')}\n >\n <ListItem\n className={cn(classNames?.items, 'truncate py-1')}\n isSelected={selected.some((s) => s.value === option.value)}\n hasCheckbox={multiselect}\n {...option}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n\n {!!footer && <Separator />}\n {footer && footer({ close })}\n </Command>\n </PopoverContent>\n </Popover>\n\n {isDefault && !isEmpty && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-1 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n\n <ErrorMessage message={error} />\n </div>\n )\n})\nCombobox.displayName = 'Combobox'\n\nconst triggerVariants = cva(\n 'group relative cursor-pointer text-grey-80 flex flex-row items-center justify-between gap-2 border border-grey-20 focus:outline-green-80 disabled:bg-grey-5',\n {\n variants: {\n variant: {\n default: ['w-full', 'rounded-lg'],\n chip: [\n 'font-bold',\n 'rounded-3xl',\n 'data-[state=open]:bg-black',\n 'data-[state=open]:text-white',\n ],\n },\n size: {\n small: ['h-8', 'py-1', 'px-2', 'text-xs'],\n normal: ['h-9', 'py-2', 'px-3', 'text-sm'],\n large: ['h-10', 'py-2', 'px-4', 'text-base'],\n xlarge: ['h-11', 'py-3', 'px-4', 'text-base'],\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'normal',\n },\n }\n)\n"]}
1
+ {"version":3,"sources":["../src/components/ui/Combobox.tsx"],"names":["forwardRef","useState","useRef","icons","useEffect","value","cn","jsx","Label_default","jsxs","Popover","PopoverTrigger","Badge","ChevronDownIcon","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","id","CommandItem","ListItem_default","Separator","CircleX","ErrorMessage_default","cva"],"mappings":"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","file":"chunk-CU67BLKX.cjs","sourcesContent":["'use client'\n\nimport { cva, type VariantProps } from 'cva'\nimport { ChevronDownIcon, CircleX, icons } from 'lucide-react'\nimport { type ComponentProps, forwardRef, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/primitives/popover'\nimport { Separator } from '@/components/primitives/separator'\nimport { Badge } from '@/components/ui/Badge'\nimport ErrorMessage from '@/components/ui/ErrorMessage'\nimport Label from '@/components/ui/Label'\nimport ListItem from '@/components/ui/ListItem'\nimport { cn } from '@/lib/utils'\n\ntype Icon = { icon?: keyof typeof icons }\ntype LabelProps = { label?: string; description?: string }\ntype Children = { children?: (props: { close: () => void }) => JSX.Element }\ntype Option = {\n id: string\n value: string\n title: string\n description?: string\n icon?: string\n disabled?: boolean\n}\ntype ClassNames = { label?: string; trigger?: string; items?: string; content?: string }\ntype Shared = { options: Option[]; classNames?: ClassNames; placeholder?: string; error?: string }\ntype MultiSelect = { multiselect: true; value?: string[]; onChange?: (v: string[]) => void }\ntype SingleSelect = { multiselect?: false; value?: string; onChange?: (v: string) => void }\ntype TriggerVariants = VariantProps<typeof triggerVariants>\ntype SelectProps = Omit<ComponentProps<'select'>, 'value' | 'onChange' | 'size' | 'children'>\ntype Props = TriggerVariants & SelectProps & Children & Shared & Icon & LabelProps\ntype MultiSelectProps = Props & MultiSelect\ntype SingleSelectProps = Props & SingleSelect\ntype ComboboxProps = MultiSelectProps | SingleSelectProps\n\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>((props, ref) => {\n const {\n id,\n name,\n value,\n label,\n options,\n required,\n description,\n classNames,\n multiselect,\n placeholder,\n error,\n variant = 'default',\n size,\n icon,\n className,\n onChange: handleChange,\n children: footer,\n } = props\n const [selected, setSelected] = useState<Option[]>([])\n const [open, setOpen] = useState(false)\n const isUserUpdate = useRef(false)\n const IconComponent = icon && icons[icon]\n const hideSearchBox = options?.length <= 5\n const isDefault = variant === 'default'\n const isChip = variant === 'chip'\n const isEmpty = selected.length === 0\n const showChevron = isDefault ? isEmpty : true\n const close = () => setOpen(false)\n\n useEffect(() => {\n if (!isUserUpdate.current) {\n const valueArray = multiselect ? (value ?? []) : value ? [value] : []\n setSelected(\n valueArray.map((v) => options.find((o) => o.value === v)).filter((v) => v !== undefined)\n )\n }\n }, [value, options, multiselect])\n\n useEffect(() => {\n if (isUserUpdate.current) {\n if (multiselect) {\n handleChange?.(selected.map((o) => o.value))\n } else {\n handleChange?.(selected[0]?.value ?? '')\n }\n isUserUpdate.current = false\n }\n }, [selected, multiselect, handleChange])\n\n const updateMultiSelect = (prev: Option[], option: Option) => {\n return prev.some((o) => o.value === option.value)\n ? prev.filter((v) => v !== option)\n : [...prev, option]\n }\n\n const handleSelect = (value: string) => {\n const option = options.find((o) => o.value === value)\n if (!option || option.disabled) return\n\n isUserUpdate.current = true\n if (multiselect) {\n setSelected((prev) => updateMultiSelect(prev, option))\n } else {\n setSelected([option])\n close()\n }\n }\n\n const handleClear = () => {\n isUserUpdate.current = true\n setSelected([])\n }\n\n const handleDisplayValue = () => {\n const defaultLabel = !isEmpty ? selected.map((s) => s.title).join(', ') : placeholder\n return isDefault ? defaultLabel : label\n }\n\n return (\n <div className={cn('flex flex-col gap-1', className)}>\n {isDefault && (\n <Label\n text={label}\n htmlFor={name}\n required={required}\n description={description}\n className={classNames?.label}\n />\n )}\n\n <div className=\"relative flex\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n asChild\n disabled={options.length === 0}\n data-testid={`${id ?? name}-combobox-trigger`}\n >\n <div\n ref={ref}\n className={cn(\n triggerVariants({ variant, size }),\n isDefault && !isEmpty && 'pr-10',\n classNames?.trigger\n )}\n aria-expanded={open}\n >\n {isDefault && IconComponent && <IconComponent className=\"h-4 w-4 shrink-0\" />}\n {isChip && !isEmpty && <Badge variant=\"purple\">{selected.length}</Badge>}\n\n <span\n className={cn(\n 'w-full truncate leading-normal',\n isDefault && isEmpty && 'text-grey-50'\n )}\n >\n {handleDisplayValue()}\n </span>\n\n {showChevron && (\n <ChevronDownIcon\n className=\"shrink-0 transform group-data-[state=open]:rotate-180\"\n size=\"16\"\n />\n )}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className={cn(\n 'flex w-full max-w-xs flex-col overflow-hidden p-0',\n 'max-h-[--radix-popover-content-available-height]',\n classNames?.content\n )}\n collisionPadding={8}\n sideOffset={4}\n align=\"start\"\n >\n <Command>\n {!hideSearchBox && <CommandInput placeholder=\"Search...\" />}\n\n <CommandList>\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {options.map(({ id, disabled, ...option }) => (\n <CommandItem\n key={id}\n value={option.title}\n disabled={disabled}\n onSelect={() => handleSelect(option.value)}\n className={cn(disabled && 'cursor-not-allowed opacity-50')}\n >\n <ListItem\n className={cn(classNames?.items, 'truncate py-1')}\n isSelected={selected.some((s) => s.value === option.value)}\n hasCheckbox={multiselect}\n {...option}\n />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n\n {!!footer && <Separator />}\n {footer && footer({ close })}\n </Command>\n </PopoverContent>\n </Popover>\n\n {isDefault && !isEmpty && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-1 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n\n <ErrorMessage message={error} />\n </div>\n )\n})\nCombobox.displayName = 'Combobox'\n\nconst triggerVariants = cva(\n 'group relative cursor-pointer text-grey-80 flex flex-row items-center justify-between gap-2 border border-grey-20 focus:outline-green-80 disabled:bg-grey-5',\n {\n variants: {\n variant: {\n default: ['w-full', 'rounded-lg'],\n chip: [\n 'font-bold',\n 'rounded-3xl',\n 'data-[state=open]:bg-black',\n 'data-[state=open]:text-white',\n ],\n },\n size: {\n small: ['h-8', 'py-1', 'px-2', 'text-xs'],\n normal: ['h-9', 'py-2', 'px-3', 'text-sm'],\n large: ['h-10', 'py-2', 'px-4', 'text-base'],\n xlarge: ['h-11', 'py-3', 'px-4', 'text-base'],\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'normal',\n },\n }\n)\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-R73HWAYA.js';
2
- import { cn } from './chunk-2FGZQI42.js';
3
2
  import { autocomplete } from './chunk-U3D4LL6T.js';
3
+ import { cn } from './chunk-2FGZQI42.js';
4
4
  import { LoaderCircle, CircleX } from 'lucide-react';
5
5
  import { useState, useRef, useCallback, useEffect } from 'react';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -120,5 +120,5 @@ function PlacesQueryInput({
120
120
  var PlacesQueryInput_default = PlacesQueryInput;
121
121
 
122
122
  export { PlacesQueryInput_default };
123
- //# sourceMappingURL=chunk-NEKYNDRG.js.map
124
- //# sourceMappingURL=chunk-NEKYNDRG.js.map
123
+ //# sourceMappingURL=chunk-IXCAC2PV.js.map
124
+ //# sourceMappingURL=chunk-IXCAC2PV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/PlacesQueryInput.tsx"],"names":[],"mappings":"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","file":"chunk-NEKYNDRG.js","sourcesContent":["'use client'\n\nimport { type PlaceAutocompleteResult } from '@googlemaps/google-maps-services-js'\nimport { CircleX, LoaderCircle } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { autocomplete } from '@/lib/google'\nimport { cn } from '@/lib/utils'\n\n/**\n * The idea is of this type is to have a more specific type for the Place object,\n * without the repos that use it having to import the PlaceAutocompleteResult type.\n * 'place_id' can be used to query the Google Places API directly for more information about the place.\n */\nexport type Place = Pick<PlaceAutocompleteResult, 'description' | 'place_id'>\n\ntype Size = 'small' | 'normal' | 'large' | 'xlarge'\n\ninterface PlacesQueryInputProps {\n apiKey: string\n selected?: Place\n onSelect: (place?: Place) => void\n className?: string\n size?: Size\n}\n\nconst sizeClasses: Record<Size, string> = {\n small: 'h-8 text-xs',\n normal: 'h-9 text-sm',\n large: 'h-10 text-base',\n xlarge: 'h-11 text-base',\n}\n\nfunction PlacesQueryInput({\n apiKey,\n selected,\n onSelect,\n className,\n size = 'normal',\n}: Readonly<PlacesQueryInputProps>) {\n const [predictions, setPredictions] = useState<PlaceAutocompleteResult[] | null>(null)\n const [input, setInput] = useState(selected?.description ?? '')\n const [isLoadingPredictions, setIsLoadingPredictions] = useState(false)\n const [shouldOpenUpward, setShouldOpenUpward] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\n const inputRef = useRef<HTMLDivElement | null>(null)\n\n const debouncedAutocomplete = useCallback((value: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(async () => {\n try {\n if (value.length > 2) {\n setIsLoadingPredictions(true)\n const fetchedPredictions = await autocomplete(value, apiKey)\n setIsLoadingPredictions(false)\n setPredictions(fetchedPredictions ?? [])\n } else {\n setPredictions(null)\n }\n } catch (error) {\n setIsLoadingPredictions(false)\n setPredictions([])\n console.error('Autocomplete error:', error)\n }\n }, 300)\n }, [])\n\n const handleInputChange = (value: string) => {\n setInput(value)\n debouncedAutocomplete(value)\n }\n\n const handleSelect = (prediction: PlaceAutocompleteResult) => {\n onSelect(prediction)\n setPredictions(null)\n setInput(prediction.description)\n }\n\n const handleClear = () => {\n onSelect()\n setPredictions(null)\n setInput('')\n }\n\n /** Close the dropdown when the input loses focus, with the timeout to allow the user to click on a prediction.\n * */\n const handleBlur = () => setTimeout(() => setPredictions(null), 200)\n\n useEffect(() => {\n const checkDropdownPosition = () => {\n if (inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect()\n const windowHeight = window.innerHeight\n setShouldOpenUpward(rect.bottom + 200 > windowHeight)\n }\n }\n\n checkDropdownPosition()\n window.addEventListener('resize', checkDropdownPosition)\n return () => window.removeEventListener('resize', checkDropdownPosition)\n }, [])\n\n return (\n <div className={cn('relative w-full', className)} ref={inputRef} onBlur={handleBlur}>\n <Command>\n <div className=\"relative w-full\">\n <CommandInput\n placeholder=\"Type an address to search...\"\n value={input}\n onValueChange={handleInputChange}\n className={cn('truncate pr-8', sizeClasses[size])}\n />\n {isLoadingPredictions && (\n <LoaderCircle className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 animate-spin items-center justify-center rounded-full text-green-100\" />\n )}\n {input && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n {predictions && (\n <CommandList\n className={cn(\n 'absolute z-50 w-full rounded-md border bg-white shadow-lg',\n shouldOpenUpward ? 'bottom-full' : 'top-full'\n )}\n >\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {predictions.map((prediction) => (\n <CommandItem\n key={prediction.place_id}\n onSelect={() => handleSelect(prediction)}\n className=\"truncate\"\n >\n {prediction.description}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n )}\n </Command>\n </div>\n )\n}\n\nexport default PlacesQueryInput\n"]}
1
+ {"version":3,"sources":["../src/components/ui/PlacesQueryInput.tsx"],"names":[],"mappings":"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","file":"chunk-IXCAC2PV.js","sourcesContent":["'use client'\n\nimport { type PlaceAutocompleteResult } from '@googlemaps/google-maps-services-js'\nimport { CircleX, LoaderCircle } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { autocomplete } from '@/lib/google'\nimport { cn } from '@/lib/utils'\n\n/**\n * The idea is of this type is to have a more specific type for the Place object,\n * without the repos that use it having to import the PlaceAutocompleteResult type.\n * 'place_id' can be used to query the Google Places API directly for more information about the place.\n */\nexport type Place = Pick<PlaceAutocompleteResult, 'description' | 'place_id'>\n\ntype Size = 'small' | 'normal' | 'large' | 'xlarge'\n\ninterface PlacesQueryInputProps {\n apiKey: string\n selected?: Place\n onSelect: (place?: Place) => void\n className?: string\n size?: Size\n}\n\nconst sizeClasses: Record<Size, string> = {\n small: 'h-8 text-xs',\n normal: 'h-9 text-sm',\n large: 'h-10 text-base',\n xlarge: 'h-11 text-base',\n}\n\nfunction PlacesQueryInput({\n apiKey,\n selected,\n onSelect,\n className,\n size = 'normal',\n}: Readonly<PlacesQueryInputProps>) {\n const [predictions, setPredictions] = useState<PlaceAutocompleteResult[] | null>(null)\n const [input, setInput] = useState(selected?.description ?? '')\n const [isLoadingPredictions, setIsLoadingPredictions] = useState(false)\n const [shouldOpenUpward, setShouldOpenUpward] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\n const inputRef = useRef<HTMLDivElement | null>(null)\n\n const debouncedAutocomplete = useCallback((value: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(async () => {\n try {\n if (value.length > 2) {\n setIsLoadingPredictions(true)\n const fetchedPredictions = await autocomplete(value, apiKey)\n setIsLoadingPredictions(false)\n setPredictions(fetchedPredictions ?? [])\n } else {\n setPredictions(null)\n }\n } catch (error) {\n setIsLoadingPredictions(false)\n setPredictions([])\n console.error('Autocomplete error:', error)\n }\n }, 300)\n }, [])\n\n const handleInputChange = (value: string) => {\n setInput(value)\n debouncedAutocomplete(value)\n }\n\n const handleSelect = (prediction: PlaceAutocompleteResult) => {\n onSelect(prediction)\n setPredictions(null)\n setInput(prediction.description)\n }\n\n const handleClear = () => {\n onSelect()\n setPredictions(null)\n setInput('')\n }\n\n /** Close the dropdown when the input loses focus, with the timeout to allow the user to click on a prediction.\n * */\n const handleBlur = () => setTimeout(() => setPredictions(null), 200)\n\n useEffect(() => {\n const checkDropdownPosition = () => {\n if (inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect()\n const windowHeight = window.innerHeight\n setShouldOpenUpward(rect.bottom + 200 > windowHeight)\n }\n }\n\n checkDropdownPosition()\n window.addEventListener('resize', checkDropdownPosition)\n return () => window.removeEventListener('resize', checkDropdownPosition)\n }, [])\n\n return (\n <div className={cn('relative w-full', className)} ref={inputRef} onBlur={handleBlur}>\n <Command>\n <div className=\"relative w-full\">\n <CommandInput\n placeholder=\"Type an address to search...\"\n value={input}\n onValueChange={handleInputChange}\n className={cn('truncate pr-8', sizeClasses[size])}\n />\n {isLoadingPredictions && (\n <LoaderCircle className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 animate-spin items-center justify-center rounded-full text-green-100\" />\n )}\n {input && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n {predictions && (\n <CommandList\n className={cn(\n 'absolute z-50 w-full rounded-md border bg-white shadow-lg',\n shouldOpenUpward ? 'bottom-full' : 'top-full'\n )}\n >\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {predictions.map((prediction) => (\n <CommandItem\n key={prediction.place_id}\n onSelect={() => handleSelect(prediction)}\n className=\"truncate\"\n >\n {prediction.description}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n )}\n </Command>\n </div>\n )\n}\n\nexport default PlacesQueryInput\n"]}
@@ -1,12 +1,12 @@
1
- import { JobDescription } from './chunk-5NQTYPZG.js';
2
- import { JobHeader } from './chunk-6Z6T5WWS.js';
3
1
  import { CompanyInformation } from './chunk-J3UEZGEG.js';
4
2
  import { CompanyTake } from './chunk-MF24QPA6.js';
3
+ import { JobDescription } from './chunk-5NQTYPZG.js';
4
+ import { JobHeader } from './chunk-MSOLVPPR.js';
5
+ import { getAddressList } from './chunk-KZBS5RNE.js';
5
6
  import { salaryRange } from './chunk-PLPEZUCB.js';
6
7
  import { cn } from './chunk-2FGZQI42.js';
7
8
  import { CompanyBenefits } from './chunk-BLMWXMW4.js';
8
9
  import { useDisplayText } from './chunk-K76RPF2X.js';
9
- import { getAddressList } from './chunk-KZBS5RNE.js';
10
10
  import * as DateFns from 'date-fns';
11
11
  import { jsxs, jsx } from 'react/jsx-runtime';
12
12
 
@@ -111,5 +111,5 @@ function JobPost({
111
111
  }
112
112
 
113
113
  export { JobPost };
114
- //# sourceMappingURL=chunk-TAQTWTKL.js.map
115
- //# sourceMappingURL=chunk-TAQTWTKL.js.map
114
+ //# sourceMappingURL=chunk-JGZ2TDX4.js.map
115
+ //# sourceMappingURL=chunk-JGZ2TDX4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/jobPost/JobPost.tsx"],"names":[],"mappings":"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","file":"chunk-TAQTWTKL.js","sourcesContent":["'use client'\n\nimport * as DateFns from 'date-fns'\nimport { type ReactNode } from 'react'\n\nimport { CompanyBenefits } from '@/components/company/CompanyBenefits'\nimport { CompanyInformation } from '@/components/company/CompanyInformation'\nimport { CompanyTake } from '@/components/company/CompanyTake'\nimport { JobDescription } from '@/components/jobPost/JobDescription'\nimport { JobHeader } from '@/components/jobPost/JobHeader'\nimport { useDisplayText } from '@/hooks/useDisplayText'\nimport { getAddressList } from '@/lib/locations'\nimport { salaryRange } from '@/lib/salaryRange'\nimport { cn } from '@/lib/utils'\nimport { type JobPostModel } from '@/types/data/job_posting_service_latest'\n\nexport type JobPostProps = {\n job: JobPostModel\n bannerSrc: string\n avatarSrc?: string\n standalone?: boolean\n avatarHref?: string\n fallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n}\n\nexport function JobPost({\n job,\n bannerSrc,\n avatarSrc,\n standalone,\n avatarHref,\n fallbackHref,\n backAcceptedRoutes,\n actions,\n}: Readonly<JobPostProps>) {\n const formattedEmploymentType = useDisplayText('employmentType', job.employmentType)\n const formattedEmploymentLevel = useDisplayText('employmentLevel', job.employmentLevel)\n const formattedJobFunction = useDisplayText('jobFunction', job.jobFunction)\n const formattedLocations = getAddressList(job)\n const formattedSalary = salaryRange(job.estimatedSalary)\n const formattedDate = DateFns.formatDistanceToNow(new Date(job.datePosted as string), {\n addSuffix: true,\n })\n\n const tags = [\n !!formattedSalary && {\n icon: 'banknote' as const,\n name: 'salary',\n label: formattedSalary,\n },\n !!formattedEmploymentType && {\n icon: 'briefcase-business' as const,\n name: 'employmentType',\n label: formattedEmploymentType,\n },\n !!formattedEmploymentLevel && {\n icon: 'circle-user' as const,\n name: 'level',\n label: formattedEmploymentLevel,\n },\n !!formattedJobFunction && {\n icon: 'briefcase-business' as const,\n name: 'jobFunction',\n label: formattedJobFunction,\n },\n ...formattedLocations.map((label) => ({\n icon: 'map-pin' as const,\n name: 'location',\n label,\n })),\n ].filter((t) => !!t)\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-10 pb-4',\n !standalone && 'border-1 rounded-3xl border-grey-5'\n )}\n >\n <JobHeader\n title={job.title}\n bannerSrc={bannerSrc}\n avatarName={job.hiringOrganization?.companyName}\n avatarSrc={job.hiringOrganization?.logo?.asset?.url}\n subtitles={[job.hiringOrganization?.companyName ?? '', `Posted ${formattedDate}`]}\n actions={actions}\n standalone={standalone}\n avatarHref={avatarHref}\n backFallbackHref={fallbackHref}\n backAcceptedRoutes={backAcceptedRoutes}\n tags={tags}\n />\n\n <div className=\"flex flex-col gap-8 px-6\">\n <JobDescription description={job.description} />\n\n <CompanyTake\n avatarSrc={avatarSrc}\n content={job.hiringOrganization?.companyNDG?.companyNDGTake}\n />\n\n <CompanyInformation\n name={job.hiringOrganization?.companyName ?? ''}\n how={job.hiringOrganization?.companyPhilosophy?.companyHow}\n mission={job.hiringOrganization?.companyPhilosophy?.companyMission}\n wow={job.hiringOrganization?.companyNDG?.companyWow}\n website={job.hiringOrganization?.companyWebsite}\n />\n\n <CompanyBenefits\n benefits={job.hiringOrganization?.companyCareers?.companyBenefits\n ?.map((b) => b.title)\n .filter((d) => d !== undefined)}\n />\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/jobPost/JobPost.tsx"],"names":[],"mappings":"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","file":"chunk-JGZ2TDX4.js","sourcesContent":["'use client'\n\nimport * as DateFns from 'date-fns'\nimport { type ReactNode } from 'react'\n\nimport { CompanyBenefits } from '@/components/company/CompanyBenefits'\nimport { CompanyInformation } from '@/components/company/CompanyInformation'\nimport { CompanyTake } from '@/components/company/CompanyTake'\nimport { JobDescription } from '@/components/jobPost/JobDescription'\nimport { JobHeader } from '@/components/jobPost/JobHeader'\nimport { useDisplayText } from '@/hooks/useDisplayText'\nimport { getAddressList } from '@/lib/locations'\nimport { salaryRange } from '@/lib/salaryRange'\nimport { cn } from '@/lib/utils'\nimport { type JobPostModel } from '@/types/data/job_posting_service_latest'\n\nexport type JobPostProps = {\n job: JobPostModel\n bannerSrc: string\n avatarSrc?: string\n standalone?: boolean\n avatarHref?: string\n fallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n}\n\nexport function JobPost({\n job,\n bannerSrc,\n avatarSrc,\n standalone,\n avatarHref,\n fallbackHref,\n backAcceptedRoutes,\n actions,\n}: Readonly<JobPostProps>) {\n const formattedEmploymentType = useDisplayText('employmentType', job.employmentType)\n const formattedEmploymentLevel = useDisplayText('employmentLevel', job.employmentLevel)\n const formattedJobFunction = useDisplayText('jobFunction', job.jobFunction)\n const formattedLocations = getAddressList(job)\n const formattedSalary = salaryRange(job.estimatedSalary)\n const formattedDate = DateFns.formatDistanceToNow(new Date(job.datePosted as string), {\n addSuffix: true,\n })\n\n const tags = [\n !!formattedSalary && {\n icon: 'banknote' as const,\n name: 'salary',\n label: formattedSalary,\n },\n !!formattedEmploymentType && {\n icon: 'briefcase-business' as const,\n name: 'employmentType',\n label: formattedEmploymentType,\n },\n !!formattedEmploymentLevel && {\n icon: 'circle-user' as const,\n name: 'level',\n label: formattedEmploymentLevel,\n },\n !!formattedJobFunction && {\n icon: 'briefcase-business' as const,\n name: 'jobFunction',\n label: formattedJobFunction,\n },\n ...formattedLocations.map((label) => ({\n icon: 'map-pin' as const,\n name: 'location',\n label,\n })),\n ].filter((t) => !!t)\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-10 pb-4',\n !standalone && 'border-1 rounded-3xl border-grey-5'\n )}\n >\n <JobHeader\n title={job.title}\n bannerSrc={bannerSrc}\n avatarName={job.hiringOrganization?.companyName}\n avatarSrc={job.hiringOrganization?.logo?.asset?.url}\n subtitles={[job.hiringOrganization?.companyName ?? '', `Posted ${formattedDate}`]}\n actions={actions}\n standalone={standalone}\n avatarHref={avatarHref}\n backFallbackHref={fallbackHref}\n backAcceptedRoutes={backAcceptedRoutes}\n tags={tags}\n />\n\n <div className=\"flex flex-col gap-8 px-6\">\n <JobDescription description={job.description} />\n\n <CompanyTake\n avatarSrc={avatarSrc}\n content={job.hiringOrganization?.companyNDG?.companyNDGTake}\n />\n\n <CompanyInformation\n name={job.hiringOrganization?.companyName ?? ''}\n how={job.hiringOrganization?.companyPhilosophy?.companyHow}\n mission={job.hiringOrganization?.companyPhilosophy?.companyMission}\n wow={job.hiringOrganization?.companyNDG?.companyWow}\n website={job.hiringOrganization?.companyWebsite}\n />\n\n <CompanyBenefits\n benefits={job.hiringOrganization?.companyCareers?.companyBenefits\n ?.map((b) => b.title)\n .filter((d) => d !== undefined)}\n />\n </div>\n </div>\n )\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunkQRMNGILI_cjs = require('./chunk-QRMNGILI.cjs');
4
- var chunkTOEADI6J_cjs = require('./chunk-TOEADI6J.cjs');
5
3
  var chunkDWB5TTR6_cjs = require('./chunk-DWB5TTR6.cjs');
6
4
  var chunk46HHHYSV_cjs = require('./chunk-46HHHYSV.cjs');
5
+ var chunkQRMNGILI_cjs = require('./chunk-QRMNGILI.cjs');
6
+ var chunkAMMLIOH5_cjs = require('./chunk-AMMLIOH5.cjs');
7
+ var chunkXAPQTBJR_cjs = require('./chunk-XAPQTBJR.cjs');
7
8
  var chunkGQNVPLSG_cjs = require('./chunk-GQNVPLSG.cjs');
8
9
  var chunkMGWZXPMF_cjs = require('./chunk-MGWZXPMF.cjs');
9
10
  var chunk4LUPQO4R_cjs = require('./chunk-4LUPQO4R.cjs');
10
11
  var chunk567FG76G_cjs = require('./chunk-567FG76G.cjs');
11
- var chunkXAPQTBJR_cjs = require('./chunk-XAPQTBJR.cjs');
12
12
  var DateFns = require('date-fns');
13
13
  var jsxRuntime = require('react/jsx-runtime');
14
14
 
@@ -86,7 +86,7 @@ function JobPost({
86
86
  ),
87
87
  children: [
88
88
  /* @__PURE__ */ jsxRuntime.jsx(
89
- chunkTOEADI6J_cjs.JobHeader,
89
+ chunkAMMLIOH5_cjs.JobHeader,
90
90
  {
91
91
  title: job.title,
92
92
  bannerSrc,
@@ -133,5 +133,5 @@ function JobPost({
133
133
  }
134
134
 
135
135
  exports.JobPost = JobPost;
136
- //# sourceMappingURL=chunk-BIW5IBTK.cjs.map
137
- //# sourceMappingURL=chunk-BIW5IBTK.cjs.map
136
+ //# sourceMappingURL=chunk-KKJS3J3C.cjs.map
137
+ //# sourceMappingURL=chunk-KKJS3J3C.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/jobPost/JobPost.tsx"],"names":["useDisplayText","getAddressList","salaryRange","DateFns","jsxs","cn","jsx","JobHeader","JobDescription","CompanyTake","CompanyInformation","CompanyBenefits"],"mappings":"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","file":"chunk-BIW5IBTK.cjs","sourcesContent":["'use client'\n\nimport * as DateFns from 'date-fns'\nimport { type ReactNode } from 'react'\n\nimport { CompanyBenefits } from '@/components/company/CompanyBenefits'\nimport { CompanyInformation } from '@/components/company/CompanyInformation'\nimport { CompanyTake } from '@/components/company/CompanyTake'\nimport { JobDescription } from '@/components/jobPost/JobDescription'\nimport { JobHeader } from '@/components/jobPost/JobHeader'\nimport { useDisplayText } from '@/hooks/useDisplayText'\nimport { getAddressList } from '@/lib/locations'\nimport { salaryRange } from '@/lib/salaryRange'\nimport { cn } from '@/lib/utils'\nimport { type JobPostModel } from '@/types/data/job_posting_service_latest'\n\nexport type JobPostProps = {\n job: JobPostModel\n bannerSrc: string\n avatarSrc?: string\n standalone?: boolean\n avatarHref?: string\n fallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n}\n\nexport function JobPost({\n job,\n bannerSrc,\n avatarSrc,\n standalone,\n avatarHref,\n fallbackHref,\n backAcceptedRoutes,\n actions,\n}: Readonly<JobPostProps>) {\n const formattedEmploymentType = useDisplayText('employmentType', job.employmentType)\n const formattedEmploymentLevel = useDisplayText('employmentLevel', job.employmentLevel)\n const formattedJobFunction = useDisplayText('jobFunction', job.jobFunction)\n const formattedLocations = getAddressList(job)\n const formattedSalary = salaryRange(job.estimatedSalary)\n const formattedDate = DateFns.formatDistanceToNow(new Date(job.datePosted as string), {\n addSuffix: true,\n })\n\n const tags = [\n !!formattedSalary && {\n icon: 'banknote' as const,\n name: 'salary',\n label: formattedSalary,\n },\n !!formattedEmploymentType && {\n icon: 'briefcase-business' as const,\n name: 'employmentType',\n label: formattedEmploymentType,\n },\n !!formattedEmploymentLevel && {\n icon: 'circle-user' as const,\n name: 'level',\n label: formattedEmploymentLevel,\n },\n !!formattedJobFunction && {\n icon: 'briefcase-business' as const,\n name: 'jobFunction',\n label: formattedJobFunction,\n },\n ...formattedLocations.map((label) => ({\n icon: 'map-pin' as const,\n name: 'location',\n label,\n })),\n ].filter((t) => !!t)\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-10 pb-4',\n !standalone && 'border-1 rounded-3xl border-grey-5'\n )}\n >\n <JobHeader\n title={job.title}\n bannerSrc={bannerSrc}\n avatarName={job.hiringOrganization?.companyName}\n avatarSrc={job.hiringOrganization?.logo?.asset?.url}\n subtitles={[job.hiringOrganization?.companyName ?? '', `Posted ${formattedDate}`]}\n actions={actions}\n standalone={standalone}\n avatarHref={avatarHref}\n backFallbackHref={fallbackHref}\n backAcceptedRoutes={backAcceptedRoutes}\n tags={tags}\n />\n\n <div className=\"flex flex-col gap-8 px-6\">\n <JobDescription description={job.description} />\n\n <CompanyTake\n avatarSrc={avatarSrc}\n content={job.hiringOrganization?.companyNDG?.companyNDGTake}\n />\n\n <CompanyInformation\n name={job.hiringOrganization?.companyName ?? ''}\n how={job.hiringOrganization?.companyPhilosophy?.companyHow}\n mission={job.hiringOrganization?.companyPhilosophy?.companyMission}\n wow={job.hiringOrganization?.companyNDG?.companyWow}\n website={job.hiringOrganization?.companyWebsite}\n />\n\n <CompanyBenefits\n benefits={job.hiringOrganization?.companyCareers?.companyBenefits\n ?.map((b) => b.title)\n .filter((d) => d !== undefined)}\n />\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/jobPost/JobPost.tsx"],"names":["useDisplayText","getAddressList","salaryRange","DateFns","jsxs","cn","jsx","JobHeader","JobDescription","CompanyTake","CompanyInformation","CompanyBenefits"],"mappings":"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","file":"chunk-KKJS3J3C.cjs","sourcesContent":["'use client'\n\nimport * as DateFns from 'date-fns'\nimport { type ReactNode } from 'react'\n\nimport { CompanyBenefits } from '@/components/company/CompanyBenefits'\nimport { CompanyInformation } from '@/components/company/CompanyInformation'\nimport { CompanyTake } from '@/components/company/CompanyTake'\nimport { JobDescription } from '@/components/jobPost/JobDescription'\nimport { JobHeader } from '@/components/jobPost/JobHeader'\nimport { useDisplayText } from '@/hooks/useDisplayText'\nimport { getAddressList } from '@/lib/locations'\nimport { salaryRange } from '@/lib/salaryRange'\nimport { cn } from '@/lib/utils'\nimport { type JobPostModel } from '@/types/data/job_posting_service_latest'\n\nexport type JobPostProps = {\n job: JobPostModel\n bannerSrc: string\n avatarSrc?: string\n standalone?: boolean\n avatarHref?: string\n fallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n}\n\nexport function JobPost({\n job,\n bannerSrc,\n avatarSrc,\n standalone,\n avatarHref,\n fallbackHref,\n backAcceptedRoutes,\n actions,\n}: Readonly<JobPostProps>) {\n const formattedEmploymentType = useDisplayText('employmentType', job.employmentType)\n const formattedEmploymentLevel = useDisplayText('employmentLevel', job.employmentLevel)\n const formattedJobFunction = useDisplayText('jobFunction', job.jobFunction)\n const formattedLocations = getAddressList(job)\n const formattedSalary = salaryRange(job.estimatedSalary)\n const formattedDate = DateFns.formatDistanceToNow(new Date(job.datePosted as string), {\n addSuffix: true,\n })\n\n const tags = [\n !!formattedSalary && {\n icon: 'banknote' as const,\n name: 'salary',\n label: formattedSalary,\n },\n !!formattedEmploymentType && {\n icon: 'briefcase-business' as const,\n name: 'employmentType',\n label: formattedEmploymentType,\n },\n !!formattedEmploymentLevel && {\n icon: 'circle-user' as const,\n name: 'level',\n label: formattedEmploymentLevel,\n },\n !!formattedJobFunction && {\n icon: 'briefcase-business' as const,\n name: 'jobFunction',\n label: formattedJobFunction,\n },\n ...formattedLocations.map((label) => ({\n icon: 'map-pin' as const,\n name: 'location',\n label,\n })),\n ].filter((t) => !!t)\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-10 pb-4',\n !standalone && 'border-1 rounded-3xl border-grey-5'\n )}\n >\n <JobHeader\n title={job.title}\n bannerSrc={bannerSrc}\n avatarName={job.hiringOrganization?.companyName}\n avatarSrc={job.hiringOrganization?.logo?.asset?.url}\n subtitles={[job.hiringOrganization?.companyName ?? '', `Posted ${formattedDate}`]}\n actions={actions}\n standalone={standalone}\n avatarHref={avatarHref}\n backFallbackHref={fallbackHref}\n backAcceptedRoutes={backAcceptedRoutes}\n tags={tags}\n />\n\n <div className=\"flex flex-col gap-8 px-6\">\n <JobDescription description={job.description} />\n\n <CompanyTake\n avatarSrc={avatarSrc}\n content={job.hiringOrganization?.companyNDG?.companyNDGTake}\n />\n\n <CompanyInformation\n name={job.hiringOrganization?.companyName ?? ''}\n how={job.hiringOrganization?.companyPhilosophy?.companyHow}\n mission={job.hiringOrganization?.companyPhilosophy?.companyMission}\n wow={job.hiringOrganization?.companyNDG?.companyWow}\n website={job.hiringOrganization?.companyWebsite}\n />\n\n <CompanyBenefits\n benefits={job.hiringOrganization?.companyCareers?.companyBenefits\n ?.map((b) => b.title)\n .filter((d) => d !== undefined)}\n />\n </div>\n </div>\n )\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { Avatar } from './chunk-2TEFWPFS.js';
2
1
  import { Chip_default } from './chunk-LQ4DG6ST.js';
2
+ import { Avatar } from './chunk-2TEFWPFS.js';
3
+ import { iconMap } from './chunk-PONUWUJ7.js';
3
4
  import { BackButton } from './chunk-IJQTUD3D.js';
4
5
  import { cn } from './chunk-2FGZQI42.js';
5
- import { iconMap } from './chunk-PONUWUJ7.js';
6
6
  import { Dot } from 'lucide-react';
7
7
  import Image from 'next/image';
8
8
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -150,5 +150,5 @@ function JobHeader({
150
150
  }
151
151
 
152
152
  export { JobHeader };
153
- //# sourceMappingURL=chunk-6Z6T5WWS.js.map
154
- //# sourceMappingURL=chunk-6Z6T5WWS.js.map
153
+ //# sourceMappingURL=chunk-MSOLVPPR.js.map
154
+ //# sourceMappingURL=chunk-MSOLVPPR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/jobPost/JobHeader.tsx"],"names":[],"mappings":"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","file":"chunk-6Z6T5WWS.js","sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={`${name}-${label}`}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/jobPost/JobHeader.tsx"],"names":[],"mappings":"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","file":"chunk-MSOLVPPR.js","sourcesContent":["'use client'\n\nimport { Dot } from 'lucide-react'\nimport Image from 'next/image'\nimport { type ReactNode } from 'react'\n\nimport { BackButton } from '@/components/buttons/BackButton'\nimport { Avatar } from '@/components/ui/Avatar'\nimport Chip from '@/components/ui/Chip'\nimport { iconMap } from '@/lib/icons'\nimport { cn } from '@/lib/utils'\n\nexport type JobHeaderTag = {\n name: string\n label: string\n icon: keyof typeof iconMap\n}\n\nexport type JobHeaderProps = {\n title: string\n bannerSrc: string\n subtitles?: string[]\n standalone?: boolean\n avatarSrc?: string\n avatarName?: string\n avatarHref?: string\n backFallbackHref?: string\n backAcceptedRoutes?: string[]\n actions?: ReactNode\n tags?: JobHeaderTag[]\n}\n\nexport function JobHeader({\n title,\n subtitles,\n standalone,\n bannerSrc,\n avatarSrc,\n avatarName,\n avatarHref,\n backFallbackHref,\n backAcceptedRoutes,\n actions,\n tags,\n}: Readonly<JobHeaderProps>) {\n const renderIcon = (icon: JobHeaderTag['icon']) => {\n const Icon = iconMap[icon]\n return <Icon size={18} />\n }\n\n return (\n <div\n data-testid=\"job-header-root\"\n className={cn(\n '-mt-8 flex w-full flex-col items-center justify-between gap-6 md:-mt-0',\n !standalone && 'rounded-3xl'\n )}\n >\n {!standalone && (\n <div className=\"relative flex min-h-16 w-full items-center rounded-t-3xl bg-transparent md:min-h-24 md:flex-row lg:min-h-32\">\n <Image\n className=\"h-full w-full rounded-t-3xl object-cover\"\n src={bannerSrc}\n alt=\"job banner\"\n fill\n />\n <BackButton\n acceptedRoutes={backAcceptedRoutes}\n fallbackHref={backFallbackHref}\n className=\"absolute right-2 top-2 flex items-center justify-center text-white sm:hidden\"\n data-testid=\"job-header-back-button\"\n />\n <div\n className=\"absolute left-4 top-8 md:left-6 md:top-16 lg:top-24\"\n data-testid=\"job-header-avatar\"\n >\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full flex-col items-start justify-start gap-4 px-6\">\n <div className=\"flex flex-col md:flex-row\">\n {standalone && (\n <div className=\"-mt-4 mr-4 md:mt-0\" data-testid=\"job-header-avatar\">\n <Avatar\n size=\"large\"\n target=\"_blank\"\n href={avatarHref}\n name={avatarName}\n src={avatarSrc}\n rel=\"noopener noreferrer\"\n />\n </div>\n )}\n\n <div className=\"prose mt-4 flex w-full items-center text-grey-80 lg:prose-lg\">\n {subtitles?.map((subtitle, i) => (\n <div\n key={subtitle}\n data-testid={`job-header-subtitle-${i}`}\n className=\"flex items-center\"\n >\n {subtitle}\n {i < subtitles.length - 1 && <Dot className=\"mx-1 shrink-0\" size={10} />}\n </div>\n ))}\n </div>\n </div>\n\n <div\n data-testid=\"job-header-content\"\n className=\"mt-2 flex w-full flex-row flex-wrap items-center justify-between gap-1\"\n >\n <h2\n data-testid=\"job-header-title\"\n className=\"break-word max-w-full text-2xl font-bold text-black sm:max-w-2xl md:max-w-lg\"\n >\n {title}\n </h2>\n\n {!!actions && (\n <div\n className=\"flex w-full justify-end gap-2 md:w-auto\"\n data-testid=\"job-header-actions\"\n >\n {actions}\n </div>\n )}\n </div>\n\n <div\n data-testid=\"job-header-tags\"\n className=\"flex flex-row flex-wrap items-center justify-start gap-2\"\n >\n {tags?.map(({ name, label, icon }) => (\n <Chip\n key={`${name}-${label}`}\n size=\"small\"\n variant=\"neutral\"\n aria-label={name}\n data-testid={`job-header-tag-${name}`}\n >\n {renderIcon(icon)}\n <span>{label}</span>\n </Chip>\n ))}\n </div>\n </div>\n </div>\n )\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkVBLDMVVW_cjs = require('./chunk-VBLDMVVW.cjs');
4
- var chunkMGWZXPMF_cjs = require('./chunk-MGWZXPMF.cjs');
5
4
  var chunkAMNEAWA7_cjs = require('./chunk-AMNEAWA7.cjs');
5
+ var chunkMGWZXPMF_cjs = require('./chunk-MGWZXPMF.cjs');
6
6
  var lucideReact = require('lucide-react');
7
7
  var react = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -122,5 +122,5 @@ function PlacesQueryInput({
122
122
  var PlacesQueryInput_default = PlacesQueryInput;
123
123
 
124
124
  exports.PlacesQueryInput_default = PlacesQueryInput_default;
125
- //# sourceMappingURL=chunk-CEVBQ664.cjs.map
126
- //# sourceMappingURL=chunk-CEVBQ664.cjs.map
125
+ //# sourceMappingURL=chunk-U6RELZ6H.cjs.map
126
+ //# sourceMappingURL=chunk-U6RELZ6H.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/PlacesQueryInput.tsx"],"names":["useState","useRef","useCallback","autocomplete","useEffect","jsx","cn","jsxs","Command","CommandInput","LoaderCircle","CircleX","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-CEVBQ664.cjs","sourcesContent":["'use client'\n\nimport { type PlaceAutocompleteResult } from '@googlemaps/google-maps-services-js'\nimport { CircleX, LoaderCircle } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { autocomplete } from '@/lib/google'\nimport { cn } from '@/lib/utils'\n\n/**\n * The idea is of this type is to have a more specific type for the Place object,\n * without the repos that use it having to import the PlaceAutocompleteResult type.\n * 'place_id' can be used to query the Google Places API directly for more information about the place.\n */\nexport type Place = Pick<PlaceAutocompleteResult, 'description' | 'place_id'>\n\ntype Size = 'small' | 'normal' | 'large' | 'xlarge'\n\ninterface PlacesQueryInputProps {\n apiKey: string\n selected?: Place\n onSelect: (place?: Place) => void\n className?: string\n size?: Size\n}\n\nconst sizeClasses: Record<Size, string> = {\n small: 'h-8 text-xs',\n normal: 'h-9 text-sm',\n large: 'h-10 text-base',\n xlarge: 'h-11 text-base',\n}\n\nfunction PlacesQueryInput({\n apiKey,\n selected,\n onSelect,\n className,\n size = 'normal',\n}: Readonly<PlacesQueryInputProps>) {\n const [predictions, setPredictions] = useState<PlaceAutocompleteResult[] | null>(null)\n const [input, setInput] = useState(selected?.description ?? '')\n const [isLoadingPredictions, setIsLoadingPredictions] = useState(false)\n const [shouldOpenUpward, setShouldOpenUpward] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\n const inputRef = useRef<HTMLDivElement | null>(null)\n\n const debouncedAutocomplete = useCallback((value: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(async () => {\n try {\n if (value.length > 2) {\n setIsLoadingPredictions(true)\n const fetchedPredictions = await autocomplete(value, apiKey)\n setIsLoadingPredictions(false)\n setPredictions(fetchedPredictions ?? [])\n } else {\n setPredictions(null)\n }\n } catch (error) {\n setIsLoadingPredictions(false)\n setPredictions([])\n console.error('Autocomplete error:', error)\n }\n }, 300)\n }, [])\n\n const handleInputChange = (value: string) => {\n setInput(value)\n debouncedAutocomplete(value)\n }\n\n const handleSelect = (prediction: PlaceAutocompleteResult) => {\n onSelect(prediction)\n setPredictions(null)\n setInput(prediction.description)\n }\n\n const handleClear = () => {\n onSelect()\n setPredictions(null)\n setInput('')\n }\n\n /** Close the dropdown when the input loses focus, with the timeout to allow the user to click on a prediction.\n * */\n const handleBlur = () => setTimeout(() => setPredictions(null), 200)\n\n useEffect(() => {\n const checkDropdownPosition = () => {\n if (inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect()\n const windowHeight = window.innerHeight\n setShouldOpenUpward(rect.bottom + 200 > windowHeight)\n }\n }\n\n checkDropdownPosition()\n window.addEventListener('resize', checkDropdownPosition)\n return () => window.removeEventListener('resize', checkDropdownPosition)\n }, [])\n\n return (\n <div className={cn('relative w-full', className)} ref={inputRef} onBlur={handleBlur}>\n <Command>\n <div className=\"relative w-full\">\n <CommandInput\n placeholder=\"Type an address to search...\"\n value={input}\n onValueChange={handleInputChange}\n className={cn('truncate pr-8', sizeClasses[size])}\n />\n {isLoadingPredictions && (\n <LoaderCircle className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 animate-spin items-center justify-center rounded-full text-green-100\" />\n )}\n {input && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n {predictions && (\n <CommandList\n className={cn(\n 'absolute z-50 w-full rounded-md border bg-white shadow-lg',\n shouldOpenUpward ? 'bottom-full' : 'top-full'\n )}\n >\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {predictions.map((prediction) => (\n <CommandItem\n key={prediction.place_id}\n onSelect={() => handleSelect(prediction)}\n className=\"truncate\"\n >\n {prediction.description}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n )}\n </Command>\n </div>\n )\n}\n\nexport default PlacesQueryInput\n"]}
1
+ {"version":3,"sources":["../src/components/ui/PlacesQueryInput.tsx"],"names":["useState","useRef","useCallback","autocomplete","useEffect","jsx","cn","jsxs","Command","CommandInput","LoaderCircle","CircleX","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-U6RELZ6H.cjs","sourcesContent":["'use client'\n\nimport { type PlaceAutocompleteResult } from '@googlemaps/google-maps-services-js'\nimport { CircleX, LoaderCircle } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '@/components/primitives/command'\nimport { autocomplete } from '@/lib/google'\nimport { cn } from '@/lib/utils'\n\n/**\n * The idea is of this type is to have a more specific type for the Place object,\n * without the repos that use it having to import the PlaceAutocompleteResult type.\n * 'place_id' can be used to query the Google Places API directly for more information about the place.\n */\nexport type Place = Pick<PlaceAutocompleteResult, 'description' | 'place_id'>\n\ntype Size = 'small' | 'normal' | 'large' | 'xlarge'\n\ninterface PlacesQueryInputProps {\n apiKey: string\n selected?: Place\n onSelect: (place?: Place) => void\n className?: string\n size?: Size\n}\n\nconst sizeClasses: Record<Size, string> = {\n small: 'h-8 text-xs',\n normal: 'h-9 text-sm',\n large: 'h-10 text-base',\n xlarge: 'h-11 text-base',\n}\n\nfunction PlacesQueryInput({\n apiKey,\n selected,\n onSelect,\n className,\n size = 'normal',\n}: Readonly<PlacesQueryInputProps>) {\n const [predictions, setPredictions] = useState<PlaceAutocompleteResult[] | null>(null)\n const [input, setInput] = useState(selected?.description ?? '')\n const [isLoadingPredictions, setIsLoadingPredictions] = useState(false)\n const [shouldOpenUpward, setShouldOpenUpward] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\n const inputRef = useRef<HTMLDivElement | null>(null)\n\n const debouncedAutocomplete = useCallback((value: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(async () => {\n try {\n if (value.length > 2) {\n setIsLoadingPredictions(true)\n const fetchedPredictions = await autocomplete(value, apiKey)\n setIsLoadingPredictions(false)\n setPredictions(fetchedPredictions ?? [])\n } else {\n setPredictions(null)\n }\n } catch (error) {\n setIsLoadingPredictions(false)\n setPredictions([])\n console.error('Autocomplete error:', error)\n }\n }, 300)\n }, [])\n\n const handleInputChange = (value: string) => {\n setInput(value)\n debouncedAutocomplete(value)\n }\n\n const handleSelect = (prediction: PlaceAutocompleteResult) => {\n onSelect(prediction)\n setPredictions(null)\n setInput(prediction.description)\n }\n\n const handleClear = () => {\n onSelect()\n setPredictions(null)\n setInput('')\n }\n\n /** Close the dropdown when the input loses focus, with the timeout to allow the user to click on a prediction.\n * */\n const handleBlur = () => setTimeout(() => setPredictions(null), 200)\n\n useEffect(() => {\n const checkDropdownPosition = () => {\n if (inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect()\n const windowHeight = window.innerHeight\n setShouldOpenUpward(rect.bottom + 200 > windowHeight)\n }\n }\n\n checkDropdownPosition()\n window.addEventListener('resize', checkDropdownPosition)\n return () => window.removeEventListener('resize', checkDropdownPosition)\n }, [])\n\n return (\n <div className={cn('relative w-full', className)} ref={inputRef} onBlur={handleBlur}>\n <Command>\n <div className=\"relative w-full\">\n <CommandInput\n placeholder=\"Type an address to search...\"\n value={input}\n onValueChange={handleInputChange}\n className={cn('truncate pr-8', sizeClasses[size])}\n />\n {isLoadingPredictions && (\n <LoaderCircle className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 animate-spin items-center justify-center rounded-full text-green-100\" />\n )}\n {input && (\n <button\n type=\"button\"\n className=\"absolute inset-y-0 right-2 my-auto flex h-8 w-8 cursor-pointer items-center justify-center rounded-full hover:bg-pickle-20\"\n onClick={handleClear}\n >\n <CircleX className=\"h-4 w-4 text-green-100\" />\n </button>\n )}\n </div>\n {predictions && (\n <CommandList\n className={cn(\n 'absolute z-50 w-full rounded-md border bg-white shadow-lg',\n shouldOpenUpward ? 'bottom-full' : 'top-full'\n )}\n >\n <CommandEmpty>No results</CommandEmpty>\n <CommandGroup>\n {predictions.map((prediction) => (\n <CommandItem\n key={prediction.place_id}\n onSelect={() => handleSelect(prediction)}\n className=\"truncate\"\n >\n {prediction.description}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n )}\n </Command>\n </div>\n )\n}\n\nexport default PlacesQueryInput\n"]}
@@ -1,10 +1,10 @@
1
1
  import { ListItem_default } from './chunk-QURNDLRE.js';
2
2
  import { Label_default } from './chunk-CAGLLWPR.js';
3
3
  import { ErrorMessage_default } from './chunk-CWTO3NXW.js';
4
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-ODHIUBLC.js';
4
5
  import { Separator } from './chunk-FNCPK4RH.js';
5
6
  import { Badge } from './chunk-TVYLTYUK.js';
6
7
  import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-R73HWAYA.js';
7
- import { Popover, PopoverTrigger, PopoverContent } from './chunk-ODHIUBLC.js';
8
8
  import { cn } from './chunk-2FGZQI42.js';
9
9
  import { cva } from 'cva';
10
10
  import { icons, ChevronDownIcon, CircleX } from 'lucide-react';
@@ -218,5 +218,5 @@ var triggerVariants = cva(
218
218
  );
219
219
 
220
220
  export { Combobox };
221
- //# sourceMappingURL=chunk-TZRT26E2.js.map
222
- //# sourceMappingURL=chunk-TZRT26E2.js.map
221
+ //# sourceMappingURL=chunk-W4QQBNJD.js.map
222
+ //# sourceMappingURL=chunk-W4QQBNJD.js.map