@next-degree/pickle-shared-js 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/{chunk-7NP3NX67.cjs → chunk-2VFY5AZA.cjs} +10 -10
  2. package/dist/chunk-2VFY5AZA.cjs.map +1 -0
  3. package/dist/{chunk-QYSTBZXD.js → chunk-45FFXB2Y.js} +6 -6
  4. package/dist/{chunk-QYSTBZXD.js.map → chunk-45FFXB2Y.js.map} +1 -1
  5. package/dist/{chunk-OZJZVEF2.js → chunk-4E3ANVRR.js} +3 -3
  6. package/dist/{chunk-OZJZVEF2.js.map → chunk-4E3ANVRR.js.map} +1 -1
  7. package/dist/{chunk-OXDKVZZ5.cjs → chunk-567FG76G.cjs} +4 -4
  8. package/dist/{chunk-OXDKVZZ5.cjs.map → chunk-567FG76G.cjs.map} +1 -1
  9. package/dist/{chunk-6KGXXX6X.cjs → chunk-6XAUCO2D.cjs} +3 -3
  10. package/dist/chunk-6XAUCO2D.cjs.map +1 -0
  11. package/dist/{chunk-SKMP4FO7.cjs → chunk-ASPUIRWU.cjs} +22 -4
  12. package/dist/chunk-ASPUIRWU.cjs.map +1 -0
  13. package/dist/{chunk-Z2I2265Q.cjs → chunk-FDGHWRRP.cjs} +5 -3
  14. package/dist/chunk-FDGHWRRP.cjs.map +1 -0
  15. package/dist/{chunk-4FETL23S.cjs → chunk-IMJ7S3LK.cjs} +4 -4
  16. package/dist/{chunk-4FETL23S.cjs.map → chunk-IMJ7S3LK.cjs.map} +1 -1
  17. package/dist/{chunk-PU4O76IS.js → chunk-JQUWC2YP.js} +4 -4
  18. package/dist/{chunk-PU4O76IS.js.map → chunk-JQUWC2YP.js.map} +1 -1
  19. package/dist/{chunk-CPZFINPG.js → chunk-K76RPF2X.js} +3 -3
  20. package/dist/{chunk-CPZFINPG.js.map → chunk-K76RPF2X.js.map} +1 -1
  21. package/dist/{chunk-KM5XDOAL.js → chunk-Q6AKHW44.js} +3 -12
  22. package/dist/chunk-Q6AKHW44.js.map +1 -0
  23. package/dist/{chunk-IJV66D4K.cjs → chunk-RCYBG5RG.cjs} +3 -12
  24. package/dist/chunk-RCYBG5RG.cjs.map +1 -0
  25. package/dist/{chunk-CGCGALTZ.cjs → chunk-SUDPNL2Q.cjs} +10 -10
  26. package/dist/{chunk-CGCGALTZ.cjs.map → chunk-SUDPNL2Q.cjs.map} +1 -1
  27. package/dist/{chunk-5GODYRZA.js → chunk-U2T5ZKPR.js} +3 -3
  28. package/dist/chunk-U2T5ZKPR.js.map +1 -0
  29. package/dist/{chunk-TOEADI6J.cjs → chunk-VCCYAJK7.cjs} +3 -3
  30. package/dist/{chunk-TOEADI6J.cjs.map → chunk-VCCYAJK7.cjs.map} +1 -1
  31. package/dist/{chunk-6Z6T5WWS.js → chunk-VRYGJJ5K.js} +3 -3
  32. package/dist/{chunk-6Z6T5WWS.js.map → chunk-VRYGJJ5K.js.map} +1 -1
  33. package/dist/{chunk-3XO3AJR4.js → chunk-XTEZM6SY.js} +6 -6
  34. package/dist/chunk-XTEZM6SY.js.map +1 -0
  35. package/dist/{chunk-PWKRCU2K.js → chunk-YJICO3OG.js} +5 -3
  36. package/dist/chunk-YJICO3OG.js.map +1 -0
  37. package/dist/chunk-Z77KENZ6.js +52 -0
  38. package/dist/chunk-Z77KENZ6.js.map +1 -0
  39. package/dist/{chunk-2YUUVN7E.cjs → chunk-ZZCTMR2F.cjs} +3 -3
  40. package/dist/{chunk-2YUUVN7E.cjs.map → chunk-ZZCTMR2F.cjs.map} +1 -1
  41. package/dist/{company_service_sanity-CCbS8ElX.d.cts → company_service_sanity-Br0R7m-A.d.cts} +271 -271
  42. package/dist/{company_service_sanity-B1Xg7ISJ.d.ts → company_service_sanity-DF01qvTz.d.ts} +271 -271
  43. package/dist/components/jobCard/JobLocation.cjs +1 -1
  44. package/dist/components/jobCard/JobLocation.d.cts +1 -1
  45. package/dist/components/jobCard/JobLocation.d.ts +1 -1
  46. package/dist/components/jobCard/JobLocation.js +1 -1
  47. package/dist/components/jobPost/JobHeader.cjs +5 -5
  48. package/dist/components/jobPost/JobHeader.js +4 -4
  49. package/dist/components/jobPost/JobPost.cjs +14 -14
  50. package/dist/components/jobPost/JobPost.d.cts +1 -1
  51. package/dist/components/jobPost/JobPost.d.ts +1 -1
  52. package/dist/components/jobPost/JobPost.js +13 -13
  53. package/dist/components/primitives/command.d.cts +1 -1
  54. package/dist/components/primitives/command.d.ts +1 -1
  55. package/dist/components/ui/Button.d.cts +1 -1
  56. package/dist/components/ui/Button.d.ts +1 -1
  57. package/dist/components/ui/Combobox.cjs +6 -6
  58. package/dist/components/ui/Combobox.js +5 -5
  59. package/dist/components/ui/Input.cjs +2 -2
  60. package/dist/components/ui/Input.d.cts +1 -0
  61. package/dist/components/ui/Input.d.ts +1 -0
  62. package/dist/components/ui/Input.js +1 -1
  63. package/dist/components/ui/Map/MapComponent.cjs +6 -6
  64. package/dist/components/ui/Map/MapComponent.js +5 -5
  65. package/dist/components/ui/Map/MapContent.cjs +4 -4
  66. package/dist/components/ui/Map/MapContent.js +3 -3
  67. package/dist/components/ui/Map/hooks.cjs +4 -4
  68. package/dist/components/ui/Map/hooks.js +1 -1
  69. package/dist/components/ui/Map/index.cjs +6 -6
  70. package/dist/components/ui/Map/index.js +5 -5
  71. package/dist/components/ui/Select.cjs +2 -2
  72. package/dist/components/ui/Select.js +1 -1
  73. package/dist/components/ui/buttonShadcn.d.cts +1 -1
  74. package/dist/components/ui/buttonShadcn.d.ts +1 -1
  75. package/dist/{displayText-Ck0qovrl.d.cts → displayText-BDPndCI9.d.cts} +2 -2
  76. package/dist/{displayText-ClDGmi1J.d.ts → displayText-EpnIpZ38.d.ts} +2 -2
  77. package/dist/hooks/useDisplayText.cjs +4 -4
  78. package/dist/hooks/useDisplayText.d.cts +3 -3
  79. package/dist/hooks/useDisplayText.d.ts +3 -3
  80. package/dist/hooks/useDisplayText.js +3 -3
  81. package/dist/index.cjs +76 -76
  82. package/dist/index.d.cts +6 -6
  83. package/dist/index.d.ts +6 -6
  84. package/dist/index.js +33 -33
  85. package/dist/{job_posting_service_latest-DfX8Y4gB.d.cts → job_posting_service_latest-B6Trs6sX.d.cts} +177 -177
  86. package/dist/{job_posting_service_latest-DfX8Y4gB.d.ts → job_posting_service_latest-B6Trs6sX.d.ts} +177 -177
  87. package/dist/{job_posting_service_latest-Bk53vj02.d.cts → job_posting_service_latest-BKz5U2Gp.d.cts} +177 -177
  88. package/dist/{job_posting_service_latest-Bk53vj02.d.ts → job_posting_service_latest-BKz5U2Gp.d.ts} +177 -177
  89. package/dist/{job_posting_service_sanity-BSxLNte3.d.cts → job_posting_service_sanity-BN7XcVxU.d.cts} +357 -357
  90. package/dist/{job_posting_service_sanity-C6aPb8kp.d.ts → job_posting_service_sanity-BNQsNQs2.d.ts} +357 -357
  91. package/dist/lib/locations.d.cts +3 -3
  92. package/dist/lib/locations.d.ts +3 -3
  93. package/dist/lib/mappings.d.cts +3 -3
  94. package/dist/lib/mappings.d.ts +3 -3
  95. package/dist/lib/salaryRange.cjs +1 -1
  96. package/dist/lib/salaryRange.d.cts +1 -1
  97. package/dist/lib/salaryRange.d.ts +1 -1
  98. package/dist/lib/salaryRange.js +1 -1
  99. package/dist/services/displayText.cjs +3 -3
  100. package/dist/services/displayText.d.cts +3 -3
  101. package/dist/services/displayText.d.ts +3 -3
  102. package/dist/services/displayText.js +2 -2
  103. package/dist/types/data/company_service_latest.d.cts +1 -1
  104. package/dist/types/data/company_service_latest.d.ts +1 -1
  105. package/dist/types/data/job_posting_service_latest.d.cts +1 -1
  106. package/dist/types/data/job_posting_service_latest.d.ts +1 -1
  107. package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
  108. package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
  109. package/dist/types/index.cjs +5 -5
  110. package/dist/types/index.d.cts +5 -5
  111. package/dist/types/index.d.ts +5 -5
  112. package/dist/types/index.js +1 -1
  113. package/dist/types/latest/company_service_latest.d.cts +1 -1
  114. package/dist/types/latest/company_service_latest.d.ts +1 -1
  115. package/dist/types/latest/custom/company_service_sanity.d.cts +3 -3
  116. package/dist/types/latest/custom/company_service_sanity.d.ts +3 -3
  117. package/dist/types/latest/custom/job_posting_service_sanity.d.cts +3 -3
  118. package/dist/types/latest/custom/job_posting_service_sanity.d.ts +3 -3
  119. package/dist/types/latest/job_posting_service_latest.d.cts +1 -1
  120. package/dist/types/latest/job_posting_service_latest.d.ts +1 -1
  121. package/dist/types/latest/shared_pickle_output_latest.d.cts +1 -1
  122. package/dist/types/latest/shared_pickle_output_latest.d.ts +1 -1
  123. package/package.json +1 -1
  124. package/dist/chunk-3XO3AJR4.js.map +0 -1
  125. package/dist/chunk-5GODYRZA.js.map +0 -1
  126. package/dist/chunk-6KGXXX6X.cjs.map +0 -1
  127. package/dist/chunk-7NP3NX67.cjs.map +0 -1
  128. package/dist/chunk-FSMBDLNU.js +0 -34
  129. package/dist/chunk-FSMBDLNU.js.map +0 -1
  130. package/dist/chunk-IJV66D4K.cjs.map +0 -1
  131. package/dist/chunk-KM5XDOAL.js.map +0 -1
  132. package/dist/chunk-PWKRCU2K.js.map +0 -1
  133. package/dist/chunk-SKMP4FO7.cjs.map +0 -1
  134. package/dist/chunk-Z2I2265Q.cjs.map +0 -1
  135. package/dist/{company_service_latest-CVgoQ8Mc.d.cts → company_service_latest-C7Moeufo.d.cts} +174 -174
  136. package/dist/{company_service_latest-CVgoQ8Mc.d.ts → company_service_latest-C7Moeufo.d.ts} +174 -174
  137. package/dist/{company_service_latest-oWEnaiRd.d.cts → company_service_latest-CITz7F53.d.cts} +174 -174
  138. package/dist/{company_service_latest-oWEnaiRd.d.ts → company_service_latest-CITz7F53.d.ts} +174 -174
  139. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.ts → shared_pickle_output_latest--XZhOUyE.d.cts} +11 -11
  140. package/dist/{shared_pickle_output_latest-BVF7Zh2H.d.cts → shared_pickle_output_latest--XZhOUyE.d.ts} +11 -11
  141. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.ts → shared_pickle_output_latest-DKOmTyYk.d.cts} +11 -11
  142. package/dist/{shared_pickle_output_latest-BjRRmT8R.d.cts → shared_pickle_output_latest-DKOmTyYk.d.ts} +11 -11
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkIJV66D4K_cjs = require('./chunk-IJV66D4K.cjs');
4
- var chunkSKMP4FO7_cjs = require('./chunk-SKMP4FO7.cjs');
3
+ var chunkRCYBG5RG_cjs = require('./chunk-RCYBG5RG.cjs');
4
+ var chunkASPUIRWU_cjs = require('./chunk-ASPUIRWU.cjs');
5
5
  var chunkDU5OQA67_cjs = require('./chunk-DU5OQA67.cjs');
6
6
  var chunkNLGWU2KI_cjs = require('./chunk-NLGWU2KI.cjs');
7
7
  var reactGoogleMaps = require('@vis.gl/react-google-maps');
@@ -19,13 +19,13 @@ function MapComponent({
19
19
  className,
20
20
  zoom = 10
21
21
  }) {
22
- const { bounds, setBounds } = chunkSKMP4FO7_cjs.useMapBounds(coordinates);
23
- const { zoomLevel, setZoomLevel } = chunkSKMP4FO7_cjs.useZoomLevel(zoom || chunkNLGWU2KI_cjs.DEFAULT_ZOOM);
24
- const { clusters, supercluster } = chunkSKMP4FO7_cjs.useClusters(coordinates, bounds, zoomLevel);
25
- const mapCenter = coordinates && coordinates.length > 0 ? chunkDU5OQA67_cjs.getCenterForCoordinates(coordinates) : position || chunkNLGWU2KI_cjs.DEFAULT_POSITION;
26
- const mapZoom = coordinates && coordinates.length > 1 ? chunkDU5OQA67_cjs.getZoomForCoordinates(coordinates, zoom) : position ? zoom : chunkNLGWU2KI_cjs.DEFAULT_ZOOM;
22
+ const { bounds, setBounds } = chunkASPUIRWU_cjs.useMapBounds(coordinates);
23
+ const { zoomLevel, setZoomLevel } = chunkASPUIRWU_cjs.useZoomLevel(zoom || chunkNLGWU2KI_cjs.DEFAULT_ZOOM);
24
+ const { clusters, supercluster } = chunkASPUIRWU_cjs.useClusters(coordinates, bounds, zoomLevel);
25
+ const mapCenter = position ? position : coordinates && coordinates.length > 0 ? chunkDU5OQA67_cjs.getCenterForCoordinates(coordinates) : chunkNLGWU2KI_cjs.DEFAULT_POSITION;
26
+ const mapZoom = position ? zoom : coordinates && coordinates.length > 1 ? chunkDU5OQA67_cjs.getZoomForCoordinates(coordinates, zoom) : chunkNLGWU2KI_cjs.DEFAULT_ZOOM;
27
27
  return /* @__PURE__ */ jsxRuntime.jsx(reactGoogleMaps.APIProvider, { apiKey, children: /* @__PURE__ */ jsxRuntime.jsx(
28
- chunkIJV66D4K_cjs.MapContent,
28
+ chunkRCYBG5RG_cjs.MapContent,
29
29
  {
30
30
  mapId,
31
31
  mapCenter,
@@ -46,5 +46,5 @@ function MapComponent({
46
46
  }
47
47
 
48
48
  exports.MapComponent = MapComponent;
49
- //# sourceMappingURL=chunk-7NP3NX67.cjs.map
50
- //# sourceMappingURL=chunk-7NP3NX67.cjs.map
49
+ //# sourceMappingURL=chunk-2VFY5AZA.cjs.map
50
+ //# sourceMappingURL=chunk-2VFY5AZA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Map/MapComponent.tsx"],"names":["useMapBounds","useZoomLevel","DEFAULT_ZOOM","useClusters","getCenterForCoordinates","DEFAULT_POSITION","getZoomForCoordinates","jsx","APIProvider","MapContent"],"mappings":";;;;;;;;;AAUO,SAAS,YAA0B,CAAA;AAAA,EACxC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAO,GAAA;AACT,CAAmC,EAAA;AACjC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAU,EAAA,GAAIA,+BAAa,WAAW,CAAA;AACtD,EAAA,MAAM,EAAE,SAAW,EAAA,YAAA,EAAiB,GAAAC,8BAAA,CAAa,QAAQC,8BAAY,CAAA;AACrE,EAAA,MAAM,EAAE,QAAU,EAAA,YAAA,KAAiBC,6BAAY,CAAA,WAAA,EAAa,QAAQ,SAAS,CAAA;AAE7E,EAAM,MAAA,SAAA,GAAY,WACd,QACA,GAAA,WAAA,IAAe,YAAY,MAAS,GAAA,CAAA,GAClCC,yCAAwB,CAAA,WAAW,CACnC,GAAAC,kCAAA;AAEN,EAAM,MAAA,OAAA,GAAU,QACZ,GAAA,IAAA,GACA,WAAe,IAAA,WAAA,CAAY,SAAS,CAClC,GAAAC,uCAAA,CAAsB,WAAa,EAAA,IAAI,CACvC,GAAAJ,8BAAA;AAEN,EACE,uBAAAK,cAAA,CAACC,+BAAY,MACX,EAAA,QAAA,kBAAAD,cAAA;AAAA,IAACE,4BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ","file":"chunk-2VFY5AZA.cjs","sourcesContent":["'use client'\n\nimport { APIProvider } from '@vis.gl/react-google-maps'\n\nimport { DEFAULT_POSITION, DEFAULT_ZOOM } from '@/components/ui/Map/constants'\nimport { useClusters, useMapBounds, useZoomLevel } from '@/components/ui/Map/hooks'\nimport { MapContent } from '@/components/ui/Map/MapContent'\nimport type { MapComponentProps, PinData } from '@/components/ui/Map/types'\nimport { getCenterForCoordinates, getZoomForCoordinates } from '@/components/ui/Map/utils'\n\nexport function MapComponent<T = PinData>({\n apiKey,\n mapId,\n position,\n coordinates,\n onPinHover,\n onPinClick,\n focusPoint,\n radiusMiles,\n className,\n zoom = 10,\n}: Readonly<MapComponentProps<T>>) {\n const { bounds, setBounds } = useMapBounds(coordinates)\n const { zoomLevel, setZoomLevel } = useZoomLevel(zoom || DEFAULT_ZOOM)\n const { clusters, supercluster } = useClusters(coordinates, bounds, zoomLevel)\n\n const mapCenter = position\n ? position\n : coordinates && coordinates.length > 0\n ? getCenterForCoordinates(coordinates)\n : DEFAULT_POSITION\n\n const mapZoom = position\n ? zoom\n : coordinates && coordinates.length > 1\n ? getZoomForCoordinates(coordinates, zoom)\n : DEFAULT_ZOOM\n\n return (\n <APIProvider apiKey={apiKey}>\n <MapContent\n mapId={mapId}\n mapCenter={mapCenter}\n mapZoom={mapZoom}\n position={position}\n coordinates={coordinates}\n clusters={clusters}\n supercluster={supercluster}\n onPinHover={onPinHover}\n onPinClick={onPinClick}\n focusPoint={focusPoint}\n radiusMiles={radiusMiles}\n className={className}\n setBounds={setBounds}\n setZoomLevel={setZoomLevel}\n />\n </APIProvider>\n )\n}\n"]}
@@ -1,12 +1,12 @@
1
+ import { CompanyBenefits } from './chunk-BLMWXMW4.js';
1
2
  import { CompanyInformation } from './chunk-J3UEZGEG.js';
2
3
  import { CompanyTake } from './chunk-MF24QPA6.js';
3
4
  import { JobDescription } from './chunk-5NQTYPZG.js';
4
- import { JobHeader } from './chunk-6Z6T5WWS.js';
5
+ import { JobHeader } from './chunk-VRYGJJ5K.js';
6
+ import { getAddressList } from './chunk-KZBS5RNE.js';
5
7
  import { salaryRange } from './chunk-PLPEZUCB.js';
6
8
  import { cn } from './chunk-2FGZQI42.js';
7
- import { CompanyBenefits } from './chunk-BLMWXMW4.js';
8
- import { useDisplayText } from './chunk-CPZFINPG.js';
9
- import { getAddressList } from './chunk-KZBS5RNE.js';
9
+ import { useDisplayText } from './chunk-K76RPF2X.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-QYSTBZXD.js.map
115
- //# sourceMappingURL=chunk-QYSTBZXD.js.map
114
+ //# sourceMappingURL=chunk-45FFXB2Y.js.map
115
+ //# sourceMappingURL=chunk-45FFXB2Y.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/jobPost/JobPost.tsx"],"names":[],"mappings":"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","file":"chunk-QYSTBZXD.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-45FFXB2Y.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,5 +1,5 @@
1
- import { DisplayTextScopeNotFoundError, DisplayTextValueNotFoundError } from './chunk-YB2USB4M.js';
2
1
  import { defaultMappings } from './chunk-TCV6N3EK.js';
2
+ import { DisplayTextScopeNotFoundError, DisplayTextValueNotFoundError } from './chunk-YB2USB4M.js';
3
3
 
4
4
  // src/services/displayText.tsx
5
5
  var DisplayTextService = class {
@@ -31,5 +31,5 @@ var DisplayTextService = class {
31
31
  };
32
32
 
33
33
  export { DisplayTextService };
34
- //# sourceMappingURL=chunk-OZJZVEF2.js.map
35
- //# sourceMappingURL=chunk-OZJZVEF2.js.map
34
+ //# sourceMappingURL=chunk-4E3ANVRR.js.map
35
+ //# sourceMappingURL=chunk-4E3ANVRR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/displayText.tsx"],"names":["displayTexts"],"mappings":";;;;AAiCO,IAAM,qBAAN,MAAwD;AAAA,EAI7D,YAAY,cAA2C,EAAA;AAHvD,IAAA,IAAA,CAAiB,eAAqC,GAAA,IAAA;AAIpD,IAAA,IAAA,CAAK,QAAW,GAAA;AAAA,MACd,GAAG,eAAA;AAAA;AAAA,MACH,GAAG;AAAA;AAAA,KACL;AAAA;AACF,EAEA,MAAM,cACJ,CAAA,KAAA,EACA,KACA,EAAA,QAAA,GAA8B,KAAK,eAClB,EAAA;AACjB,IAAM,MAAA,YAAA,GAAe,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA;AAExC,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAM,MAAA,IAAI,8BAA8B,KAAK,CAAA;AAAA;AAG/C,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,MAAM,MAAA,mBAAA,GAAsB,KAAM,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,cAAe,CAAA,KAAA,EAAO,CAAG,EAAA,QAAQ,CAAC,CAAA;AACpF,MAAA,MAAMA,aAAe,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AAC1D,MAAOA,OAAAA,aAAAA,CAAa,OAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAGlD,IAAM,MAAA,YAAA,GAAe,aAAa,KAAK,CAAA;AAEvC,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAM,MAAA,IAAI,6BAA8B,CAAA,KAAA,EAAO,KAAK,CAAA;AAAA;AAGtD,IAAA,OAAO,aAAa,QAAQ,CAAA,IAAK,YAAa,CAAA,IAAA,CAAK,eAAe,CAAK,IAAA,KAAA;AAAA;AAE3E","file":"chunk-OZJZVEF2.js","sourcesContent":["import { type z } from 'zod'\n\nimport { defaultMappings } from '@/lib/mappings'\nimport {\n DisplayTextScopeNotFoundError,\n DisplayTextValueNotFoundError,\n} from '@/types/displayText.errors'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst SUPPORTED_LANGUAGES = ['en'] as const\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]\n\n// Define the display text configuration type for Zod enums\nexport type ServiceMappings = typeof defaultMappings\n\ntype ZodEnumValue<T> = T extends z.ZodEnum<[string, ...string[]]> ? z.infer<T> : never\n\nexport type DisplayTextConfig<T = string> = {\n [K in T extends z.ZodEnum<[string, ...string[]]> ? ZodEnumValue<T> : string]: {\n [L in SupportedLanguage]: string\n }\n} & Record<string, { [L in SupportedLanguage]: string }>\n\n// Define the expected interface for the service\nexport interface IDisplayTextService {\n getDisplayText: (\n scope: keyof ServiceMappings,\n value: string | string[],\n language?: SupportedLanguage\n ) => Promise<string>\n}\n\n// define the service\nexport class DisplayTextService implements IDisplayTextService {\n private readonly defaultLanguage: SupportedLanguage = 'en'\n private readonly mappings: ServiceMappings\n\n constructor(customMappings?: Partial<ServiceMappings>) {\n this.mappings = {\n ...defaultMappings, // Use all pre-defined mappings as defaults\n ...customMappings, // Override with any custom mappings if provided\n }\n }\n\n async getDisplayText(\n scope: keyof ServiceMappings,\n value: string | string[],\n language: SupportedLanguage = this.defaultLanguage\n ): Promise<string> {\n const scopeMapping = this.mappings[scope]\n\n if (!scopeMapping) {\n throw new DisplayTextScopeNotFoundError(scope)\n }\n\n if (Array.isArray(value)) {\n const displayTextPromises = value.map((v) => this.getDisplayText(scope, v, language))\n const displayTexts = await Promise.all(displayTextPromises)\n return displayTexts.filter((v) => !!v).join(', ')\n }\n\n const displayTexts = scopeMapping[value]\n\n if (!displayTexts) {\n throw new DisplayTextValueNotFoundError(value, scope)\n }\n\n return displayTexts[language] || displayTexts[this.defaultLanguage] || value\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/services/displayText.tsx"],"names":["displayTexts"],"mappings":";;;;AAiCO,IAAM,qBAAN,MAAwD;AAAA,EAI7D,YAAY,cAA2C,EAAA;AAHvD,IAAA,IAAA,CAAiB,eAAqC,GAAA,IAAA;AAIpD,IAAA,IAAA,CAAK,QAAW,GAAA;AAAA,MACd,GAAG,eAAA;AAAA;AAAA,MACH,GAAG;AAAA;AAAA,KACL;AAAA;AACF,EAEA,MAAM,cACJ,CAAA,KAAA,EACA,KACA,EAAA,QAAA,GAA8B,KAAK,eAClB,EAAA;AACjB,IAAM,MAAA,YAAA,GAAe,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA;AAExC,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAM,MAAA,IAAI,8BAA8B,KAAK,CAAA;AAAA;AAG/C,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,MAAM,MAAA,mBAAA,GAAsB,KAAM,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,cAAe,CAAA,KAAA,EAAO,CAAG,EAAA,QAAQ,CAAC,CAAA;AACpF,MAAA,MAAMA,aAAe,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AAC1D,MAAOA,OAAAA,aAAAA,CAAa,OAAO,CAAC,CAAA,KAAM,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;AAGlD,IAAM,MAAA,YAAA,GAAe,aAAa,KAAK,CAAA;AAEvC,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAM,MAAA,IAAI,6BAA8B,CAAA,KAAA,EAAO,KAAK,CAAA;AAAA;AAGtD,IAAA,OAAO,aAAa,QAAQ,CAAA,IAAK,YAAa,CAAA,IAAA,CAAK,eAAe,CAAK,IAAA,KAAA;AAAA;AAE3E","file":"chunk-4E3ANVRR.js","sourcesContent":["import { type z } from 'zod'\n\nimport { defaultMappings } from '@/lib/mappings'\nimport {\n DisplayTextScopeNotFoundError,\n DisplayTextValueNotFoundError,\n} from '@/types/displayText.errors'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst SUPPORTED_LANGUAGES = ['en'] as const\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]\n\n// Define the display text configuration type for Zod enums\nexport type ServiceMappings = typeof defaultMappings\n\ntype ZodEnumValue<T> = T extends z.ZodEnum<[string, ...string[]]> ? z.infer<T> : never\n\nexport type DisplayTextConfig<T = string> = {\n [K in T extends z.ZodEnum<[string, ...string[]]> ? ZodEnumValue<T> : string]: {\n [L in SupportedLanguage]: string\n }\n} & Record<string, { [L in SupportedLanguage]: string }>\n\n// Define the expected interface for the service\nexport interface IDisplayTextService {\n getDisplayText: (\n scope: keyof ServiceMappings,\n value: string | string[],\n language?: SupportedLanguage\n ) => Promise<string>\n}\n\n// define the service\nexport class DisplayTextService implements IDisplayTextService {\n private readonly defaultLanguage: SupportedLanguage = 'en'\n private readonly mappings: ServiceMappings\n\n constructor(customMappings?: Partial<ServiceMappings>) {\n this.mappings = {\n ...defaultMappings, // Use all pre-defined mappings as defaults\n ...customMappings, // Override with any custom mappings if provided\n }\n }\n\n async getDisplayText(\n scope: keyof ServiceMappings,\n value: string | string[],\n language: SupportedLanguage = this.defaultLanguage\n ): Promise<string> {\n const scopeMapping = this.mappings[scope]\n\n if (!scopeMapping) {\n throw new DisplayTextScopeNotFoundError(scope)\n }\n\n if (Array.isArray(value)) {\n const displayTextPromises = value.map((v) => this.getDisplayText(scope, v, language))\n const displayTexts = await Promise.all(displayTextPromises)\n return displayTexts.filter((v) => !!v).join(', ')\n }\n\n const displayTexts = scopeMapping[value]\n\n if (!displayTexts) {\n throw new DisplayTextValueNotFoundError(value, scope)\n }\n\n return displayTexts[language] || displayTexts[this.defaultLanguage] || value\n }\n}\n"]}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunk2YUUVN7E_cjs = require('./chunk-2YUUVN7E.cjs');
3
+ var chunkZZCTMR2F_cjs = require('./chunk-ZZCTMR2F.cjs');
4
4
  var chunkXUTLQ573_cjs = require('./chunk-XUTLQ573.cjs');
5
5
  var react = require('react');
6
6
 
7
7
  var useDisplayText = (scope, value) => {
8
8
  const [displayText, setDisplayText] = react.useState("");
9
- const displayService = react.useMemo(() => new chunk2YUUVN7E_cjs.DisplayTextService(), []);
9
+ const displayService = react.useMemo(() => new chunkZZCTMR2F_cjs.DisplayTextService(), []);
10
10
  react.useEffect(() => {
11
11
  if (!displayService || !value) {
12
12
  setDisplayText("");
@@ -35,5 +35,5 @@ var useDisplayText = (scope, value) => {
35
35
  };
36
36
 
37
37
  exports.useDisplayText = useDisplayText;
38
- //# sourceMappingURL=chunk-OXDKVZZ5.cjs.map
39
- //# sourceMappingURL=chunk-OXDKVZZ5.cjs.map
38
+ //# sourceMappingURL=chunk-567FG76G.cjs.map
39
+ //# sourceMappingURL=chunk-567FG76G.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useDisplayText.ts"],"names":["useState","useMemo","DisplayTextService","useEffect","DisplayTextValueNotFoundError"],"mappings":";;;;;;AAKa,IAAA,cAAA,GAAiB,CAC5B,KAAA,EACA,KACG,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAiBC,aAAQ,CAAA,MAAM,IAAIC,oCAAmB,EAAA,EAAG,EAAE,CAAA;AAEjE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,KAAO,EAAA;AAC7B,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA;AAAA;AAEF,IAAA,KAAA,CAAM,YAAY;AAChB,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,MAAM,cAAe,CAAA,cAAA,CAAe,OAAO,KAAK,CAAA;AAC/D,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAA,cAAA,CAAe,MAAM,CAAA;AAAA,SAChB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,sCAAsC,MAAM,CAAA;AAAA;AAC5D,eACO,KAAO,EAAA;AACd,QAAA,IAAI,iBAAiBC,+CAA+B,EAAA;AAClD,UAAQ,OAAA,CAAA,IAAA,CAAK,iCAAiC,KAAK,CAAA;AACnD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA;AAC9B;AACF,KACC,GAAA;AAAA,GACF,EAAA,CAAC,KAAO,EAAA,KAAA,EAAO,cAAc,CAAC,CAAA;AAEjC,EAAO,OAAA,WAAA;AACT","file":"chunk-OXDKVZZ5.cjs","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\n\nimport { DisplayTextService, type ServiceMappings } from '@/services/displayText'\nimport { DisplayTextValueNotFoundError } from '@/types/displayText.errors'\n\nexport const useDisplayText = (\n scope: keyof ServiceMappings,\n value: string | string[] | undefined | null\n) => {\n const [displayText, setDisplayText] = useState('')\n const displayService = useMemo(() => new DisplayTextService(), [])\n\n useEffect(() => {\n if (!displayService || !value) {\n setDisplayText('')\n return\n }\n void (async () => {\n try {\n const result = await displayService.getDisplayText(scope, value)\n if (typeof result === 'string') {\n setDisplayText(result)\n } else {\n console.error('Expected a string result, but got:', result)\n }\n } catch (error) {\n if (error instanceof DisplayTextValueNotFoundError) {\n console.warn('Display text value not found:', value)\n setDisplayText(String(value))\n } else {\n console.error('Unexpected error formatting text:', error)\n setDisplayText(String(value))\n }\n }\n })()\n }, [scope, value, displayService])\n\n return displayText\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useDisplayText.ts"],"names":["useState","useMemo","DisplayTextService","useEffect","DisplayTextValueNotFoundError"],"mappings":";;;;;;AAKa,IAAA,cAAA,GAAiB,CAC5B,KAAA,EACA,KACG,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAiBC,aAAQ,CAAA,MAAM,IAAIC,oCAAmB,EAAA,EAAG,EAAE,CAAA;AAEjE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,KAAO,EAAA;AAC7B,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA;AAAA;AAEF,IAAA,KAAA,CAAM,YAAY;AAChB,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,MAAM,cAAe,CAAA,cAAA,CAAe,OAAO,KAAK,CAAA;AAC/D,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAA,cAAA,CAAe,MAAM,CAAA;AAAA,SAChB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,sCAAsC,MAAM,CAAA;AAAA;AAC5D,eACO,KAAO,EAAA;AACd,QAAA,IAAI,iBAAiBC,+CAA+B,EAAA;AAClD,UAAQ,OAAA,CAAA,IAAA,CAAK,iCAAiC,KAAK,CAAA;AACnD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA;AAC9B;AACF,KACC,GAAA;AAAA,GACF,EAAA,CAAC,KAAO,EAAA,KAAA,EAAO,cAAc,CAAC,CAAA;AAEjC,EAAO,OAAA,WAAA;AACT","file":"chunk-567FG76G.cjs","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\n\nimport { DisplayTextService, type ServiceMappings } from '@/services/displayText'\nimport { DisplayTextValueNotFoundError } from '@/types/displayText.errors'\n\nexport const useDisplayText = (\n scope: keyof ServiceMappings,\n value: string | string[] | undefined | null\n) => {\n const [displayText, setDisplayText] = useState('')\n const displayService = useMemo(() => new DisplayTextService(), [])\n\n useEffect(() => {\n if (!displayService || !value) {\n setDisplayText('')\n return\n }\n void (async () => {\n try {\n const result = await displayService.getDisplayText(scope, value)\n if (typeof result === 'string') {\n setDisplayText(result)\n } else {\n console.error('Expected a string result, but got:', result)\n }\n } catch (error) {\n if (error instanceof DisplayTextValueNotFoundError) {\n console.warn('Display text value not found:', value)\n setDisplayText(String(value))\n } else {\n console.error('Unexpected error formatting text:', error)\n setDisplayText(String(value))\n }\n }\n })()\n }, [scope, value, displayService])\n\n return displayText\n}\n"]}
@@ -57,7 +57,7 @@ var Input = react.forwardRef(
57
57
  /* @__PURE__ */ jsxRuntime.jsx(
58
58
  "input",
59
59
  {
60
- className: chunkMGWZXPMF_cjs.cn(inputVariants({ theme, hasIcon, size })),
60
+ className: chunkMGWZXPMF_cjs.cn(inputVariants({ theme, hasIcon, size }), classNames?.input),
61
61
  ref,
62
62
  placeholder,
63
63
  value,
@@ -136,5 +136,5 @@ var inputVariants = cva.cva(
136
136
  var Input_default = Input;
137
137
 
138
138
  exports.Input_default = Input_default;
139
- //# sourceMappingURL=chunk-6KGXXX6X.cjs.map
140
- //# sourceMappingURL=chunk-6KGXXX6X.cjs.map
139
+ //# sourceMappingURL=chunk-6XAUCO2D.cjs.map
140
+ //# sourceMappingURL=chunk-6XAUCO2D.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Input.tsx"],"names":["forwardRef","icons","jsxs","cn","jsx","Label_default","X","ErrorMessage_default","cva"],"mappings":"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","file":"chunk-6XAUCO2D.cjs","sourcesContent":["import { cva, type VariantProps } from 'cva'\nimport { icons, X } from 'lucide-react'\nimport { type ChangeEvent, forwardRef, type InputHTMLAttributes } from 'react'\n\nimport ErrorMessage from '@/components/ui/ErrorMessage'\nimport Label from '@/components/ui/Label'\nimport { cn } from '@/lib/utils'\n\ninterface Props\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof inputVariants> {\n label?: string\n error?: string\n icon?: keyof typeof icons\n description?: string\n classNames?: { label?: string; input?: string }\n onClear?: () => void\n}\n\n/**\n * A reusable input component that supports icons, labels, error messages, and clearing functionality.\n *\n * @example\n * // Basic usage\n * <Input\n * id=\"email\"\n * name=\"email\"\n * placeholder=\"Enter your email\"\n * />\n *\n * @example\n * // With label and error\n * <Input\n * id=\"username\"\n * label=\"Username\"\n * error=\"Username is required\"\n * required\n * />\n *\n * @example\n * // Search input with clear functionality\n * <Input\n * icon=\"Search\"\n * value={searchValue}\n * onChange={handleChange}\n * onClear={() => setSearchValue('')}\n * />\n */\nconst Input = forwardRef<HTMLInputElement, Props>(\n (\n {\n label,\n error,\n description,\n theme,\n size,\n icon,\n onClear,\n value,\n onChange,\n classNames,\n className,\n ...props\n },\n ref\n ) => {\n const handleClear = () => {\n onChange?.({ target: { value: '' } } as ChangeEvent<HTMLInputElement>)\n onClear?.()\n }\n\n const IconComponent = icon && icons[icon]\n\n const placeholder = props.placeholder ?? (icon === 'Search' ? 'Search...' : '')\n const hasIcon = !!icon\n\n const iconColor = theme === 'dark' ? 'text-white' : 'text-grey-80'\n\n return (\n <div\n className={cn('group flex w-full flex-col gap-1', className)}\n data-testid={`input-wrapper-${props.id}`}\n >\n {label && (\n <Label\n text={label}\n htmlFor={props.name}\n required={props.required}\n description={description}\n className={classNames?.label}\n />\n )}\n <div className=\"relative flex flex-row items-center\">\n {IconComponent && (\n <IconComponent\n className={`absolute left-3 h-4 w-4 ${iconColor} opacity-50 group-hover:opacity-100`}\n />\n )}\n <input\n className={cn(inputVariants({ theme, hasIcon, size }), classNames?.input)}\n ref={ref}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n data-testid={`input-element-${props.id}`}\n {...props}\n />\n {hasIcon && value && (\n <X\n className={`absolute right-3 h-4 w-4 cursor-pointer ${iconColor}`}\n onClick={handleClear}\n data-testid=\"clear-button\"\n />\n )}\n </div>\n\n <ErrorMessage message={error} />\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nconst inputVariants = cva(\n [\n 'border',\n 'border-grey-20',\n 'placeholder:text-grey-50',\n 'focus-visible:ring-ring',\n 'inline-flex',\n 'w-full',\n 'items-center',\n 'justify-start',\n 'gap-3',\n 'rounded-lg',\n 'bg-transparent',\n 'shadow-sm',\n 'transition-colors',\n 'focus-visible:outline-none',\n 'focus-visible:ring-1',\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n 'appearance-none',\n '[&::-webkit-search-cancel-button]:appearance-none',\n '[&::-webkit-search-decoration]:appearance-none',\n '[&::-webkit-search-results-button]:appearance-none',\n '[&::-webkit-search-results-decoration]:appearance-none',\n '[&::-ms-clear]:display-none',\n '[&::-ms-reveal]:display-none',\n ],\n {\n variants: {\n theme: {\n light: 'text-grey-80',\n dark: 'text-white',\n },\n size: {\n small: 'h-8 pl-4 pr-3 py-1 text-xs',\n normal: 'h-9 pl-4 pr-3 py-2 text-sm',\n large: 'h-10 pl-4 pr-3 py-2 text-base',\n xlarge: 'h-11 pl-4 pr-3 py-3 text-base',\n },\n hasIcon: {\n false: 'pl-3',\n true: 'pl-8',\n },\n },\n defaultVariants: {\n theme: 'light',\n size: 'normal',\n hasIcon: false,\n },\n }\n)\n\nexport default Input\n"]}
@@ -25,10 +25,28 @@ function useClusters(coordinates, bounds, zoomLevel) {
25
25
  if (!coordinates) return [];
26
26
  return chunkEBKY3MJH_cjs.convertCoordinatesToGeoJSON(coordinates);
27
27
  }, [coordinates]);
28
+ const superclusterBounds = react.useMemo(() => {
29
+ const isInitialBounds = bounds && bounds[0][0] === -180 && bounds[0][1] === -85 && bounds[1][0] === 180 && bounds[1][1] === 85;
30
+ if (!bounds || isInitialBounds) {
31
+ return [-180, -85, 180, 85];
32
+ }
33
+ const [[south, west], [north, east]] = bounds;
34
+ if (!isFinite(south) || !isFinite(west) || !isFinite(north) || !isFinite(east) || south >= north || west >= east) {
35
+ return [-180, -85, 180, 85];
36
+ }
37
+ const latRange = north - south;
38
+ const lngRange = east - west;
39
+ const latBuffer = latRange * 0.1;
40
+ const lngBuffer = lngRange * 0.1;
41
+ const bufferedSouth = Math.max(-85, south - latBuffer);
42
+ const bufferedWest = Math.max(-180, west - lngBuffer);
43
+ const bufferedNorth = Math.min(85, north + latBuffer);
44
+ const bufferedEast = Math.min(180, east + lngBuffer);
45
+ return [bufferedWest, bufferedSouth, bufferedEast, bufferedNorth];
46
+ }, [bounds]);
28
47
  const { clusters, supercluster } = useSupercluster__default.default({
29
48
  points,
30
- bounds: [-180, -85, 180, 85],
31
- // Use global bounds for consistency
49
+ bounds: superclusterBounds,
32
50
  zoom: zoomLevel || 10,
33
51
  options: chunkNLGWU2KI_cjs.CLUSTERING_CONFIG
34
52
  });
@@ -38,5 +56,5 @@ function useClusters(coordinates, bounds, zoomLevel) {
38
56
  exports.useClusters = useClusters;
39
57
  exports.useMapBounds = useMapBounds;
40
58
  exports.useZoomLevel = useZoomLevel;
41
- //# sourceMappingURL=chunk-SKMP4FO7.cjs.map
42
- //# sourceMappingURL=chunk-SKMP4FO7.cjs.map
59
+ //# sourceMappingURL=chunk-ASPUIRWU.cjs.map
60
+ //# sourceMappingURL=chunk-ASPUIRWU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Map/hooks.ts"],"names":["useState","useMemo","convertCoordinatesToGeoJSON","useSupercluster","CLUSTERING_CONFIG"],"mappings":";;;;;;;;;;;AAOO,SAAS,aAA0B,YAAgC,EAAA;AACxE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAA+C,CAAA;AAAA,IACzE,CAAC,MAAM,GAAG,CAAA;AAAA,IACV,CAAC,KAAK,EAAE;AAAA,GACT,CAAA;AAID,EAAO,OAAA,EAAE,QAAQ,SAAU,EAAA;AAC7B;AAEO,SAAS,aAAa,WAAqB,EAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,WAAW,CAAA;AACtD,EAAO,OAAA,EAAE,WAAW,YAAa,EAAA;AACnC;AAEO,SAAS,WAAA,CACd,WACA,EAAA,MAAA,EACA,SACA,EAAA;AACA,EAAM,MAAA,MAAA,GAASC,cAAQ,MAAM;AAC3B,IAAI,IAAA,CAAC,WAAa,EAAA,OAAO,EAAC;AAC1B,IAAA,OAAOC,8CAA+B,WAAW,CAAA;AAAA,GACnD,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAM,MAAA,kBAAA,GAAqBD,cAAQ,MAAM;AAEvC,IAAM,MAAA,eAAA,GACJ,MACA,IAAA,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAM,KAAA,IAAA,IACjB,MAAO,CAAA,CAAC,CAAE,CAAA,CAAC,MAAM,GACjB,IAAA,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,KAAM,OACjB,MAAO,CAAA,CAAC,CAAE,CAAA,CAAC,CAAM,KAAA,EAAA;AAGnB,IAAI,IAAA,CAAC,UAAU,eAAiB,EAAA;AAC9B,MAAA,OAAO,CAAC,IAAA,EAAM,GAAK,EAAA,GAAA,EAAK,EAAE,CAAA;AAAA;AAI5B,IAAM,MAAA,CAAC,CAAC,KAAO,EAAA,IAAI,GAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAI,GAAA,MAAA;AAGvC,IAAA,IACE,CAAC,QAAS,CAAA,KAAK,KACf,CAAC,QAAA,CAAS,IAAI,CACd,IAAA,CAAC,SAAS,KAAK,CAAA,IACf,CAAC,QAAS,CAAA,IAAI,KACd,KAAS,IAAA,KAAA,IACT,QAAQ,IACR,EAAA;AACA,MAAA,OAAO,CAAC,IAAA,EAAM,GAAK,EAAA,GAAA,EAAK,EAAE,CAAA;AAAA;AAI5B,IAAA,MAAM,WAAW,KAAQ,GAAA,KAAA;AACzB,IAAA,MAAM,WAAW,IAAO,GAAA,IAAA;AACxB,IAAA,MAAM,YAAY,QAAW,GAAA,GAAA;AAC7B,IAAA,MAAM,YAAY,QAAW,GAAA,GAAA;AAG7B,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,QAAQ,SAAS,CAAA;AACrD,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,EAAM,OAAO,SAAS,CAAA;AACpD,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,QAAQ,SAAS,CAAA;AACpD,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,OAAO,SAAS,CAAA;AAGnD,IAAA,OAAO,CAAC,YAAA,EAAc,aAAe,EAAA,YAAA,EAAc,aAAa,CAAA;AAAA,GAClE,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,EAAE,QAAA,EAAU,YAAa,EAAA,GAAIE,gCAAgB,CAAA;AAAA,IACjD,MAAA;AAAA,IACA,MAAQ,EAAA,kBAAA;AAAA,IACR,MAAM,SAAa,IAAA,EAAA;AAAA,IACnB,OAAS,EAAAC;AAAA,GACV,CAAA;AAED,EAAO,OAAA,EAAE,UAAU,YAAa,EAAA;AAClC","file":"chunk-ASPUIRWU.cjs","sourcesContent":["import { useMemo, useState } from 'react'\nimport useSupercluster from 'use-supercluster'\n\nimport { convertCoordinatesToGeoJSON } from '@/components/ui/Map/clustering'\nimport { CLUSTERING_CONFIG } from '@/components/ui/Map/constants'\nimport type { Coordinate, PinData } from '@/components/ui/Map/types'\n\nexport function useMapBounds<T = PinData>(_coordinates?: Coordinate<T>[]) {\n const [bounds, setBounds] = useState<[[number, number], [number, number]]>([\n [-180, -85],\n [180, 85],\n ])\n\n // Use global bounds for stability - let the map handle the actual bounds\n // This prevents constant recalculation that causes clustering instability\n return { bounds, setBounds }\n}\n\nexport function useZoomLevel(initialZoom: number) {\n const [zoomLevel, setZoomLevel] = useState(initialZoom)\n return { zoomLevel, setZoomLevel }\n}\n\nexport function useClusters<T = PinData>(\n coordinates?: Coordinate<T>[],\n bounds?: [[number, number], [number, number]],\n zoomLevel?: number\n) {\n const points = useMemo(() => {\n if (!coordinates) return []\n return convertCoordinatesToGeoJSON<T>(coordinates)\n }, [coordinates])\n\n // Convert bounds format and add buffer for smoother panning\n const superclusterBounds = useMemo(() => {\n // Check if bounds are still in initial global state\n const isInitialBounds =\n bounds &&\n bounds[0][0] === -180 &&\n bounds[0][1] === -85 &&\n bounds[1][0] === 180 &&\n bounds[1][1] === 85\n\n // If bounds are not set or still initial, use global bounds\n if (!bounds || isInitialBounds) {\n return [-180, -85, 180, 85]\n }\n\n // Extract bounds: [[south, west], [north, east]]\n const [[south, west], [north, east]] = bounds\n\n // Validate bounds\n if (\n !isFinite(south) ||\n !isFinite(west) ||\n !isFinite(north) ||\n !isFinite(east) ||\n south >= north ||\n west >= east\n ) {\n return [-180, -85, 180, 85]\n }\n\n // Calculate buffer (10% of the range in each direction)\n const latRange = north - south\n const lngRange = east - west\n const latBuffer = latRange * 0.1\n const lngBuffer = lngRange * 0.1\n\n // Apply buffer and clamp to valid geographic bounds\n const bufferedSouth = Math.max(-85, south - latBuffer)\n const bufferedWest = Math.max(-180, west - lngBuffer)\n const bufferedNorth = Math.min(85, north + latBuffer)\n const bufferedEast = Math.min(180, east + lngBuffer)\n\n // Convert to useSupercluster format: [west, south, east, north]\n return [bufferedWest, bufferedSouth, bufferedEast, bufferedNorth]\n }, [bounds])\n\n const { clusters, supercluster } = useSupercluster({\n points,\n bounds: superclusterBounds,\n zoom: zoomLevel || 10,\n options: CLUSTERING_CONFIG,\n })\n\n return { clusters, supercluster }\n}\n"]}
@@ -69,6 +69,8 @@ var Select = react.forwardRef(
69
69
  const chipLabels = selected?.map((s) => options?.find(({ value: value2 }) => value2 === s)).filter(Boolean);
70
70
  function handleChange(newValue) {
71
71
  if (newValue === "" && !multiselect) return;
72
+ const option = options?.find((opt) => opt.value === newValue);
73
+ if (option?.disabled) return;
72
74
  let newSelected = [];
73
75
  setSelected((prev) => {
74
76
  newSelected = prev.includes(newValue) ? prev.filter((item) => item !== newValue) : [...prev, newValue];
@@ -179,7 +181,7 @@ var Select = react.forwardRef(
179
181
  ),
180
182
  "data-state": selected.includes(value2) ? "checked" : "unchecked",
181
183
  onKeyDown: (e) => setValueOnEnter(e, value2),
182
- onClick: () => handleChange(value2),
184
+ onClick: () => !disabled && handleChange(value2),
183
185
  children: [
184
186
  /* @__PURE__ */ jsxRuntime.jsx(
185
187
  lucideReact.CheckIcon,
@@ -240,5 +242,5 @@ var triggerVariants = cva.cva(
240
242
  var Select_default = Select;
241
243
 
242
244
  exports.Select_default = Select_default;
243
- //# sourceMappingURL=chunk-Z2I2265Q.cjs.map
244
- //# sourceMappingURL=chunk-Z2I2265Q.cjs.map
245
+ //# sourceMappingURL=chunk-FDGHWRRP.cjs.map
246
+ //# sourceMappingURL=chunk-FDGHWRRP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/Select.tsx"],"names":["forwardRef","useState","useRef","useEffect","value","jsxs","cn","jsx","Label_default","SelectPrimitive","ChevronDownIcon","Fragment","Chip_default","X","Separator","id","description","CheckIcon","ErrorMessage_default","cva"],"mappings":"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","file":"chunk-FDGHWRRP.cjs","sourcesContent":["'use client'\n\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { cva, type VariantProps } from 'cva'\nimport { CheckIcon, ChevronDownIcon, X } from 'lucide-react'\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Separator } from '@/components/primitives/separator'\nimport Chip from '@/components/ui/Chip'\nimport ErrorMessage from '@/components/ui/ErrorMessage'\nimport Label from '@/components/ui/Label'\nimport { cn } from '@/lib/utils'\n\ntype SelectContentProps = React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\ntype RadixAlignType = SelectContentProps['align']\n\ntype TriggerVariants = VariantProps<typeof triggerVariants>\n\ninterface Props\n extends Omit<ComponentPropsWithoutRef<'select'>, 'value' | 'onChange' | 'size'>,\n TriggerVariants {\n label?: string\n value?: string | string[]\n options?: {\n id: string | number\n value: string\n title: string\n description?: string\n disabled?: boolean\n }[]\n placeholder?: string\n multiselect?: boolean\n description?: string\n error?: string\n classNames?: {\n label?: string\n trigger?: string\n content?: string\n item?: string\n checkmark?: string\n }\n dropdownAlign?: RadixAlignType\n useAnchor?: boolean\n onChange?: (value: string | string[]) => void\n onOpenChange?: (open: boolean) => void\n}\n\nconst Select = forwardRef<HTMLButtonElement, Props>(\n (\n {\n label,\n options,\n placeholder,\n multiselect,\n description,\n classNames,\n dropdownAlign = 'start',\n error,\n id,\n children: footer,\n useAnchor = true,\n size,\n ...props\n },\n ref\n ) => {\n const { value, defaultValue, dir, className, onChange, onOpenChange, ...rest } = props\n const [selected, setSelected] = useState<string[]>([])\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!value) return setSelected([])\n setSelected(Array.isArray(value) ? value : [value])\n }, [value])\n\n const toggleOpen = () => setOpen((prev) => !prev)\n const closeOnEscape = (event: KeyboardEvent) => event.key === 'Escape' && setOpen(false)\n const handleOnOpenChange = (isOpen: boolean) => {\n const shouldUpdate = !multiselect || isOpen\n if (shouldUpdate) {\n setOpen(isOpen)\n onOpenChange?.(isOpen)\n }\n }\n const setValueOnEnter = (event: KeyboardEvent, value: string) =>\n event.key === 'Enter' && handleChange(value)\n const getLabel = () =>\n selected.map((o) => options?.find((option) => option.value === o)?.title).join(', ')\n\n const chipLabels = selected\n ?.map((s) => options?.find(({ value }) => value === s))\n .filter(Boolean)\n\n function handleChange(newValue: string) {\n if (newValue === '' && !multiselect) return // Prevent clearing single select\n // Check if the option is disabled\n const option = options?.find((opt) => opt.value === newValue)\n if (option?.disabled) return // Prevent selecting disabled options\n let newSelected: string[] = []\n setSelected((prev) => {\n newSelected = prev.includes(newValue)\n ? prev.filter((item) => item !== newValue)\n : [...prev, newValue]\n return multiselect ? newSelected : [newValue]\n })\n onChange?.(multiselect ? newSelected : newValue)\n }\n\n return (\n <div\n className={cn('flex w-full flex-col gap-1', className)}\n ref={containerRef}\n data-testid={`${(label ?? id)?.toLowerCase()}-select-element`}\n >\n <Label\n text={label}\n htmlFor={props.name}\n required={props.required}\n description={description}\n className={classNames?.label}\n />\n\n <SelectPrimitive.Root\n open={open}\n value={selected.join(',')}\n onOpenChange={handleOnOpenChange}\n onValueChange={multiselect ? undefined : handleChange}\n defaultValue={typeof defaultValue === 'string' ? defaultValue : undefined}\n dir={dir === 'rtl' ? 'rtl' : 'ltr'}\n {...rest}\n >\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(triggerVariants({ size }), classNames?.trigger)}\n >\n <span className=\"truncate\">\n <SelectPrimitive.Value\n placeholder={placeholder ?? 'Select an option'}\n aria-label={getLabel()}\n >\n {getLabel()}\n </SelectPrimitive.Value>\n </span>\n\n <ChevronDownIcon\n className=\"transform text-black group-data-[state=open]:rotate-180\"\n size=\"16\"\n />\n </SelectPrimitive.Trigger>\n\n <SelectPrimitive.Portal container={useAnchor ? containerRef.current : undefined}>\n <SelectPrimitive.Content\n hideWhenDetached\n className={cn(\n 'z-10 max-h-[var(--radix-select-content-available-height)] overflow-hidden rounded-md bg-white py-2 shadow-lg',\n 'w-[var(--radix-select-trigger-width)] min-w-[var(--radix-select-trigger-width)]',\n classNames?.content\n )}\n position=\"popper\"\n align={dropdownAlign}\n sideOffset={4}\n onPointerDownOutside={toggleOpen}\n onKeyDown={closeOnEscape}\n >\n <SelectPrimitive.Viewport>\n {multiselect && !!chipLabels?.length && (\n <>\n <SelectPrimitive.Group\n className=\"mb-2 flex flex-row flex-wrap gap-1 px-2\"\n data-testid=\"selected-labels\"\n >\n {chipLabels?.map(\n (chip) =>\n chip && (\n <Chip key={chip.title} size=\"small\" variant=\"primary\">\n <span>{chip.title}</span>\n <X\n size={18}\n data-testid={`chip-remove-${chip.value}`}\n className=\"cursor-pointer\"\n onClick={() => handleChange(chip.value)}\n />\n </Chip>\n )\n )}\n </SelectPrimitive.Group>\n <Separator />\n </>\n )}\n {options?.map(({ id, title, value, description, disabled }) => (\n <SelectPrimitive.Item\n key={id}\n value={value}\n disabled={disabled}\n className={cn(\n 'group relative cursor-pointer px-4 py-2 text-left text-sm hover:bg-purple-50 focus:bg-purple-50 focus:outline-none data-[state=checked]:bg-purple-50 data-[state=checked]:pr-10 data-[state=checked]:text-purple-100',\n disabled &&\n 'cursor-not-allowed opacity-50 hover:bg-transparent data-[state=checked]:bg-transparent',\n classNames?.item\n )}\n data-state={selected.includes(value) ? 'checked' : 'unchecked'}\n onKeyDown={(e) => setValueOnEnter(e, value)}\n onClick={() => !disabled && handleChange(value)}\n >\n <CheckIcon\n className={cn(\n 'absolute inset-y-0 right-3 my-auto hidden w-6 text-purple-100 group-data-[state=checked]:block',\n classNames?.checkmark\n )}\n size={16}\n />\n <SelectPrimitive.ItemText>{title}</SelectPrimitive.ItemText>\n {description && (\n <span className=\"block text-sm text-grey-70\">{description}</span>\n )}\n </SelectPrimitive.Item>\n ))}\n\n {!!footer && (\n <>\n <Separator />\n <SelectPrimitive.Group\n className=\"mt-2 flex flex-row flex-wrap gap-1 px-2\"\n data-testid=\"selected-labels\"\n >\n {footer}\n </SelectPrimitive.Group>\n </>\n )}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n\n <ErrorMessage message={error} />\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n\nconst triggerVariants = cva(\n 'group flex w-full flex-row items-center justify-between gap-3 rounded-lg border border-grey-20 font-normal text-grey-80 focus:outline-purple-100 disabled:bg-grey-5 data-[placeholder]:text-grey-50 data-[placeholder]:disabled:text-grey-40',\n {\n variants: {\n size: {\n small: 'h-8 px-3 py-1 text-xs',\n normal: 'h-9 px-3 py-2 text-sm',\n large: 'h-10 px-4 py-2 text-base',\n xlarge: 'h-11 px-4 py-3 text-base',\n },\n },\n defaultVariants: {\n size: 'normal',\n },\n }\n)\n\nexport default Select\n"]}
@@ -2,11 +2,11 @@
2
2
 
3
3
  var chunkXKLOANYB_cjs = require('./chunk-XKLOANYB.cjs');
4
4
  var chunkXWQI5MC3_cjs = require('./chunk-XWQI5MC3.cjs');
5
+ var chunkYNREEZ75_cjs = require('./chunk-YNREEZ75.cjs');
5
6
  var chunkLTJXX7NG_cjs = require('./chunk-LTJXX7NG.cjs');
7
+ var chunkKBAY4F7D_cjs = require('./chunk-KBAY4F7D.cjs');
6
8
  var chunkRKLUMDJB_cjs = require('./chunk-RKLUMDJB.cjs');
7
9
  var chunkXO6LO5CU_cjs = require('./chunk-XO6LO5CU.cjs');
8
- var chunkYNREEZ75_cjs = require('./chunk-YNREEZ75.cjs');
9
- var chunkKBAY4F7D_cjs = require('./chunk-KBAY4F7D.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-4FETL23S.cjs.map
224
- //# sourceMappingURL=chunk-4FETL23S.cjs.map
223
+ //# sourceMappingURL=chunk-IMJ7S3LK.cjs.map
224
+ //# sourceMappingURL=chunk-IMJ7S3LK.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-4FETL23S.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-IMJ7S3LK.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,10 +1,10 @@
1
1
  import { ListItem_default } from './chunk-QURNDLRE.js';
2
2
  import { Label_default } from './chunk-CAGLLWPR.js';
3
+ import { Badge } from './chunk-TVYLTYUK.js';
3
4
  import { ErrorMessage_default } from './chunk-CWTO3NXW.js';
5
+ import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-SNHRG4TY.js';
4
6
  import { Popover, PopoverTrigger, PopoverContent } from './chunk-ODHIUBLC.js';
5
7
  import { Separator } from './chunk-FNCPK4RH.js';
6
- import { Badge } from './chunk-TVYLTYUK.js';
7
- import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from './chunk-SNHRG4TY.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-PU4O76IS.js.map
222
- //# sourceMappingURL=chunk-PU4O76IS.js.map
221
+ //# sourceMappingURL=chunk-JQUWC2YP.js.map
222
+ //# sourceMappingURL=chunk-JQUWC2YP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/Combobox.tsx"],"names":["value","id"],"mappings":"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","file":"chunk-PU4O76IS.js","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":["value","id"],"mappings":"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","file":"chunk-JQUWC2YP.js","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,4 +1,4 @@
1
- import { DisplayTextService } from './chunk-OZJZVEF2.js';
1
+ import { DisplayTextService } from './chunk-4E3ANVRR.js';
2
2
  import { DisplayTextValueNotFoundError } from './chunk-YB2USB4M.js';
3
3
  import { useState, useMemo, useEffect } from 'react';
4
4
 
@@ -33,5 +33,5 @@ var useDisplayText = (scope, value) => {
33
33
  };
34
34
 
35
35
  export { useDisplayText };
36
- //# sourceMappingURL=chunk-CPZFINPG.js.map
37
- //# sourceMappingURL=chunk-CPZFINPG.js.map
36
+ //# sourceMappingURL=chunk-K76RPF2X.js.map
37
+ //# sourceMappingURL=chunk-K76RPF2X.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useDisplayText.ts"],"names":[],"mappings":";;;;AAKa,IAAA,cAAA,GAAiB,CAC5B,KAAA,EACA,KACG,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAiB,OAAQ,CAAA,MAAM,IAAI,kBAAmB,EAAA,EAAG,EAAE,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,KAAO,EAAA;AAC7B,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA;AAAA;AAEF,IAAA,KAAA,CAAM,YAAY;AAChB,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,MAAM,cAAe,CAAA,cAAA,CAAe,OAAO,KAAK,CAAA;AAC/D,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAA,cAAA,CAAe,MAAM,CAAA;AAAA,SAChB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,sCAAsC,MAAM,CAAA;AAAA;AAC5D,eACO,KAAO,EAAA;AACd,QAAA,IAAI,iBAAiB,6BAA+B,EAAA;AAClD,UAAQ,OAAA,CAAA,IAAA,CAAK,iCAAiC,KAAK,CAAA;AACnD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA;AAC9B;AACF,KACC,GAAA;AAAA,GACF,EAAA,CAAC,KAAO,EAAA,KAAA,EAAO,cAAc,CAAC,CAAA;AAEjC,EAAO,OAAA,WAAA;AACT","file":"chunk-CPZFINPG.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\n\nimport { DisplayTextService, type ServiceMappings } from '@/services/displayText'\nimport { DisplayTextValueNotFoundError } from '@/types/displayText.errors'\n\nexport const useDisplayText = (\n scope: keyof ServiceMappings,\n value: string | string[] | undefined | null\n) => {\n const [displayText, setDisplayText] = useState('')\n const displayService = useMemo(() => new DisplayTextService(), [])\n\n useEffect(() => {\n if (!displayService || !value) {\n setDisplayText('')\n return\n }\n void (async () => {\n try {\n const result = await displayService.getDisplayText(scope, value)\n if (typeof result === 'string') {\n setDisplayText(result)\n } else {\n console.error('Expected a string result, but got:', result)\n }\n } catch (error) {\n if (error instanceof DisplayTextValueNotFoundError) {\n console.warn('Display text value not found:', value)\n setDisplayText(String(value))\n } else {\n console.error('Unexpected error formatting text:', error)\n setDisplayText(String(value))\n }\n }\n })()\n }, [scope, value, displayService])\n\n return displayText\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useDisplayText.ts"],"names":[],"mappings":";;;;AAKa,IAAA,cAAA,GAAiB,CAC5B,KAAA,EACA,KACG,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAiB,OAAQ,CAAA,MAAM,IAAI,kBAAmB,EAAA,EAAG,EAAE,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,cAAkB,IAAA,CAAC,KAAO,EAAA;AAC7B,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA;AAAA;AAEF,IAAA,KAAA,CAAM,YAAY;AAChB,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,MAAM,cAAe,CAAA,cAAA,CAAe,OAAO,KAAK,CAAA;AAC/D,QAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,UAAA,cAAA,CAAe,MAAM,CAAA;AAAA,SAChB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,sCAAsC,MAAM,CAAA;AAAA;AAC5D,eACO,KAAO,EAAA;AACd,QAAA,IAAI,iBAAiB,6BAA+B,EAAA;AAClD,UAAQ,OAAA,CAAA,IAAA,CAAK,iCAAiC,KAAK,CAAA;AACnD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACvB,MAAA;AACL,UAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,UAAe,cAAA,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA;AAC9B;AACF,KACC,GAAA;AAAA,GACF,EAAA,CAAC,KAAO,EAAA,KAAA,EAAO,cAAc,CAAC,CAAA;AAEjC,EAAO,OAAA,WAAA;AACT","file":"chunk-K76RPF2X.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react'\n\nimport { DisplayTextService, type ServiceMappings } from '@/services/displayText'\nimport { DisplayTextValueNotFoundError } from '@/types/displayText.errors'\n\nexport const useDisplayText = (\n scope: keyof ServiceMappings,\n value: string | string[] | undefined | null\n) => {\n const [displayText, setDisplayText] = useState('')\n const displayService = useMemo(() => new DisplayTextService(), [])\n\n useEffect(() => {\n if (!displayService || !value) {\n setDisplayText('')\n return\n }\n void (async () => {\n try {\n const result = await displayService.getDisplayText(scope, value)\n if (typeof result === 'string') {\n setDisplayText(result)\n } else {\n console.error('Expected a string result, but got:', result)\n }\n } catch (error) {\n if (error instanceof DisplayTextValueNotFoundError) {\n console.warn('Display text value not found:', value)\n setDisplayText(String(value))\n } else {\n console.error('Unexpected error formatting text:', error)\n setDisplayText(String(value))\n }\n }\n })()\n }, [scope, value, displayService])\n\n return displayText\n}\n"]}