@burdenoff/microfe-ecoimpacthub 2026.720.2 → 2026.720.4

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 (484) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -1
  2. package/dist/ecoimpacthub/EcoImpactHubRoot.js.map +1 -1
  3. package/dist/ecoimpacthub/EcoImpactHubRoutes.js.map +1 -1
  4. package/dist/ecoimpacthub/components/DataTable.js.map +1 -1
  5. package/dist/ecoimpacthub/components/EcoDiscussion.js.map +1 -1
  6. package/dist/ecoimpacthub/components/EcoTags.js.map +1 -1
  7. package/dist/ecoimpacthub/components/EmptyState.js.map +1 -1
  8. package/dist/ecoimpacthub/components/EvidenceUpload.js.map +1 -1
  9. package/dist/ecoimpacthub/components/FeatureFlagGate.js.map +1 -1
  10. package/dist/ecoimpacthub/components/FileLink.js.map +1 -1
  11. package/dist/ecoimpacthub/components/FilterTabs.js.map +1 -1
  12. package/dist/ecoimpacthub/components/MetricsCard.js.map +1 -1
  13. package/dist/ecoimpacthub/components/MiniBar.js.map +1 -1
  14. package/dist/ecoimpacthub/components/PageLayout.js.map +1 -1
  15. package/dist/ecoimpacthub/components/Pagination.js.map +1 -1
  16. package/dist/ecoimpacthub/components/StateViews.js.map +1 -1
  17. package/dist/ecoimpacthub/components/StatusBadge.d.ts.map +1 -1
  18. package/dist/ecoimpacthub/components/StatusBadge.js +3 -0
  19. package/dist/ecoimpacthub/components/StatusBadge.js.map +1 -1
  20. package/dist/ecoimpacthub/components/Tabs.js.map +1 -1
  21. package/dist/ecoimpacthub/context/EcoImpactHubContext.js.map +1 -1
  22. package/dist/ecoimpacthub/hooks/useCursorPager.js.map +1 -1
  23. package/dist/ecoimpacthub/hooks/useEcoComments.js.map +1 -1
  24. package/dist/ecoimpacthub/hooks/useEcoFiles.js.map +1 -1
  25. package/dist/ecoimpacthub/hooks/useEcoImpactHubApi.js.map +1 -1
  26. package/dist/ecoimpacthub/hooks/useEcoTags.js.map +1 -1
  27. package/dist/ecoimpacthub/pages/DashboardPage.js.map +1 -1
  28. package/dist/ecoimpacthub/pages/_shared/ConservationBadge.js.map +1 -1
  29. package/dist/ecoimpacthub/pages/_shared/EvidenceThumb.js.map +1 -1
  30. package/dist/ecoimpacthub/pages/_shared/MethodBadge.js.map +1 -1
  31. package/dist/ecoimpacthub/pages/_shared/TaxonChip.js.map +1 -1
  32. package/dist/ecoimpacthub/pages/badges.js.map +1 -1
  33. package/dist/ecoimpacthub/pages/carbon/CarbonPage.js.map +1 -1
  34. package/dist/ecoimpacthub/pages/carbonVisuals.js.map +1 -1
  35. package/dist/ecoimpacthub/pages/habitat/HabitatProjectDetailPage.js.map +1 -1
  36. package/dist/ecoimpacthub/pages/habitat/HabitatProjectsPage.js.map +1 -1
  37. package/dist/ecoimpacthub/pages/habitat/LifecycleProgress.js.map +1 -1
  38. package/dist/ecoimpacthub/pages/monitoring/MonitoringPage.js.map +1 -1
  39. package/dist/ecoimpacthub/pages/observations/ObservationsPage.js.map +1 -1
  40. package/dist/ecoimpacthub/pages/reports/ReportDetailPage.js.map +1 -1
  41. package/dist/ecoimpacthub/pages/reports/ReportsPage.js.map +1 -1
  42. package/dist/ecoimpacthub/pages/sites/SiteDetailPage.js.map +1 -1
  43. package/dist/ecoimpacthub/pages/sites/SitesPage.js.map +1 -1
  44. package/dist/ecoimpacthub/pages/sites/siteTypeVisuals.js.map +1 -1
  45. package/dist/ecoimpacthub/pages/species/SpeciesDetailPage.js.map +1 -1
  46. package/dist/ecoimpacthub/pages/species/SpeciesPage.js.map +1 -1
  47. package/dist/ecoimpacthub/services/createSandboxAssistantTransport.d.ts.map +1 -1
  48. package/dist/ecoimpacthub/services/createSandboxAssistantTransport.js.map +1 -1
  49. package/dist/ecoimpacthub/types/index.d.ts.map +1 -1
  50. package/dist/ecoimpacthub/utils/cn.js.map +1 -1
  51. package/dist/ecoimpacthub/utils/formatters.js.map +1 -1
  52. package/dist/ecoimpacthub/utils/navigation.js.map +1 -1
  53. package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
  54. package/dist/node_modules/d3-array/src/ascending.js.map +1 -1
  55. package/dist/node_modules/d3-array/src/bisect.js.map +1 -1
  56. package/dist/node_modules/d3-array/src/bisector.js.map +1 -1
  57. package/dist/node_modules/d3-array/src/descending.js.map +1 -1
  58. package/dist/node_modules/d3-array/src/max.js.map +1 -1
  59. package/dist/node_modules/d3-array/src/min.js.map +1 -1
  60. package/dist/node_modules/d3-array/src/number.js.map +1 -1
  61. package/dist/node_modules/d3-array/src/quantile.js.map +1 -1
  62. package/dist/node_modules/d3-array/src/quickselect.js.map +1 -1
  63. package/dist/node_modules/d3-array/src/range.js.map +1 -1
  64. package/dist/node_modules/d3-array/src/sort.js.map +1 -1
  65. package/dist/node_modules/d3-array/src/ticks.js.map +1 -1
  66. package/dist/node_modules/d3-color/src/color.js.map +1 -1
  67. package/dist/node_modules/d3-color/src/define.js.map +1 -1
  68. package/dist/node_modules/d3-format/src/defaultLocale.js.map +1 -1
  69. package/dist/node_modules/d3-format/src/exponent.js.map +1 -1
  70. package/dist/node_modules/d3-format/src/formatDecimal.js.map +1 -1
  71. package/dist/node_modules/d3-format/src/formatGroup.js.map +1 -1
  72. package/dist/node_modules/d3-format/src/formatNumerals.js.map +1 -1
  73. package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +1 -1
  74. package/dist/node_modules/d3-format/src/formatRounded.js.map +1 -1
  75. package/dist/node_modules/d3-format/src/formatSpecifier.js.map +1 -1
  76. package/dist/node_modules/d3-format/src/formatTrim.js.map +1 -1
  77. package/dist/node_modules/d3-format/src/formatTypes.js.map +1 -1
  78. package/dist/node_modules/d3-format/src/identity.js.map +1 -1
  79. package/dist/node_modules/d3-format/src/locale.js.map +1 -1
  80. package/dist/node_modules/d3-format/src/precisionFixed.js.map +1 -1
  81. package/dist/node_modules/d3-format/src/precisionPrefix.js.map +1 -1
  82. package/dist/node_modules/d3-format/src/precisionRound.js.map +1 -1
  83. package/dist/node_modules/d3-interpolate/src/array.js.map +1 -1
  84. package/dist/node_modules/d3-interpolate/src/basis.js.map +1 -1
  85. package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +1 -1
  86. package/dist/node_modules/d3-interpolate/src/color.js.map +1 -1
  87. package/dist/node_modules/d3-interpolate/src/date.js.map +1 -1
  88. package/dist/node_modules/d3-interpolate/src/number.js.map +1 -1
  89. package/dist/node_modules/d3-interpolate/src/numberArray.js.map +1 -1
  90. package/dist/node_modules/d3-interpolate/src/object.js.map +1 -1
  91. package/dist/node_modules/d3-interpolate/src/piecewise.js.map +1 -1
  92. package/dist/node_modules/d3-interpolate/src/rgb.js.map +1 -1
  93. package/dist/node_modules/d3-interpolate/src/round.js.map +1 -1
  94. package/dist/node_modules/d3-interpolate/src/string.js.map +1 -1
  95. package/dist/node_modules/d3-interpolate/src/value.js.map +1 -1
  96. package/dist/node_modules/d3-path/src/path.js.map +1 -1
  97. package/dist/node_modules/d3-scale/src/band.js.map +1 -1
  98. package/dist/node_modules/d3-scale/src/constant.js.map +1 -1
  99. package/dist/node_modules/d3-scale/src/continuous.js.map +1 -1
  100. package/dist/node_modules/d3-scale/src/diverging.js.map +1 -1
  101. package/dist/node_modules/d3-scale/src/identity.js.map +1 -1
  102. package/dist/node_modules/d3-scale/src/init.js.map +1 -1
  103. package/dist/node_modules/d3-scale/src/linear.js.map +1 -1
  104. package/dist/node_modules/d3-scale/src/log.js.map +1 -1
  105. package/dist/node_modules/d3-scale/src/nice.js.map +1 -1
  106. package/dist/node_modules/d3-scale/src/number.js.map +1 -1
  107. package/dist/node_modules/d3-scale/src/ordinal.js.map +1 -1
  108. package/dist/node_modules/d3-scale/src/pow.js.map +1 -1
  109. package/dist/node_modules/d3-scale/src/quantile.js.map +1 -1
  110. package/dist/node_modules/d3-scale/src/quantize.js.map +1 -1
  111. package/dist/node_modules/d3-scale/src/radial.js.map +1 -1
  112. package/dist/node_modules/d3-scale/src/sequential.js.map +1 -1
  113. package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +1 -1
  114. package/dist/node_modules/d3-scale/src/symlog.js.map +1 -1
  115. package/dist/node_modules/d3-scale/src/threshold.js.map +1 -1
  116. package/dist/node_modules/d3-scale/src/tickFormat.js.map +1 -1
  117. package/dist/node_modules/d3-scale/src/time.js.map +1 -1
  118. package/dist/node_modules/d3-scale/src/utcTime.js.map +1 -1
  119. package/dist/node_modules/d3-shape/src/area.js.map +1 -1
  120. package/dist/node_modules/d3-shape/src/array.js.map +1 -1
  121. package/dist/node_modules/d3-shape/src/constant.js.map +1 -1
  122. package/dist/node_modules/d3-shape/src/curve/basis.js.map +1 -1
  123. package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +1 -1
  124. package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +1 -1
  125. package/dist/node_modules/d3-shape/src/curve/bump.js.map +1 -1
  126. package/dist/node_modules/d3-shape/src/curve/linear.js.map +1 -1
  127. package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +1 -1
  128. package/dist/node_modules/d3-shape/src/curve/monotone.js.map +1 -1
  129. package/dist/node_modules/d3-shape/src/curve/natural.js.map +1 -1
  130. package/dist/node_modules/d3-shape/src/curve/step.js.map +1 -1
  131. package/dist/node_modules/d3-shape/src/line.js.map +1 -1
  132. package/dist/node_modules/d3-shape/src/noop.js.map +1 -1
  133. package/dist/node_modules/d3-shape/src/offset/expand.js.map +1 -1
  134. package/dist/node_modules/d3-shape/src/offset/none.js.map +1 -1
  135. package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +1 -1
  136. package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +1 -1
  137. package/dist/node_modules/d3-shape/src/order/none.js.map +1 -1
  138. package/dist/node_modules/d3-shape/src/path.js.map +1 -1
  139. package/dist/node_modules/d3-shape/src/point.js.map +1 -1
  140. package/dist/node_modules/d3-shape/src/stack.js.map +1 -1
  141. package/dist/node_modules/d3-shape/src/symbol/circle.js.map +1 -1
  142. package/dist/node_modules/d3-shape/src/symbol/cross.js.map +1 -1
  143. package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +1 -1
  144. package/dist/node_modules/d3-shape/src/symbol/square.js.map +1 -1
  145. package/dist/node_modules/d3-shape/src/symbol/star.js.map +1 -1
  146. package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +1 -1
  147. package/dist/node_modules/d3-shape/src/symbol/wye.js.map +1 -1
  148. package/dist/node_modules/d3-shape/src/symbol.js.map +1 -1
  149. package/dist/node_modules/d3-time/src/day.js.map +1 -1
  150. package/dist/node_modules/d3-time/src/hour.js.map +1 -1
  151. package/dist/node_modules/d3-time/src/interval.js.map +1 -1
  152. package/dist/node_modules/d3-time/src/millisecond.js.map +1 -1
  153. package/dist/node_modules/d3-time/src/minute.js.map +1 -1
  154. package/dist/node_modules/d3-time/src/month.js.map +1 -1
  155. package/dist/node_modules/d3-time/src/second.js.map +1 -1
  156. package/dist/node_modules/d3-time/src/ticks.js.map +1 -1
  157. package/dist/node_modules/d3-time/src/week.js.map +1 -1
  158. package/dist/node_modules/d3-time/src/year.js.map +1 -1
  159. package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +1 -1
  160. package/dist/node_modules/d3-time-format/src/locale.js.map +1 -1
  161. package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
  162. package/dist/node_modules/eventemitter3/index.js.map +1 -1
  163. package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
  164. package/dist/node_modules/internmap/src/index.js.map +1 -1
  165. package/dist/node_modules/lodash/_DataView.js.map +1 -1
  166. package/dist/node_modules/lodash/_Hash.js.map +1 -1
  167. package/dist/node_modules/lodash/_ListCache.js.map +1 -1
  168. package/dist/node_modules/lodash/_Map.js.map +1 -1
  169. package/dist/node_modules/lodash/_MapCache.js.map +1 -1
  170. package/dist/node_modules/lodash/_Promise.js.map +1 -1
  171. package/dist/node_modules/lodash/_Set.js.map +1 -1
  172. package/dist/node_modules/lodash/_SetCache.js.map +1 -1
  173. package/dist/node_modules/lodash/_Stack.js +2 -1
  174. package/dist/node_modules/lodash/_Stack.js.map +1 -1
  175. package/dist/node_modules/lodash/_Symbol.js.map +1 -1
  176. package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
  177. package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
  178. package/dist/node_modules/lodash/_apply.js.map +1 -1
  179. package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
  180. package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
  181. package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
  182. package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
  183. package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
  184. package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
  185. package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
  186. package/dist/node_modules/lodash/_arraySome.js.map +1 -1
  187. package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
  188. package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
  189. package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
  190. package/dist/node_modules/lodash/_baseEach.js.map +1 -1
  191. package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
  192. package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
  193. package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
  194. package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
  195. package/dist/node_modules/lodash/_baseFor.js.map +1 -1
  196. package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
  197. package/dist/node_modules/lodash/_baseGet.js.map +1 -1
  198. package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
  199. package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
  200. package/dist/node_modules/lodash/_baseGt.js.map +1 -1
  201. package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
  202. package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
  203. package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
  204. package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
  205. package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
  206. package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
  207. package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
  208. package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
  209. package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
  210. package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
  211. package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
  212. package/dist/node_modules/lodash/_baseLt.js.map +1 -1
  213. package/dist/node_modules/lodash/_baseMap.js.map +1 -1
  214. package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
  215. package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
  216. package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
  217. package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
  218. package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
  219. package/dist/node_modules/lodash/_baseRange.js.map +1 -1
  220. package/dist/node_modules/lodash/_baseRest.js.map +1 -1
  221. package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
  222. package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
  223. package/dist/node_modules/lodash/_baseSome.js.map +1 -1
  224. package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
  225. package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
  226. package/dist/node_modules/lodash/_baseToString.js.map +1 -1
  227. package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
  228. package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
  229. package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
  230. package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
  231. package/dist/node_modules/lodash/_castPath.js.map +1 -1
  232. package/dist/node_modules/lodash/_castSlice.js.map +1 -1
  233. package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
  234. package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
  235. package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
  236. package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
  237. package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
  238. package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
  239. package/dist/node_modules/lodash/_createFind.js.map +1 -1
  240. package/dist/node_modules/lodash/_createRange.js.map +1 -1
  241. package/dist/node_modules/lodash/_createSet.js.map +1 -1
  242. package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
  243. package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
  244. package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
  245. package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
  246. package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
  247. package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
  248. package/dist/node_modules/lodash/_getMapData.js.map +1 -1
  249. package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
  250. package/dist/node_modules/lodash/_getNative.js.map +1 -1
  251. package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
  252. package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
  253. package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
  254. package/dist/node_modules/lodash/_getTag.js.map +1 -1
  255. package/dist/node_modules/lodash/_getValue.js.map +1 -1
  256. package/dist/node_modules/lodash/_hasPath.js.map +1 -1
  257. package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
  258. package/dist/node_modules/lodash/_hashClear.js.map +1 -1
  259. package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
  260. package/dist/node_modules/lodash/_hashGet.js.map +1 -1
  261. package/dist/node_modules/lodash/_hashHas.js.map +1 -1
  262. package/dist/node_modules/lodash/_hashSet.js.map +1 -1
  263. package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
  264. package/dist/node_modules/lodash/_isIndex.js.map +1 -1
  265. package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
  266. package/dist/node_modules/lodash/_isKey.js.map +1 -1
  267. package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
  268. package/dist/node_modules/lodash/_isMasked.js.map +1 -1
  269. package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
  270. package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
  271. package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
  272. package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
  273. package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
  274. package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
  275. package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
  276. package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
  277. package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
  278. package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
  279. package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
  280. package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
  281. package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
  282. package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
  283. package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
  284. package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
  285. package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
  286. package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
  287. package/dist/node_modules/lodash/_objectToString.js.map +1 -1
  288. package/dist/node_modules/lodash/_overArg.js.map +1 -1
  289. package/dist/node_modules/lodash/_overRest.js.map +1 -1
  290. package/dist/node_modules/lodash/_root.js.map +1 -1
  291. package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
  292. package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
  293. package/dist/node_modules/lodash/_setToArray.js.map +1 -1
  294. package/dist/node_modules/lodash/_setToString.js.map +1 -1
  295. package/dist/node_modules/lodash/_shortOut.js.map +1 -1
  296. package/dist/node_modules/lodash/_stackClear.js.map +1 -1
  297. package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
  298. package/dist/node_modules/lodash/_stackGet.js.map +1 -1
  299. package/dist/node_modules/lodash/_stackHas.js.map +1 -1
  300. package/dist/node_modules/lodash/_stackSet.js.map +1 -1
  301. package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
  302. package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
  303. package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
  304. package/dist/node_modules/lodash/_toKey.js.map +1 -1
  305. package/dist/node_modules/lodash/_toSource.js.map +1 -1
  306. package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
  307. package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
  308. package/dist/node_modules/lodash/constant.js.map +1 -1
  309. package/dist/node_modules/lodash/debounce.js.map +1 -1
  310. package/dist/node_modules/lodash/eq.js.map +1 -1
  311. package/dist/node_modules/lodash/every.js.map +1 -1
  312. package/dist/node_modules/lodash/find.js.map +1 -1
  313. package/dist/node_modules/lodash/findIndex.js.map +1 -1
  314. package/dist/node_modules/lodash/flatMap.js.map +1 -1
  315. package/dist/node_modules/lodash/get.js.map +1 -1
  316. package/dist/node_modules/lodash/hasIn.js.map +1 -1
  317. package/dist/node_modules/lodash/identity.js.map +1 -1
  318. package/dist/node_modules/lodash/isArguments.js.map +1 -1
  319. package/dist/node_modules/lodash/isArray.js.map +1 -1
  320. package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
  321. package/dist/node_modules/lodash/isBoolean.js.map +1 -1
  322. package/dist/node_modules/lodash/isBuffer.js.map +1 -1
  323. package/dist/node_modules/lodash/isEqual.js.map +1 -1
  324. package/dist/node_modules/lodash/isFunction.js.map +1 -1
  325. package/dist/node_modules/lodash/isLength.js.map +1 -1
  326. package/dist/node_modules/lodash/isNaN.js.map +1 -1
  327. package/dist/node_modules/lodash/isNil.js.map +1 -1
  328. package/dist/node_modules/lodash/isNumber.js.map +1 -1
  329. package/dist/node_modules/lodash/isObject.js.map +1 -1
  330. package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
  331. package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
  332. package/dist/node_modules/lodash/isString.js.map +1 -1
  333. package/dist/node_modules/lodash/isSymbol.js.map +1 -1
  334. package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
  335. package/dist/node_modules/lodash/keys.js.map +1 -1
  336. package/dist/node_modules/lodash/last.js.map +1 -1
  337. package/dist/node_modules/lodash/map.js.map +1 -1
  338. package/dist/node_modules/lodash/mapValues.js.map +1 -1
  339. package/dist/node_modules/lodash/max.js.map +1 -1
  340. package/dist/node_modules/lodash/memoize.js.map +1 -1
  341. package/dist/node_modules/lodash/min.js.map +1 -1
  342. package/dist/node_modules/lodash/noop.js.map +1 -1
  343. package/dist/node_modules/lodash/now.js.map +1 -1
  344. package/dist/node_modules/lodash/property.js.map +1 -1
  345. package/dist/node_modules/lodash/range.js.map +1 -1
  346. package/dist/node_modules/lodash/some.js.map +1 -1
  347. package/dist/node_modules/lodash/sortBy.js.map +1 -1
  348. package/dist/node_modules/lodash/stubArray.js.map +1 -1
  349. package/dist/node_modules/lodash/stubFalse.js.map +1 -1
  350. package/dist/node_modules/lodash/throttle.js.map +1 -1
  351. package/dist/node_modules/lodash/toFinite.js.map +1 -1
  352. package/dist/node_modules/lodash/toInteger.js.map +1 -1
  353. package/dist/node_modules/lodash/toNumber.js.map +1 -1
  354. package/dist/node_modules/lodash/toString.js.map +1 -1
  355. package/dist/node_modules/lodash/uniqBy.js.map +1 -1
  356. package/dist/node_modules/lodash/upperFirst.js.map +1 -1
  357. package/dist/node_modules/object-assign/index.js.map +1 -1
  358. package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
  359. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
  360. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
  361. package/dist/node_modules/prop-types/index.js.map +1 -1
  362. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
  363. package/dist/node_modules/prop-types/lib/has.js.map +1 -1
  364. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  365. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  366. package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
  367. package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  368. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  369. package/dist/node_modules/react-is/index.js.map +1 -1
  370. package/dist/node_modules/react-smooth/es6/Animate.js +2 -2
  371. package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
  372. package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
  373. package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
  374. package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
  375. package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
  376. package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
  377. package/dist/node_modules/recharts/es6/cartesian/Bar.js +9 -9
  378. package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
  379. package/dist/node_modules/recharts/es6/cartesian/Brush.js +12 -12
  380. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
  381. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +7 -7
  382. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
  383. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +13 -13
  384. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +1 -1
  385. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +4 -4
  386. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
  387. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +3 -3
  388. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
  389. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +3 -3
  390. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
  391. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +4 -4
  392. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
  393. package/dist/node_modules/recharts/es6/cartesian/XAxis.js +3 -3
  394. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
  395. package/dist/node_modules/recharts/es6/cartesian/YAxis.js +3 -3
  396. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
  397. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
  398. package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
  399. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -1
  400. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
  401. package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
  402. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +22 -22
  403. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
  404. package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
  405. package/dist/node_modules/recharts/es6/component/Cursor.js +1 -1
  406. package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
  407. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +11 -11
  408. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
  409. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +6 -6
  410. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
  411. package/dist/node_modules/recharts/es6/component/Label.js +14 -14
  412. package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
  413. package/dist/node_modules/recharts/es6/component/LabelList.js +6 -6
  414. package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
  415. package/dist/node_modules/recharts/es6/component/Legend.js +5 -5
  416. package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
  417. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +3 -3
  418. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
  419. package/dist/node_modules/recharts/es6/component/Text.js +2 -2
  420. package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
  421. package/dist/node_modules/recharts/es6/component/Tooltip.js +3 -3
  422. package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
  423. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +2 -2
  424. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
  425. package/dist/node_modules/recharts/es6/container/Layer.js +2 -2
  426. package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
  427. package/dist/node_modules/recharts/es6/container/Surface.js +2 -2
  428. package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
  429. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +2 -2
  430. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
  431. package/dist/node_modules/recharts/es6/shape/Cross.js +1 -1
  432. package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
  433. package/dist/node_modules/recharts/es6/shape/Curve.js +1 -1
  434. package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
  435. package/dist/node_modules/recharts/es6/shape/Dot.js +1 -1
  436. package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
  437. package/dist/node_modules/recharts/es6/shape/Rectangle.js +4 -4
  438. package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
  439. package/dist/node_modules/recharts/es6/shape/Sector.js +1 -1
  440. package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
  441. package/dist/node_modules/recharts/es6/shape/Symbols.js +1 -1
  442. package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
  443. package/dist/node_modules/recharts/es6/shape/Trapezoid.js +4 -4
  444. package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
  445. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +9 -9
  446. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
  447. package/dist/node_modules/recharts/es6/util/BarUtils.js +1 -1
  448. package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
  449. package/dist/node_modules/recharts/es6/util/CartesianUtils.js +1 -1
  450. package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
  451. package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
  452. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
  453. package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
  454. package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
  455. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
  456. package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
  457. package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
  458. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
  459. package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
  460. package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
  461. package/dist/node_modules/recharts/es6/util/ReactUtils.js +1 -1
  462. package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
  463. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +1 -1
  464. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
  465. package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
  466. package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
  467. package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
  468. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
  469. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
  470. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
  471. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
  472. package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
  473. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
  474. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
  475. package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
  476. package/dist/node_modules/recharts/es6/util/types.js +1 -1
  477. package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
  478. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
  479. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
  480. package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
  481. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
  482. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  483. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
  484. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SpeciesDetailPage.js","names":[],"sources":["../../../../src/ecoimpacthub/pages/species/SpeciesDetailPage.tsx"],"sourcesContent":["/**\n * Species detail — overview, field observations & species actions.\n * @module ecoimpacthub/pages/species\n *\n * Reads `ecoSpecies` (+ nested observations); writes `ecoRecordObservation`,\n * `ecoUpdateSpecies`, `ecoArchiveSpecies`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Binoculars, Pencil, Archive, Star } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { EvidenceUpload } from '../../components/EvidenceUpload';\nimport { EcoTags } from '../../components/EcoTags';\nimport { ConservationBadge } from '../_shared/ConservationBadge';\nimport { TaxonChip } from '../_shared/TaxonChip';\nimport { MethodBadge } from '../_shared/MethodBadge';\nimport { EvidenceThumb } from '../_shared/EvidenceThumb';\nimport { useEcoImpactHub } from '../../context';\nimport {\n useEcoSpeciesDetail,\n useEcoSites,\n useEcoRecordObservation,\n useEcoUpdateSpecies,\n useEcoArchiveSpecies,\n type UploadedEcoFile,\n} from '../../hooks';\nimport { formatDateTime, formatEnumLabel, formatNumber } from '../../utils/formatters';\nimport type {\n EcoObservation,\n EcoObservationMethod,\n EcoTaxonGroup,\n EcoConservationStatus,\n} from '../../types';\n\nconst OBSERVATION_METHODS: EcoObservationMethod[] = [\n 'DIRECT_SIGHTING',\n 'CAMERA_TRAP',\n 'ACOUSTIC',\n 'TRACKS_SIGNS',\n 'EDNA',\n 'TELEMETRY',\n 'COMMUNITY_REPORT',\n];\n\nconst TAXON_GROUPS: EcoTaxonGroup[] = [\n 'MAMMAL',\n 'BIRD',\n 'REPTILE',\n 'AMPHIBIAN',\n 'FISH',\n 'INSECT',\n 'PLANT',\n 'FUNGI',\n 'OTHER',\n];\n\nconst CONSERVATION_STATUSES: EcoConservationStatus[] = [\n 'LEAST_CONCERN',\n 'NEAR_THREATENED',\n 'VULNERABLE',\n 'ENDANGERED',\n 'CRITICALLY_ENDANGERED',\n 'EXTINCT_IN_WILD',\n 'DATA_DEFICIENT',\n 'NOT_EVALUATED',\n];\n\n/** Format a Date into the `YYYY-MM-DDTHH:mm` value a datetime-local input expects. */\nconst toLocalInputValue = (d: Date): string => {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(\n d.getHours()\n )}:${pad(d.getMinutes())}`;\n};\n\ninterface EditFormState {\n commonName: string;\n scientificName: string;\n taxonGroup: EcoTaxonGroup;\n conservationStatus: EcoConservationStatus;\n isPriority: boolean;\n description: string;\n}\n\nexport function SpeciesDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useEcoImpactHub();\n const { data: species, isLoading, isError, refetch } = useEcoSpeciesDetail(id);\n const sites = useEcoSites({ pagination: { limit: 100, offset: 0 } });\n\n const recordObservation = useEcoRecordObservation();\n const updateSpecies = useEcoUpdateSpecies();\n const archiveSpecies = useEcoArchiveSpecies();\n\n const [observeOpen, setObserveOpen] = useState(false);\n const [observeForm, setObserveForm] = useState<{\n method: EcoObservationMethod;\n count: string;\n observedAt: string;\n siteId: string;\n notes: string;\n evidence: UploadedEcoFile | null;\n }>({\n method: 'DIRECT_SIGHTING',\n count: '1',\n observedAt: toLocalInputValue(new Date()),\n siteId: '',\n notes: '',\n evidence: null,\n });\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState>({\n commonName: '',\n scientificName: '',\n taxonGroup: 'MAMMAL',\n conservationStatus: 'NOT_EVALUATED',\n isPriority: false,\n description: '',\n });\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Species\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !species) {\n return (\n <PageLayout title=\"Species\">\n <ErrorView message=\"This species could not be loaded.\" onRetry={() => refetch()} />\n </PageLayout>\n );\n }\n\n const observations = species.observations ?? [];\n const siteRows = sites.data?.items ?? [];\n const siteNameById = new Map<string, string>();\n for (const s of siteRows) siteNameById.set(s.id, s.name);\n\n const openObserve = () => {\n setObserveForm({\n method: 'DIRECT_SIGHTING',\n count: '1',\n observedAt: toLocalInputValue(new Date()),\n siteId: '',\n notes: '',\n evidence: null,\n });\n setError(null);\n setObserveOpen(true);\n };\n\n const openEdit = () => {\n setEditForm({\n commonName: species.commonName,\n scientificName: species.scientificName ?? '',\n taxonGroup: species.taxonGroup,\n conservationStatus: species.conservationStatus,\n isPriority: species.isPriority,\n description: species.description ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const handleRecordObservation = async () => {\n if (!id) return;\n setError(null);\n try {\n await recordObservation.mutateAsync({\n speciesId: id,\n method: observeForm.method,\n count: observeForm.count ? Number(observeForm.count) : 1,\n observedAt: new Date(observeForm.observedAt).toISOString(),\n siteId: observeForm.siteId || null,\n notes: observeForm.notes.trim() || null,\n evidenceFileId: observeForm.evidence?.fileId ?? null,\n });\n setObserveOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record observation.');\n }\n };\n\n const handleUpdate = async () => {\n if (!id || !editForm.commonName.trim()) {\n setError('Common name is required.');\n return;\n }\n setError(null);\n try {\n await updateSpecies.mutateAsync({\n id,\n input: {\n commonName: editForm.commonName.trim(),\n scientificName: editForm.scientificName.trim() || null,\n taxonGroup: editForm.taxonGroup,\n conservationStatus: editForm.conservationStatus,\n isPriority: editForm.isPriority,\n description: editForm.description.trim() || null,\n },\n });\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update species.');\n }\n };\n\n const handleArchive = async () => {\n if (!id) return;\n setError(null);\n try {\n await archiveSpecies.mutateAsync(id);\n navigateTo('species');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to archive species.');\n }\n };\n\n const observationColumns: Column<EcoObservation>[] = [\n {\n key: 'evidence',\n header: 'Evidence',\n render: (o) => <EvidenceThumb fileId={o.evidence?.id} alt={species.commonName} />,\n },\n {\n key: 'method',\n header: 'Method',\n render: (o) => <MethodBadge method={o.method} />,\n },\n {\n key: 'count',\n header: 'Count',\n align: 'right',\n sortValue: (o) => o.count,\n render: (o) => (\n <span className=\"tabular-nums font-medium text-text-primary\">×{formatNumber(o.count)}</span>\n ),\n },\n {\n key: 'observedAt',\n header: 'Observed',\n hideOnMobile: true,\n render: (o) => (\n <span className=\"whitespace-nowrap text-text-secondary\">\n {formatDateTime(o.observedAt)}\n </span>\n ),\n },\n {\n key: 'site',\n header: 'Site',\n hideOnMobile: true,\n render: (o) => {\n const name = o.siteId ? siteNameById.get(o.siteId) : undefined;\n return name ? (\n <span className=\"text-text-secondary\">{name}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n );\n },\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (o) =>\n o.notes ? (\n <span className=\"block max-w-xs truncate text-text-secondary\" title={o.notes}>\n {o.notes}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n ];\n\n return (\n <PageLayout\n title={species.commonName}\n description={[species.scientificName, formatEnumLabel(species.taxonGroup)]\n .filter(Boolean)\n .join(' · ')}\n actions={\n <>\n <ConservationBadge status={species.conservationStatus} />\n {species.isPriority && (\n <span\n className=\"inline-flex items-center gap-1 rounded-full bg-status-warning-bg-subtle px-2.5 py-0.5 text-xs font-semibold text-status-warning-text\"\n title=\"Priority species\"\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" /> Priority\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('species')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Overview */}\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Scientific name</dt>\n <dd className=\"mt-0.5 text-sm italic text-text-primary\">\n {species.scientificName ?? '—'}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Taxon group</dt>\n <dd className=\"mt-1\">\n <TaxonChip group={species.taxonGroup} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Conservation</dt>\n <dd className=\"mt-1\">\n <ConservationBadge status={species.conservationStatus} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Priority</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">\n {species.isPriority ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning-text\">\n <Star className=\"h-4 w-4 fill-current\" /> Priority\n </span>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Observations</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary tabular-nums\">\n {observations.length}\n </dd>\n </div>\n </dl>\n {species.description && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {species.description}\n </p>\n )}\n <div className=\"mt-5 border-t border-border-seam pt-4\">\n <EcoTags entityType=\"ecoimpacthub-species\" entityId={species.id} />\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-3 p-6\">\n <p className=\"text-xs text-text-tertiary\">Quick actions</p>\n <Button onClick={openObserve}>\n <Binoculars className=\"mr-1.5 h-4 w-4\" /> Record observation\n </Button>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit species\n </Button>\n <Button\n variant=\"ghost\"\n onClick={handleArchive}\n disabled={archiveSpecies.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Archive\n </Button>\n </GlassCard>\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n {/* Observations */}\n <Section\n title=\"Observations\"\n description=\"Field records logged against this species.\"\n action={\n <Button size=\"sm\" onClick={openObserve}>\n <Binoculars className=\"mr-1.5 h-4 w-4\" /> Record observation\n </Button>\n }\n >\n {observations.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No observations yet\"\n description=\"Record a field observation to see it here.\"\n />\n ) : (\n <DataTable columns={observationColumns} rows={observations} rowKey={(o) => o.id} />\n )}\n </Section>\n\n {/* Record observation dialog */}\n <ResponsiveDialog open={observeOpen} onOpenChange={setObserveOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record observation</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a field sighting or detection of {species.commonName}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsMethod\">Method</Label>\n <Select\n value={observeForm.method}\n onValueChange={(v) =>\n setObserveForm({ ...observeForm, method: v as EcoObservationMethod })\n }\n >\n <SelectTrigger id=\"obsMethod\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {OBSERVATION_METHODS.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsCount\">Count</Label>\n <Input\n id=\"obsCount\"\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={observeForm.count}\n onChange={(e) => setObserveForm({ ...observeForm, count: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsAt\">Observed at</Label>\n <Input\n id=\"obsAt\"\n type=\"datetime-local\"\n value={observeForm.observedAt}\n onChange={(e) => setObserveForm({ ...observeForm, observedAt: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsSite\">Site (optional)</Label>\n <Select\n value={observeForm.siteId}\n onValueChange={(v) => setObserveForm({ ...observeForm, siteId: v })}\n >\n <SelectTrigger id=\"obsSite\">\n <SelectValue placeholder=\"No site\" />\n </SelectTrigger>\n <SelectContent>\n {siteRows.map((s) => (\n <SelectItem key={s.id} value={s.id}>\n {s.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsNotes\">Notes</Label>\n <Textarea\n id=\"obsNotes\"\n value={observeForm.notes}\n onChange={(e) => setObserveForm({ ...observeForm, notes: e.target.value })}\n placeholder=\"Optional context — behaviour, conditions, evidence.\"\n rows={2}\n />\n </div>\n <EvidenceUpload\n id=\"speciesObsEvidence\"\n label=\"Evidence photo (optional)\"\n value={observeForm.evidence}\n onChange={(evidence) => setObserveForm({ ...observeForm, evidence })}\n hint=\"Attach a photo, audio clip or PDF as supporting evidence.\"\n />\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setObserveOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleRecordObservation} disabled={recordObservation.isPending}>\n {recordObservation.isPending ? 'Recording…' : 'Record'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit species dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit species</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update naming, classification and priority for this species.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCommon\">Common name *</Label>\n <Input\n id=\"editCommon\"\n value={editForm.commonName}\n onChange={(e) => setEditForm({ ...editForm, commonName: e.target.value })}\n placeholder=\"Indian Pangolin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editScientific\">Scientific name</Label>\n <Input\n id=\"editScientific\"\n value={editForm.scientificName}\n onChange={(e) => setEditForm({ ...editForm, scientificName: e.target.value })}\n placeholder=\"Manis crassicaudata\"\n />\n </div>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editTaxon\">Taxon group</Label>\n <Select\n value={editForm.taxonGroup}\n onValueChange={(v) =>\n setEditForm({ ...editForm, taxonGroup: v as EcoTaxonGroup })\n }\n >\n <SelectTrigger id=\"editTaxon\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editConservation\">Conservation status</Label>\n <Select\n value={editForm.conservationStatus}\n onValueChange={(v) =>\n setEditForm({ ...editForm, conservationStatus: v as EcoConservationStatus })\n }\n >\n <SelectTrigger id=\"editConservation\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={editForm.isPriority}\n onChange={(e) => setEditForm({ ...editForm, isPriority: e.target.checked })}\n className=\"h-4 w-4 rounded border-border-seam accent-action-primary-bg\"\n />\n Mark as priority species\n </label>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editDescription\">Description</Label>\n <Textarea\n id=\"editDescription\"\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n placeholder=\"Optional notes on habitat, range or identification.\"\n rows={2}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleUpdate} disabled={updateSpecies.isPending}>\n {updateSpecies.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SpeciesDetailPage.js","names":[],"sources":["../../../../src/ecoimpacthub/pages/species/SpeciesDetailPage.tsx"],"sourcesContent":["/**\n * Species detail — overview, field observations & species actions.\n * @module ecoimpacthub/pages/species\n *\n * Reads `ecoSpecies` (+ nested observations); writes `ecoRecordObservation`,\n * `ecoUpdateSpecies`, `ecoArchiveSpecies`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Binoculars, Pencil, Archive, Star } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { EvidenceUpload } from '../../components/EvidenceUpload';\nimport { EcoTags } from '../../components/EcoTags';\nimport { ConservationBadge } from '../_shared/ConservationBadge';\nimport { TaxonChip } from '../_shared/TaxonChip';\nimport { MethodBadge } from '../_shared/MethodBadge';\nimport { EvidenceThumb } from '../_shared/EvidenceThumb';\nimport { useEcoImpactHub } from '../../context';\nimport {\n useEcoSpeciesDetail,\n useEcoSites,\n useEcoRecordObservation,\n useEcoUpdateSpecies,\n useEcoArchiveSpecies,\n type UploadedEcoFile,\n} from '../../hooks';\nimport { formatDateTime, formatEnumLabel, formatNumber } from '../../utils/formatters';\nimport type {\n EcoObservation,\n EcoObservationMethod,\n EcoTaxonGroup,\n EcoConservationStatus,\n} from '../../types';\n\nconst OBSERVATION_METHODS: EcoObservationMethod[] = [\n 'DIRECT_SIGHTING',\n 'CAMERA_TRAP',\n 'ACOUSTIC',\n 'TRACKS_SIGNS',\n 'EDNA',\n 'TELEMETRY',\n 'COMMUNITY_REPORT',\n];\n\nconst TAXON_GROUPS: EcoTaxonGroup[] = [\n 'MAMMAL',\n 'BIRD',\n 'REPTILE',\n 'AMPHIBIAN',\n 'FISH',\n 'INSECT',\n 'PLANT',\n 'FUNGI',\n 'OTHER',\n];\n\nconst CONSERVATION_STATUSES: EcoConservationStatus[] = [\n 'LEAST_CONCERN',\n 'NEAR_THREATENED',\n 'VULNERABLE',\n 'ENDANGERED',\n 'CRITICALLY_ENDANGERED',\n 'EXTINCT_IN_WILD',\n 'DATA_DEFICIENT',\n 'NOT_EVALUATED',\n];\n\n/** Format a Date into the `YYYY-MM-DDTHH:mm` value a datetime-local input expects. */\nconst toLocalInputValue = (d: Date): string => {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(\n d.getHours()\n )}:${pad(d.getMinutes())}`;\n};\n\ninterface EditFormState {\n commonName: string;\n scientificName: string;\n taxonGroup: EcoTaxonGroup;\n conservationStatus: EcoConservationStatus;\n isPriority: boolean;\n description: string;\n}\n\nexport function SpeciesDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useEcoImpactHub();\n const { data: species, isLoading, isError, refetch } = useEcoSpeciesDetail(id);\n const sites = useEcoSites({ pagination: { limit: 100, offset: 0 } });\n\n const recordObservation = useEcoRecordObservation();\n const updateSpecies = useEcoUpdateSpecies();\n const archiveSpecies = useEcoArchiveSpecies();\n\n const [observeOpen, setObserveOpen] = useState(false);\n const [observeForm, setObserveForm] = useState<{\n method: EcoObservationMethod;\n count: string;\n observedAt: string;\n siteId: string;\n notes: string;\n evidence: UploadedEcoFile | null;\n }>({\n method: 'DIRECT_SIGHTING',\n count: '1',\n observedAt: toLocalInputValue(new Date()),\n siteId: '',\n notes: '',\n evidence: null,\n });\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState>({\n commonName: '',\n scientificName: '',\n taxonGroup: 'MAMMAL',\n conservationStatus: 'NOT_EVALUATED',\n isPriority: false,\n description: '',\n });\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Species\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !species) {\n return (\n <PageLayout title=\"Species\">\n <ErrorView message=\"This species could not be loaded.\" onRetry={() => refetch()} />\n </PageLayout>\n );\n }\n\n const observations = species.observations ?? [];\n const siteRows = sites.data?.items ?? [];\n const siteNameById = new Map<string, string>();\n for (const s of siteRows) siteNameById.set(s.id, s.name);\n\n const openObserve = () => {\n setObserveForm({\n method: 'DIRECT_SIGHTING',\n count: '1',\n observedAt: toLocalInputValue(new Date()),\n siteId: '',\n notes: '',\n evidence: null,\n });\n setError(null);\n setObserveOpen(true);\n };\n\n const openEdit = () => {\n setEditForm({\n commonName: species.commonName,\n scientificName: species.scientificName ?? '',\n taxonGroup: species.taxonGroup,\n conservationStatus: species.conservationStatus,\n isPriority: species.isPriority,\n description: species.description ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const handleRecordObservation = async () => {\n if (!id) return;\n setError(null);\n try {\n await recordObservation.mutateAsync({\n speciesId: id,\n method: observeForm.method,\n count: observeForm.count ? Number(observeForm.count) : 1,\n observedAt: new Date(observeForm.observedAt).toISOString(),\n siteId: observeForm.siteId || null,\n notes: observeForm.notes.trim() || null,\n evidenceFileId: observeForm.evidence?.fileId ?? null,\n });\n setObserveOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record observation.');\n }\n };\n\n const handleUpdate = async () => {\n if (!id || !editForm.commonName.trim()) {\n setError('Common name is required.');\n return;\n }\n setError(null);\n try {\n await updateSpecies.mutateAsync({\n id,\n input: {\n commonName: editForm.commonName.trim(),\n scientificName: editForm.scientificName.trim() || null,\n taxonGroup: editForm.taxonGroup,\n conservationStatus: editForm.conservationStatus,\n isPriority: editForm.isPriority,\n description: editForm.description.trim() || null,\n },\n });\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update species.');\n }\n };\n\n const handleArchive = async () => {\n if (!id) return;\n setError(null);\n try {\n await archiveSpecies.mutateAsync(id);\n navigateTo('species');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to archive species.');\n }\n };\n\n const observationColumns: Column<EcoObservation>[] = [\n {\n key: 'evidence',\n header: 'Evidence',\n render: (o) => <EvidenceThumb fileId={o.evidence?.id} alt={species.commonName} />,\n },\n {\n key: 'method',\n header: 'Method',\n render: (o) => <MethodBadge method={o.method} />,\n },\n {\n key: 'count',\n header: 'Count',\n align: 'right',\n sortValue: (o) => o.count,\n render: (o) => (\n <span className=\"tabular-nums font-medium text-text-primary\">×{formatNumber(o.count)}</span>\n ),\n },\n {\n key: 'observedAt',\n header: 'Observed',\n hideOnMobile: true,\n render: (o) => (\n <span className=\"whitespace-nowrap text-text-secondary\">\n {formatDateTime(o.observedAt)}\n </span>\n ),\n },\n {\n key: 'site',\n header: 'Site',\n hideOnMobile: true,\n render: (o) => {\n const name = o.siteId ? siteNameById.get(o.siteId) : undefined;\n return name ? (\n <span className=\"text-text-secondary\">{name}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n );\n },\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (o) =>\n o.notes ? (\n <span className=\"block max-w-xs truncate text-text-secondary\" title={o.notes}>\n {o.notes}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n ];\n\n return (\n <PageLayout\n title={species.commonName}\n description={[species.scientificName, formatEnumLabel(species.taxonGroup)]\n .filter(Boolean)\n .join(' · ')}\n actions={\n <>\n <ConservationBadge status={species.conservationStatus} />\n {species.isPriority && (\n <span\n className=\"inline-flex items-center gap-1 rounded-full bg-status-warning-bg-subtle px-2.5 py-0.5 text-xs font-semibold text-status-warning-text\"\n title=\"Priority species\"\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" /> Priority\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('species')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Overview */}\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Scientific name</dt>\n <dd className=\"mt-0.5 text-sm italic text-text-primary\">\n {species.scientificName ?? '—'}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Taxon group</dt>\n <dd className=\"mt-1\">\n <TaxonChip group={species.taxonGroup} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Conservation</dt>\n <dd className=\"mt-1\">\n <ConservationBadge status={species.conservationStatus} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Priority</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">\n {species.isPriority ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning-text\">\n <Star className=\"h-4 w-4 fill-current\" /> Priority\n </span>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Observations</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary tabular-nums\">\n {observations.length}\n </dd>\n </div>\n </dl>\n {species.description && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {species.description}\n </p>\n )}\n <div className=\"mt-5 border-t border-border-seam pt-4\">\n <EcoTags entityType=\"ecoimpacthub-species\" entityId={species.id} />\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-3 p-6\">\n <p className=\"text-xs text-text-tertiary\">Quick actions</p>\n <Button onClick={openObserve}>\n <Binoculars className=\"mr-1.5 h-4 w-4\" /> Record observation\n </Button>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit species\n </Button>\n <Button\n variant=\"ghost\"\n onClick={handleArchive}\n disabled={archiveSpecies.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Archive\n </Button>\n </GlassCard>\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n {/* Observations */}\n <Section\n title=\"Observations\"\n description=\"Field records logged against this species.\"\n action={\n <Button size=\"sm\" onClick={openObserve}>\n <Binoculars className=\"mr-1.5 h-4 w-4\" /> Record observation\n </Button>\n }\n >\n {observations.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No observations yet\"\n description=\"Record a field observation to see it here.\"\n />\n ) : (\n <DataTable columns={observationColumns} rows={observations} rowKey={(o) => o.id} />\n )}\n </Section>\n\n {/* Record observation dialog */}\n <ResponsiveDialog open={observeOpen} onOpenChange={setObserveOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record observation</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a field sighting or detection of {species.commonName}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsMethod\">Method</Label>\n <Select\n value={observeForm.method}\n onValueChange={(v) =>\n setObserveForm({ ...observeForm, method: v as EcoObservationMethod })\n }\n >\n <SelectTrigger id=\"obsMethod\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {OBSERVATION_METHODS.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsCount\">Count</Label>\n <Input\n id=\"obsCount\"\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={observeForm.count}\n onChange={(e) => setObserveForm({ ...observeForm, count: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsAt\">Observed at</Label>\n <Input\n id=\"obsAt\"\n type=\"datetime-local\"\n value={observeForm.observedAt}\n onChange={(e) => setObserveForm({ ...observeForm, observedAt: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsSite\">Site (optional)</Label>\n <Select\n value={observeForm.siteId}\n onValueChange={(v) => setObserveForm({ ...observeForm, siteId: v })}\n >\n <SelectTrigger id=\"obsSite\">\n <SelectValue placeholder=\"No site\" />\n </SelectTrigger>\n <SelectContent>\n {siteRows.map((s) => (\n <SelectItem key={s.id} value={s.id}>\n {s.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"obsNotes\">Notes</Label>\n <Textarea\n id=\"obsNotes\"\n value={observeForm.notes}\n onChange={(e) => setObserveForm({ ...observeForm, notes: e.target.value })}\n placeholder=\"Optional context — behaviour, conditions, evidence.\"\n rows={2}\n />\n </div>\n <EvidenceUpload\n id=\"speciesObsEvidence\"\n label=\"Evidence photo (optional)\"\n value={observeForm.evidence}\n onChange={(evidence) => setObserveForm({ ...observeForm, evidence })}\n hint=\"Attach a photo, audio clip or PDF as supporting evidence.\"\n />\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setObserveOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleRecordObservation} disabled={recordObservation.isPending}>\n {recordObservation.isPending ? 'Recording…' : 'Record'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit species dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit species</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update naming, classification and priority for this species.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCommon\">Common name *</Label>\n <Input\n id=\"editCommon\"\n value={editForm.commonName}\n onChange={(e) => setEditForm({ ...editForm, commonName: e.target.value })}\n placeholder=\"Indian Pangolin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editScientific\">Scientific name</Label>\n <Input\n id=\"editScientific\"\n value={editForm.scientificName}\n onChange={(e) => setEditForm({ ...editForm, scientificName: e.target.value })}\n placeholder=\"Manis crassicaudata\"\n />\n </div>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editTaxon\">Taxon group</Label>\n <Select\n value={editForm.taxonGroup}\n onValueChange={(v) =>\n setEditForm({ ...editForm, taxonGroup: v as EcoTaxonGroup })\n }\n >\n <SelectTrigger id=\"editTaxon\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editConservation\">Conservation status</Label>\n <Select\n value={editForm.conservationStatus}\n onValueChange={(v) =>\n setEditForm({ ...editForm, conservationStatus: v as EcoConservationStatus })\n }\n >\n <SelectTrigger id=\"editConservation\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={editForm.isPriority}\n onChange={(e) => setEditForm({ ...editForm, isPriority: e.target.checked })}\n className=\"h-4 w-4 rounded border-border-seam accent-action-primary-bg\"\n />\n Mark as priority species\n </label>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editDescription\">Description</Label>\n <Textarea\n id=\"editDescription\"\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n placeholder=\"Optional notes on habitat, range or identification.\"\n rows={2}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleUpdate} disabled={updateSpecies.isPending}>\n {updateSpecies.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpeciesPage.js","names":[],"sources":["../../../../src/ecoimpacthub/pages/species/SpeciesPage.tsx"],"sourcesContent":["/**\n * Species — list, filter, and register tracked taxa.\n * @module ecoimpacthub/pages/species\n *\n * Reads `ecoListSpecies`; writes `ecoCreateSpecies`.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Rabbit, Search, Star } from 'lucide-react';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Pagination } from '../../components/Pagination';\nimport { ConservationBadge } from '../_shared/ConservationBadge';\nimport { TaxonChip } from '../_shared/TaxonChip';\nimport { useEcoImpactHub } from '../../context';\nimport { useEcoSpecies, useEcoCreateSpecies, useCursorPager } from '../../hooks';\nimport { formatEnumLabel, formatRelativeTime } from '../../utils/formatters';\nimport type { EcoSpecies, EcoTaxonGroup, EcoConservationStatus } from '../../types';\n\nconst TAXON_GROUPS: EcoTaxonGroup[] = [\n 'MAMMAL',\n 'BIRD',\n 'REPTILE',\n 'AMPHIBIAN',\n 'FISH',\n 'INSECT',\n 'PLANT',\n 'FUNGI',\n 'OTHER',\n];\n\nconst CONSERVATION_STATUSES: EcoConservationStatus[] = [\n 'LEAST_CONCERN',\n 'NEAR_THREATENED',\n 'VULNERABLE',\n 'ENDANGERED',\n 'CRITICALLY_ENDANGERED',\n 'EXTINCT_IN_WILD',\n 'DATA_DEFICIENT',\n 'NOT_EVALUATED',\n];\n\nconst PRIORITY_FILTERS: FilterOption<'ALL' | 'PRIORITY'>[] = [\n { value: 'ALL', label: 'All species' },\n { value: 'PRIORITY', label: 'Priority only' },\n];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n commonName: string;\n scientificName: string;\n taxonGroup: EcoTaxonGroup;\n conservationStatus: EcoConservationStatus;\n isPriority: boolean;\n description: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n commonName: '',\n scientificName: '',\n taxonGroup: 'MAMMAL',\n conservationStatus: 'NOT_EVALUATED',\n isPriority: false,\n description: '',\n};\n\nexport function SpeciesPage() {\n const { navigateTo } = useEcoImpactHub();\n const [taxonGroup, setTaxonGroup] = useState<EcoTaxonGroup | 'ALL'>('ALL');\n const [conservationStatus, setConservationStatus] = useState<EcoConservationStatus | 'ALL'>(\n 'ALL'\n );\n const [priority, setPriority] = useState<'ALL' | 'PRIORITY'>('ALL');\n const [search, setSearch] = useState('');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useEcoSpecies({\n taxonGroup: taxonGroup === 'ALL' ? undefined : taxonGroup,\n conservationStatus: conservationStatus === 'ALL' ? undefined : conservationStatus,\n priorityOnly: priority === 'PRIORITY' ? true : undefined,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createSpecies = useEcoCreateSpecies();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n\n const query = search.trim().toLowerCase();\n const visibleRows = useMemo(() => {\n if (!query) return rows;\n return rows.filter(\n (s) =>\n s.commonName.toLowerCase().includes(query) ||\n (s.scientificName?.toLowerCase().includes(query) ?? false)\n );\n }, [rows, query]);\n\n const columns: Column<EcoSpecies>[] = [\n {\n key: 'name',\n header: 'Species',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-semibold text-text-primary\">{s.commonName}</p>\n {s.scientificName && (\n <p className=\"truncate text-xs italic text-text-tertiary\">{s.scientificName}</p>\n )}\n </div>\n ),\n },\n {\n key: 'taxonGroup',\n header: 'Taxon',\n hideOnMobile: true,\n render: (s) => <TaxonChip group={s.taxonGroup} />,\n },\n {\n key: 'conservationStatus',\n header: 'Conservation status',\n render: (s) => <ConservationBadge status={s.conservationStatus} />,\n },\n {\n key: 'priority',\n header: 'Priority',\n align: 'center',\n render: (s) =>\n s.isPriority ? (\n <span\n className=\"inline-flex items-center justify-center gap-1 rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-status-warning-text\"\n title=\"Priority species\"\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" />\n </span>\n ) : (\n <span className=\"text-text-tertiary\" title=\"Not prioritised\">\n —\n </span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (s) => (\n <span className=\"whitespace-nowrap text-text-tertiary\">\n {formatRelativeTime(s.updatedAt)}\n </span>\n ),\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.commonName.trim()) {\n setFormError('Common name is required.');\n return;\n }\n try {\n const created = await createSpecies.mutateAsync({\n commonName: form.commonName.trim(),\n scientificName: form.scientificName.trim() || null,\n taxonGroup: form.taxonGroup,\n conservationStatus: form.conservationStatus,\n isPriority: form.isPriority,\n description: form.description.trim() || null,\n });\n setDialogOpen(false);\n resetForm();\n navigateTo(`species/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create species.');\n }\n };\n\n return (\n <PageLayout\n title=\"Species\"\n description=\"Tracked taxa — conservation status, priority focus & field observations.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New species\n </Button>\n }\n >\n <GlassCard treatment=\"plain\" className=\"mb-5 p-4\">\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Taxon group\n </span>\n <Select\n value={taxonGroup}\n onValueChange={(v) => {\n setTaxonGroup(v as EcoTaxonGroup | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-44\">\n <SelectValue placeholder=\"All groups\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All groups</SelectItem>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Conservation status\n </span>\n <Select\n value={conservationStatus}\n onValueChange={(v) => {\n setConservationStatus(v as EcoConservationStatus | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-52\">\n <SelectValue placeholder=\"All conservation\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All conservation</SelectItem>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Search this page\n </span>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Common or scientific name…\"\n className=\"w-full pl-9 sm:w-64\"\n aria-label=\"Search loaded species by name\"\n />\n </div>\n </div>\n </div>\n <FilterTabs\n options={PRIORITY_FILTERS}\n value={priority}\n onChange={(v) => {\n setPriority(v);\n pager.reset();\n }}\n />\n </div>\n </GlassCard>\n\n {isLoading ? (\n <LoadingView label=\"Loading species…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load species.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Rabbit className=\"h-10 w-10\" />}\n title=\"No species yet\"\n description={\n taxonGroup === 'ALL' && conservationStatus === 'ALL' && priority === 'ALL'\n ? 'Register your first species to start logging field observations.'\n : 'No species match these filters.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New species\n </Button>\n }\n />\n ) : visibleRows.length === 0 ? (\n <EmptyState\n icon={<Search className=\"h-10 w-10\" />}\n title=\"No matches on this page\"\n description={`No species on this page match “${search.trim()}”. Clear the search or page through the catalog.`}\n action={\n <Button variant=\"outline\" onClick={() => setSearch('')}>\n Clear search\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={visibleRows}\n rowKey={(s) => s.id}\n onRowClick={(s) => navigateTo(`species/${s.id}`)}\n />\n {query ? (\n <p className=\"mt-4 text-sm text-text-secondary tabular-nums\">\n {visibleRows.length} of {rows.length} on this page match “{search.trim()}”\n </p>\n ) : (\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n )}\n </>\n )}\n\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New species</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a taxon to track its conservation status and field observations.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"commonName\">Common name *</Label>\n <Input\n id=\"commonName\"\n value={form.commonName}\n onChange={(e) => setForm({ ...form, commonName: e.target.value })}\n placeholder=\"Indian Pangolin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"scientificName\">Scientific name</Label>\n <Input\n id=\"scientificName\"\n value={form.scientificName}\n onChange={(e) => setForm({ ...form, scientificName: e.target.value })}\n placeholder=\"Manis crassicaudata\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"taxonGroup\">Taxon group</Label>\n <Select\n value={form.taxonGroup}\n onValueChange={(v) => setForm({ ...form, taxonGroup: v as EcoTaxonGroup })}\n >\n <SelectTrigger id=\"taxonGroup\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"conservationStatus\">Conservation status</Label>\n <Select\n value={form.conservationStatus}\n onValueChange={(v) =>\n setForm({ ...form, conservationStatus: v as EcoConservationStatus })\n }\n >\n <SelectTrigger id=\"conservationStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <label className=\"flex items-center gap-2 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={form.isPriority}\n onChange={(e) => setForm({ ...form, isPriority: e.target.checked })}\n className=\"h-4 w-4 rounded border-border-seam accent-action-primary-bg\"\n />\n Mark as priority species\n </label>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"Optional notes on habitat, range or identification.\"\n rows={2}\n />\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setDialogOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreate} disabled={createSpecies.isPending}>\n {createSpecies.isPending ? 'Creating…' : 'Create species'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SpeciesPage.js","names":[],"sources":["../../../../src/ecoimpacthub/pages/species/SpeciesPage.tsx"],"sourcesContent":["/**\n * Species — list, filter, and register tracked taxa.\n * @module ecoimpacthub/pages/species\n *\n * Reads `ecoListSpecies`; writes `ecoCreateSpecies`.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Rabbit, Search, Star } from 'lucide-react';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Pagination } from '../../components/Pagination';\nimport { ConservationBadge } from '../_shared/ConservationBadge';\nimport { TaxonChip } from '../_shared/TaxonChip';\nimport { useEcoImpactHub } from '../../context';\nimport { useEcoSpecies, useEcoCreateSpecies, useCursorPager } from '../../hooks';\nimport { formatEnumLabel, formatRelativeTime } from '../../utils/formatters';\nimport type { EcoSpecies, EcoTaxonGroup, EcoConservationStatus } from '../../types';\n\nconst TAXON_GROUPS: EcoTaxonGroup[] = [\n 'MAMMAL',\n 'BIRD',\n 'REPTILE',\n 'AMPHIBIAN',\n 'FISH',\n 'INSECT',\n 'PLANT',\n 'FUNGI',\n 'OTHER',\n];\n\nconst CONSERVATION_STATUSES: EcoConservationStatus[] = [\n 'LEAST_CONCERN',\n 'NEAR_THREATENED',\n 'VULNERABLE',\n 'ENDANGERED',\n 'CRITICALLY_ENDANGERED',\n 'EXTINCT_IN_WILD',\n 'DATA_DEFICIENT',\n 'NOT_EVALUATED',\n];\n\nconst PRIORITY_FILTERS: FilterOption<'ALL' | 'PRIORITY'>[] = [\n { value: 'ALL', label: 'All species' },\n { value: 'PRIORITY', label: 'Priority only' },\n];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n commonName: string;\n scientificName: string;\n taxonGroup: EcoTaxonGroup;\n conservationStatus: EcoConservationStatus;\n isPriority: boolean;\n description: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n commonName: '',\n scientificName: '',\n taxonGroup: 'MAMMAL',\n conservationStatus: 'NOT_EVALUATED',\n isPriority: false,\n description: '',\n};\n\nexport function SpeciesPage() {\n const { navigateTo } = useEcoImpactHub();\n const [taxonGroup, setTaxonGroup] = useState<EcoTaxonGroup | 'ALL'>('ALL');\n const [conservationStatus, setConservationStatus] = useState<EcoConservationStatus | 'ALL'>(\n 'ALL'\n );\n const [priority, setPriority] = useState<'ALL' | 'PRIORITY'>('ALL');\n const [search, setSearch] = useState('');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useEcoSpecies({\n taxonGroup: taxonGroup === 'ALL' ? undefined : taxonGroup,\n conservationStatus: conservationStatus === 'ALL' ? undefined : conservationStatus,\n priorityOnly: priority === 'PRIORITY' ? true : undefined,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createSpecies = useEcoCreateSpecies();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n\n const query = search.trim().toLowerCase();\n const visibleRows = useMemo(() => {\n if (!query) return rows;\n return rows.filter(\n (s) =>\n s.commonName.toLowerCase().includes(query) ||\n (s.scientificName?.toLowerCase().includes(query) ?? false)\n );\n }, [rows, query]);\n\n const columns: Column<EcoSpecies>[] = [\n {\n key: 'name',\n header: 'Species',\n render: (s) => (\n <div className=\"min-w-0\">\n <p className=\"font-semibold text-text-primary\">{s.commonName}</p>\n {s.scientificName && (\n <p className=\"truncate text-xs italic text-text-tertiary\">{s.scientificName}</p>\n )}\n </div>\n ),\n },\n {\n key: 'taxonGroup',\n header: 'Taxon',\n hideOnMobile: true,\n render: (s) => <TaxonChip group={s.taxonGroup} />,\n },\n {\n key: 'conservationStatus',\n header: 'Conservation status',\n render: (s) => <ConservationBadge status={s.conservationStatus} />,\n },\n {\n key: 'priority',\n header: 'Priority',\n align: 'center',\n render: (s) =>\n s.isPriority ? (\n <span\n className=\"inline-flex items-center justify-center gap-1 rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-status-warning-text\"\n title=\"Priority species\"\n >\n <Star className=\"h-3.5 w-3.5 fill-current\" />\n </span>\n ) : (\n <span className=\"text-text-tertiary\" title=\"Not prioritised\">\n —\n </span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (s) => (\n <span className=\"whitespace-nowrap text-text-tertiary\">\n {formatRelativeTime(s.updatedAt)}\n </span>\n ),\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.commonName.trim()) {\n setFormError('Common name is required.');\n return;\n }\n try {\n const created = await createSpecies.mutateAsync({\n commonName: form.commonName.trim(),\n scientificName: form.scientificName.trim() || null,\n taxonGroup: form.taxonGroup,\n conservationStatus: form.conservationStatus,\n isPriority: form.isPriority,\n description: form.description.trim() || null,\n });\n setDialogOpen(false);\n resetForm();\n navigateTo(`species/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create species.');\n }\n };\n\n return (\n <PageLayout\n title=\"Species\"\n description=\"Tracked taxa — conservation status, priority focus & field observations.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New species\n </Button>\n }\n >\n <GlassCard treatment=\"plain\" className=\"mb-5 p-4\">\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Taxon group\n </span>\n <Select\n value={taxonGroup}\n onValueChange={(v) => {\n setTaxonGroup(v as EcoTaxonGroup | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-44\">\n <SelectValue placeholder=\"All groups\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All groups</SelectItem>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Conservation status\n </span>\n <Select\n value={conservationStatus}\n onValueChange={(v) => {\n setConservationStatus(v as EcoConservationStatus | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-52\">\n <SelectValue placeholder=\"All conservation\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All conservation</SelectItem>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">\n Search this page\n </span>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Common or scientific name…\"\n className=\"w-full pl-9 sm:w-64\"\n aria-label=\"Search loaded species by name\"\n />\n </div>\n </div>\n </div>\n <FilterTabs\n options={PRIORITY_FILTERS}\n value={priority}\n onChange={(v) => {\n setPriority(v);\n pager.reset();\n }}\n />\n </div>\n </GlassCard>\n\n {isLoading ? (\n <LoadingView label=\"Loading species…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load species.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Rabbit className=\"h-10 w-10\" />}\n title=\"No species yet\"\n description={\n taxonGroup === 'ALL' && conservationStatus === 'ALL' && priority === 'ALL'\n ? 'Register your first species to start logging field observations.'\n : 'No species match these filters.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New species\n </Button>\n }\n />\n ) : visibleRows.length === 0 ? (\n <EmptyState\n icon={<Search className=\"h-10 w-10\" />}\n title=\"No matches on this page\"\n description={`No species on this page match “${search.trim()}”. Clear the search or page through the catalog.`}\n action={\n <Button variant=\"outline\" onClick={() => setSearch('')}>\n Clear search\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={visibleRows}\n rowKey={(s) => s.id}\n onRowClick={(s) => navigateTo(`species/${s.id}`)}\n />\n {query ? (\n <p className=\"mt-4 text-sm text-text-secondary tabular-nums\">\n {visibleRows.length} of {rows.length} on this page match “{search.trim()}”\n </p>\n ) : (\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n )}\n </>\n )}\n\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New species</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a taxon to track its conservation status and field observations.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"commonName\">Common name *</Label>\n <Input\n id=\"commonName\"\n value={form.commonName}\n onChange={(e) => setForm({ ...form, commonName: e.target.value })}\n placeholder=\"Indian Pangolin\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"scientificName\">Scientific name</Label>\n <Input\n id=\"scientificName\"\n value={form.scientificName}\n onChange={(e) => setForm({ ...form, scientificName: e.target.value })}\n placeholder=\"Manis crassicaudata\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"taxonGroup\">Taxon group</Label>\n <Select\n value={form.taxonGroup}\n onValueChange={(v) => setForm({ ...form, taxonGroup: v as EcoTaxonGroup })}\n >\n <SelectTrigger id=\"taxonGroup\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TAXON_GROUPS.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"conservationStatus\">Conservation status</Label>\n <Select\n value={form.conservationStatus}\n onValueChange={(v) =>\n setForm({ ...form, conservationStatus: v as EcoConservationStatus })\n }\n >\n <SelectTrigger id=\"conservationStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CONSERVATION_STATUSES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <label className=\"flex items-center gap-2 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n checked={form.isPriority}\n onChange={(e) => setForm({ ...form, isPriority: e.target.checked })}\n className=\"h-4 w-4 rounded border-border-seam accent-action-primary-bg\"\n />\n Mark as priority species\n </label>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"Optional notes on habitat, range or identification.\"\n rows={2}\n />\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setDialogOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreate} disabled={createSpecies.isPending}>\n {createSpecies.isPending ? 'Creating…' : 'Create species'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * ecoimpacthub adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\n\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'ecoimpacthub',\n \n enableCredits: true,\n });\n}\n"],"mappings":";;AAyBA,SAAgB,IAAmD;AACjE,QAAO,EAAmB;EACxB,SAAS;EAET,eAAe;EAChB,CAAC"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * ecoimpacthub adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'ecoimpacthub',\n\n enableCredits: true,\n });\n}\n"],"mappings":";;AAwBA,SAAgB,IAAmD;CACjE,OAAO,EAAmB;EACxB,SAAS;EAET,eAAe;CACjB,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cn.js","names":[],"sources":["../../../src/ecoimpacthub/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAGA,SAAgB,EAAG,GAAG,GAAsB;AAC1C,QAAO,EAAQ,EAAK,EAAO,CAAC"}
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../../src/ecoimpacthub/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAGA,SAAgB,EAAG,GAAG,GAAsB;CAC1C,OAAO,EAAQ,EAAK,CAAM,CAAC;AAC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","names":[],"sources":["../../../src/ecoimpacthub/utils/formatters.ts"],"sourcesContent":["/**\n * Formatting utilities for the EcoImpactHub microfrontend\n * @module ecoimpacthub/utils/formatters\n */\n\n/** Format a date string or Date into a human-readable date. */\nexport function formatDate(\n date: string | Date | null | undefined,\n options?: Partial<Intl.DateTimeFormatOptions>\n): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n ...options,\n }).format(d);\n}\n\n/** Format a date-time into a date + time string. */\nexport function formatDateTime(\n date: string | Date | null | undefined,\n options?: Partial<Intl.DateTimeFormatOptions>\n): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n ...options,\n }).format(d);\n}\n\n/** Format a date into a relative time string (e.g. \"2 hours ago\", \"in 3 days\"). */\nexport function formatRelativeTime(date: string | Date | null | undefined): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n\n const now = new Date();\n const diffMs = d.getTime() - now.getTime();\n const future = diffMs >= 0;\n const absSeconds = Math.floor(Math.abs(diffMs) / 1000);\n const minutes = Math.floor(absSeconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const weeks = Math.floor(days / 7);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n const phrase = (value: number, unit: string): string => {\n const label = `${value} ${unit}${value !== 1 ? 's' : ''}`;\n return future ? `in ${label}` : `${label} ago`;\n };\n\n if (absSeconds < 60) return future ? 'soon' : 'just now';\n if (minutes < 60) return phrase(minutes, 'min');\n if (hours < 24) return phrase(hours, 'hour');\n if (days < 7) return phrase(days, 'day');\n if (weeks < 4) return phrase(weeks, 'week');\n if (months < 12) return phrase(months, 'month');\n return phrase(years, 'year');\n}\n\n/** Format a number with locale grouping. */\nexport function formatNumber(\n value: number | null | undefined,\n options?: Partial<Intl.NumberFormatOptions>\n): string {\n if (value == null || Number.isNaN(value)) return '—';\n return new Intl.NumberFormat(undefined, options).format(value);\n}\n\n/** Format a quantity with an optional unit suffix (e.g. \"1,200 kg\"). */\nexport function formatQuantity(value: number | null | undefined, unit?: string | null): string {\n if (value == null || Number.isNaN(value)) return '—';\n const num = formatNumber(value, { maximumFractionDigits: 2 });\n return unit ? `${num} ${unit}` : num;\n}\n\n/** Format a percentage (0–100) into a rounded \"%\" string. */\nexport function formatPercent(value: number | null | undefined, fractionDigits = 0): string {\n if (value == null || Number.isNaN(value)) return '—';\n return `${value.toFixed(fractionDigits)}%`;\n}\n\n/**\n * Format a mass of CO2e (kg) into a compact, human-scaled string:\n * < 1,000 kg → \"kg CO₂e\"; ≥ 1,000 kg → \"t CO₂e\" (tonnes).\n */\nexport function formatCo2e(kg: number | null | undefined): string {\n if (kg == null || Number.isNaN(kg)) return '—';\n if (Math.abs(kg) >= 1000) {\n return `${formatNumber(kg / 1000, { maximumFractionDigits: 2 })} t CO₂e`;\n }\n return `${formatNumber(kg, { maximumFractionDigits: 1 })} kg CO₂e`;\n}\n\n/** Format coordinates into a compact \"lat, lng\" string. */\nexport function formatCoords(\n lat: number | null | undefined,\n lng: number | null | undefined\n): string {\n if (lat == null || lng == null) return '—';\n return `${lat.toFixed(4)}, ${lng.toFixed(4)}`;\n}\n\n/** Turn an ENUM_LIKE_TOKEN into a human \"Enum Like Token\" label. */\nexport function formatEnumLabel(value: string | null | undefined): string {\n if (!value) return '—';\n return value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"formatters.js","names":[],"sources":["../../../src/ecoimpacthub/utils/formatters.ts"],"sourcesContent":["/**\n * Formatting utilities for the EcoImpactHub microfrontend\n * @module ecoimpacthub/utils/formatters\n */\n\n/** Format a date string or Date into a human-readable date. */\nexport function formatDate(\n date: string | Date | null | undefined,\n options?: Partial<Intl.DateTimeFormatOptions>\n): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n ...options,\n }).format(d);\n}\n\n/** Format a date-time into a date + time string. */\nexport function formatDateTime(\n date: string | Date | null | undefined,\n options?: Partial<Intl.DateTimeFormatOptions>\n): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n ...options,\n }).format(d);\n}\n\n/** Format a date into a relative time string (e.g. \"2 hours ago\", \"in 3 days\"). */\nexport function formatRelativeTime(date: string | Date | null | undefined): string {\n if (!date) return '—';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (Number.isNaN(d.getTime())) return '—';\n\n const now = new Date();\n const diffMs = d.getTime() - now.getTime();\n const future = diffMs >= 0;\n const absSeconds = Math.floor(Math.abs(diffMs) / 1000);\n const minutes = Math.floor(absSeconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const weeks = Math.floor(days / 7);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n const phrase = (value: number, unit: string): string => {\n const label = `${value} ${unit}${value !== 1 ? 's' : ''}`;\n return future ? `in ${label}` : `${label} ago`;\n };\n\n if (absSeconds < 60) return future ? 'soon' : 'just now';\n if (minutes < 60) return phrase(minutes, 'min');\n if (hours < 24) return phrase(hours, 'hour');\n if (days < 7) return phrase(days, 'day');\n if (weeks < 4) return phrase(weeks, 'week');\n if (months < 12) return phrase(months, 'month');\n return phrase(years, 'year');\n}\n\n/** Format a number with locale grouping. */\nexport function formatNumber(\n value: number | null | undefined,\n options?: Partial<Intl.NumberFormatOptions>\n): string {\n if (value == null || Number.isNaN(value)) return '—';\n return new Intl.NumberFormat(undefined, options).format(value);\n}\n\n/** Format a quantity with an optional unit suffix (e.g. \"1,200 kg\"). */\nexport function formatQuantity(value: number | null | undefined, unit?: string | null): string {\n if (value == null || Number.isNaN(value)) return '—';\n const num = formatNumber(value, { maximumFractionDigits: 2 });\n return unit ? `${num} ${unit}` : num;\n}\n\n/** Format a percentage (0–100) into a rounded \"%\" string. */\nexport function formatPercent(value: number | null | undefined, fractionDigits = 0): string {\n if (value == null || Number.isNaN(value)) return '—';\n return `${value.toFixed(fractionDigits)}%`;\n}\n\n/**\n * Format a mass of CO2e (kg) into a compact, human-scaled string:\n * < 1,000 kg → \"kg CO₂e\"; ≥ 1,000 kg → \"t CO₂e\" (tonnes).\n */\nexport function formatCo2e(kg: number | null | undefined): string {\n if (kg == null || Number.isNaN(kg)) return '—';\n if (Math.abs(kg) >= 1000) {\n return `${formatNumber(kg / 1000, { maximumFractionDigits: 2 })} t CO₂e`;\n }\n return `${formatNumber(kg, { maximumFractionDigits: 1 })} kg CO₂e`;\n}\n\n/** Format coordinates into a compact \"lat, lng\" string. */\nexport function formatCoords(\n lat: number | null | undefined,\n lng: number | null | undefined\n): string {\n if (lat == null || lng == null) return '—';\n return `${lat.toFixed(4)}, ${lng.toFixed(4)}`;\n}\n\n/** Turn an ENUM_LIKE_TOKEN into a human \"Enum Like Token\" label. */\nexport function formatEnumLabel(value: string | null | undefined): string {\n if (!value) return '—';\n return value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n"],"mappings":";AAMA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,CAAC,GAAM,OAAO;CAClB,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,CAAI,IAAI;CAEtD,OADI,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAU,MAC/B,IAAI,KAAK,eAAe,KAAA,GAAW;EACxC,KAAK;EACL,OAAO;EACP,MAAM;EACN,GAAG;CACL,CAAC,EAAE,OAAO,CAAC;AACb;AAGA,SAAgB,EACd,GACA,GACQ;CACR,IAAI,CAAC,GAAM,OAAO;CAClB,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,CAAI,IAAI;CAEtD,OADI,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAU,MAC/B,IAAI,KAAK,eAAe,KAAA,GAAW;EACxC,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,GAAG;CACL,CAAC,EAAE,OAAO,CAAC;AACb;AAGA,SAAgB,EAAmB,GAAgD;CACjF,IAAI,CAAC,GAAM,OAAO;CAClB,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,CAAI,IAAI;CACtD,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CAEtC,IAAM,oBAAM,IAAI,KAAK,GACf,IAAS,EAAE,QAAQ,IAAI,EAAI,QAAQ,GACnC,IAAS,KAAU,GACnB,IAAa,KAAK,MAAM,KAAK,IAAI,CAAM,IAAI,GAAI,GAC/C,IAAU,KAAK,MAAM,IAAa,EAAE,GACpC,IAAQ,KAAK,MAAM,IAAU,EAAE,GAC/B,IAAO,KAAK,MAAM,IAAQ,EAAE,GAC5B,IAAQ,KAAK,MAAM,IAAO,CAAC,GAC3B,IAAS,KAAK,MAAM,IAAO,EAAE,GAC7B,IAAQ,KAAK,MAAM,IAAO,GAAG,GAE7B,KAAU,GAAe,MAAyB;EACtD,IAAM,IAAQ,GAAG,EAAM,GAAG,IAAO,MAAU,IAAU,KAAN;EAC/C,OAAO,IAAS,MAAM,MAAU,GAAG,EAAM;CAC3C;CAQA,OANI,IAAa,KAAW,IAAS,SAAS,aAC1C,IAAU,KAAW,EAAO,GAAS,KAAK,IAC1C,IAAQ,KAAW,EAAO,GAAO,MAAM,IACvC,IAAO,IAAU,EAAO,GAAM,KAAK,IACnC,IAAQ,IAAU,EAAO,GAAO,MAAM,IACtC,IAAS,KAAW,EAAO,GAAQ,OAAO,IACvC,EAAO,GAAO,MAAM;AAC7B;AAGA,SAAgB,EACd,GACA,GACQ;CAER,OADI,KAAS,QAAQ,OAAO,MAAM,CAAK,IAAU,MAC1C,IAAI,KAAK,aAAa,KAAA,GAAW,CAAO,EAAE,OAAO,CAAK;AAC/D;AAGA,SAAgB,EAAe,GAAkC,GAA8B;CAC7F,IAAI,KAAS,QAAQ,OAAO,MAAM,CAAK,GAAG,OAAO;CACjD,IAAM,IAAM,EAAa,GAAO,EAAE,uBAAuB,EAAE,CAAC;CAC5D,OAAO,IAAO,GAAG,EAAI,GAAG,MAAS;AACnC;AAGA,SAAgB,EAAc,GAAkC,IAAiB,GAAW;CAE1F,OADI,KAAS,QAAQ,OAAO,MAAM,CAAK,IAAU,MAC1C,GAAG,EAAM,QAAQ,CAAc,EAAE;AAC1C;AAMA,SAAgB,EAAW,GAAuC;CAKhE,OAJI,KAAM,QAAQ,OAAO,MAAM,CAAE,IAAU,MACvC,KAAK,IAAI,CAAE,KAAK,MACX,GAAG,EAAa,IAAK,KAAM,EAAE,uBAAuB,EAAE,CAAC,EAAE,WAE3D,GAAG,EAAa,GAAI,EAAE,uBAAuB,EAAE,CAAC,EAAE;AAC3D;AAGA,SAAgB,EACd,GACA,GACQ;CAER,OADI,KAAO,QAAQ,KAAO,OAAa,MAChC,GAAG,EAAI,QAAQ,CAAC,EAAE,IAAI,EAAI,QAAQ,CAAC;AAC5C;AAGA,SAAgB,EAAgB,GAA0C;CAExE,OADK,IACE,EACJ,YAAY,EACZ,QAAQ,MAAM,GAAG,EACjB,QAAQ,UAAU,MAAS,EAAK,YAAY,CAAC,IAJ7B;AAKrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","names":[],"sources":["../../../src/ecoimpacthub/utils/navigation.ts"],"sourcesContent":["/**\n * Navigation utilities for the EcoImpactHub microfrontend\n * @module ecoimpacthub/utils\n */\n\n/**\n * Join basePath with a relative path, correctly handling slashes.\n *\n * @example\n * joinPath('/ecoimpacthub', 'sites') // => '/ecoimpacthub/sites'\n * joinPath('/ecoimpacthub/', 'sites') // => '/ecoimpacthub/sites'\n * joinPath('/ecoimpacthub', '') // => '/ecoimpacthub'\n */\nexport function joinPath(basePath: string, relativePath: string): string {\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n if (!relativePath || relativePath === '') {\n return cleanBase || '/';\n }\n const cleanPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\n return cleanBase + cleanPath;\n}\n"],"mappings":";AAaA,SAAgB,EAAS,GAAkB,GAA8B;CACvE,IAAM,IAAY,EAAS,SAAS,IAAI,GAAG,EAAS,MAAM,GAAG,GAAG,GAAG;AAKnE,QAJI,CAAC,KAAgB,MAAiB,KAC7B,KAAa,MAGf,KADW,EAAa,WAAW,IAAI,GAAG,IAAe,IAAI"}
1
+ {"version":3,"file":"navigation.js","names":[],"sources":["../../../src/ecoimpacthub/utils/navigation.ts"],"sourcesContent":["/**\n * Navigation utilities for the EcoImpactHub microfrontend\n * @module ecoimpacthub/utils\n */\n\n/**\n * Join basePath with a relative path, correctly handling slashes.\n *\n * @example\n * joinPath('/ecoimpacthub', 'sites') // => '/ecoimpacthub/sites'\n * joinPath('/ecoimpacthub/', 'sites') // => '/ecoimpacthub/sites'\n * joinPath('/ecoimpacthub', '') // => '/ecoimpacthub'\n */\nexport function joinPath(basePath: string, relativePath: string): string {\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n if (!relativePath || relativePath === '') {\n return cleanBase || '/';\n }\n const cleanPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\n return cleanBase + cleanPath;\n}\n"],"mappings":";AAaA,SAAgB,EAAS,GAAkB,GAA8B;CACvE,IAAM,IAAY,EAAS,SAAS,GAAG,IAAI,EAAS,MAAM,GAAG,EAAE,IAAI;CAKnE,OAJI,CAAC,KAAgB,MAAiB,KAC7B,KAAa,MAGf,KADW,EAAa,WAAW,GAAG,IAAI,IAAe,IAAI;AAEtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"clsx.js","names":[],"sources":["../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;AAAG,KAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,SAAmB,MAAG;UAAoB,OAAO,KAAjB,SAAmB,KAAG,MAAM,QAAQ,EAAE,EAAC;EAAC,IAAI,IAAE,EAAE;AAAO,OAAI,IAAE,GAAE,IAAE,GAAE,IAAI,GAAE,OAAK,IAAE,EAAE,EAAE,GAAG,MAAI,MAAI,KAAG,MAAK,KAAG;OAAQ,MAAI,KAAK,EAAE,GAAE,OAAK,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO;;AAAE,SAAgB,IAAM;AAAC,MAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,IAAI,EAAC,IAAE,UAAU,QAAM,IAAE,EAAE,EAAE,MAAI,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO"}
1
+ {"version":3,"file":"clsx.js","names":[],"sources":["../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;CAAG,IAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,UAAmB,KAAG;MAAO,IAAa,OAAO,KAAjB,UAAmB,IAAG,MAAM,QAAQ,CAAC,GAAE;EAAC,IAAI,IAAE,EAAE;EAAO,KAAI,IAAE,GAAE,IAAE,GAAE,KAAI,EAAE,OAAK,IAAE,EAAE,EAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;CAAE,OAAM,KAAI,KAAK,GAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;CAAG,OAAO;AAAC;AAAC,SAAgB,IAAM;CAAC,KAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,KAAI,CAAC,IAAE,UAAU,QAAM,IAAE,EAAE,CAAC,OAAK,MAAI,KAAG,MAAK,KAAG;CAAG,OAAO;AAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ascending.js","names":[],"sources":["../../../../node_modules/d3-array/src/ascending.js"],"sourcesContent":["export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAU,GAAG,GAAG;AACtC,QAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI"}
1
+ {"version":3,"file":"ascending.js","names":[],"sources":["../../../../node_modules/d3-array/src/ascending.js"],"sourcesContent":["export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAU,GAAG,GAAG;CACtC,OAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAC9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"bisect.js","names":[],"sources":["../../../../node_modules/d3-array/src/bisect.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n"],"x_google_ignoreList":[0],"mappings":";;;;AAIA,IAAM,IAAkB,EAAS,EAAU,EAC9B,IAAc,EAAgB;AACjB,EAAgB,MACd,EAAS,EAAO,CAAC"}
1
+ {"version":3,"file":"bisect.js","names":[],"sources":["../../../../node_modules/d3-array/src/bisect.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n"],"x_google_ignoreList":[0],"mappings":";;;;AAIA,IAAM,IAAkB,EAAS,CAAS,GAC7B,IAAc,EAAgB;AACjB,EAAgB,MACd,EAAS,CAAM,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"bisector.js","names":[],"sources":["../../../../node_modules/d3-array/src/bisector.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AAGA,SAAwB,EAAS,GAAG;CAClC,IAAI,GAAU,GAAU;AAOxB,CAAI,EAAE,WAAW,KAKf,IAAW,MAAM,KAAa,MAAM,IAAa,IAAI,GACrD,IAAW,GACX,IAAQ,MANR,IAAW,GACX,KAAY,GAAG,MAAM,EAAU,EAAE,EAAE,EAAE,EAAE,EACvC,KAAS,GAAG,MAAM,EAAE,EAAE,GAAG;CAO3B,SAAS,EAAK,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;AACzC,MAAI,IAAK,GAAI;AACX,OAAI,EAAS,GAAG,EAAE,KAAK,EAAG,QAAO;AACjC,MAAG;IACD,IAAM,IAAO,IAAK,MAAQ;AAC1B,IAAI,EAAS,EAAE,IAAM,EAAE,GAAG,IAAG,IAAK,IAAM,IACnC,IAAK;YACH,IAAK;;AAEhB,SAAO;;CAGT,SAAS,EAAM,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;AAC1C,MAAI,IAAK,GAAI;AACX,OAAI,EAAS,GAAG,EAAE,KAAK,EAAG,QAAO;AACjC,MAAG;IACD,IAAM,IAAO,IAAK,MAAQ;AAC1B,IAAI,EAAS,EAAE,IAAM,EAAE,IAAI,IAAG,IAAK,IAAM,IACpC,IAAK;YACH,IAAK;;AAEhB,SAAO;;CAGT,SAAS,EAAO,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;EAC3C,IAAM,IAAI,EAAK,GAAG,GAAG,GAAI,IAAK,EAAE;AAChC,SAAO,IAAI,KAAM,EAAM,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC,EAAM,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;;AAGlE,QAAO;EAAC;EAAM;EAAQ;EAAM;;AAG9B,SAAS,IAAO;AACd,QAAO"}
1
+ {"version":3,"file":"bisector.js","names":[],"sources":["../../../../node_modules/d3-array/src/bisector.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;AAGA,SAAwB,EAAS,GAAG;CAClC,IAAI,GAAU,GAAU;CAOxB,AAAI,EAAE,WAAW,KAKf,IAAW,MAAM,KAAa,MAAM,IAAa,IAAI,GACrD,IAAW,GACX,IAAQ,MANR,IAAW,GACX,KAAY,GAAG,MAAM,EAAU,EAAE,CAAC,GAAG,CAAC,GACtC,KAAS,GAAG,MAAM,EAAE,CAAC,IAAI;CAO3B,SAAS,EAAK,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;EACzC,IAAI,IAAK,GAAI;GACX,IAAI,EAAS,GAAG,CAAC,MAAM,GAAG,OAAO;GACjC,GAAG;IACD,IAAM,IAAO,IAAK,MAAQ;IAC1B,AAAI,EAAS,EAAE,IAAM,CAAC,IAAI,IAAG,IAAK,IAAM,IACnC,IAAK;GACZ,SAAS,IAAK;EAChB;EACA,OAAO;CACT;CAEA,SAAS,EAAM,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;EAC1C,IAAI,IAAK,GAAI;GACX,IAAI,EAAS,GAAG,CAAC,MAAM,GAAG,OAAO;GACjC,GAAG;IACD,IAAM,IAAO,IAAK,MAAQ;IAC1B,AAAI,EAAS,EAAE,IAAM,CAAC,KAAK,IAAG,IAAK,IAAM,IACpC,IAAK;GACZ,SAAS,IAAK;EAChB;EACA,OAAO;CACT;CAEA,SAAS,EAAO,GAAG,GAAG,IAAK,GAAG,IAAK,EAAE,QAAQ;EAC3C,IAAM,IAAI,EAAK,GAAG,GAAG,GAAI,IAAK,CAAC;EAC/B,OAAO,IAAI,KAAM,EAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAM,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;CAClE;CAEA,OAAO;EAAC;EAAM;EAAQ;CAAK;AAC7B;AAEA,SAAS,IAAO;CACd,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"descending.js","names":[],"sources":["../../../../node_modules/d3-array/src/descending.js"],"sourcesContent":["export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAW,GAAG,GAAG;AACvC,QAAO,KAAK,QAAQ,KAAK,OAAO,MAC5B,IAAI,IAAI,KACR,IAAI,IAAI,IACR,KAAK,IAAI,IACT"}
1
+ {"version":3,"file":"descending.js","names":[],"sources":["../../../../node_modules/d3-array/src/descending.js"],"sourcesContent":["export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAW,GAAG,GAAG;CACvC,OAAO,KAAK,QAAQ,KAAK,OAAO,MAC5B,IAAI,IAAI,KACR,IAAI,IAAI,IACR,KAAK,IAAI,IACT;AACN"}
@@ -1 +1 @@
1
- {"version":3,"file":"max.js","names":[],"sources":["../../../../node_modules/d3-array/src/max.js"],"sourcesContent":["export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAI,GAAQ,GAAS;CAC3C,IAAI;AACJ,KAAI,MAAY,KAAA,QACT,IAAM,KAAS,EAClB,CAAI,KAAS,SACL,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;MAGL;EACL,IAAI,IAAQ;AACZ,OAAK,IAAI,KAAS,EAChB,EAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,EAAO,KAAK,SACzC,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;;AAIZ,QAAO"}
1
+ {"version":3,"file":"max.js","names":[],"sources":["../../../../node_modules/d3-array/src/max.js"],"sourcesContent":["export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAI,GAAQ,GAAS;CAC3C,IAAI;CACJ,IAAI,MAAY,KAAA,QACT,IAAM,KAAS,GAClB,AAAI,KAAS,SACL,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;MAGL;EACL,IAAI,IAAQ;EACZ,KAAK,IAAI,KAAS,GAChB,CAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,CAAM,MAAM,SACzC,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;CAGZ;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"min.js","names":[],"sources":["../../../../node_modules/d3-array/src/min.js"],"sourcesContent":["export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAI,GAAQ,GAAS;CAC3C,IAAI;AACJ,KAAI,MAAY,KAAA,QACT,IAAM,KAAS,EAClB,CAAI,KAAS,SACL,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;MAGL;EACL,IAAI,IAAQ;AACZ,OAAK,IAAI,KAAS,EAChB,EAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,EAAO,KAAK,SACzC,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;;AAIZ,QAAO"}
1
+ {"version":3,"file":"min.js","names":[],"sources":["../../../../node_modules/d3-array/src/min.js"],"sourcesContent":["export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAI,GAAQ,GAAS;CAC3C,IAAI;CACJ,IAAI,MAAY,KAAA,QACT,IAAM,KAAS,GAClB,AAAI,KAAS,SACL,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;MAGL;EACL,IAAI,IAAQ;EACZ,KAAK,IAAI,KAAS,GAChB,CAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,CAAM,MAAM,SACzC,IAAM,KAAU,MAAQ,KAAA,KAAa,KAAS,OACpD,IAAM;CAGZ;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"number.js","names":[],"sources":["../../../../node_modules/d3-array/src/number.js"],"sourcesContent":["export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAO,GAAG;AAChC,QAAO,MAAM,OAAO,MAAM,CAAC;;AAG7B,UAAiB,EAAQ,GAAQ,GAAS;AACxC,KAAI,MAAY,KAAA,QACT,IAAI,KAAS,EAChB,CAAI,KAAS,SAAS,IAAQ,CAAC,MAAU,MACvC,MAAM;MAGL;EACL,IAAI,IAAQ;AACZ,OAAK,IAAI,KAAS,EAChB,EAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,EAAO,KAAK,SAAS,IAAQ,CAAC,MAAU,MAC3E,MAAM"}
1
+ {"version":3,"file":"number.js","names":[],"sources":["../../../../node_modules/d3-array/src/number.js"],"sourcesContent":["export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAO,GAAG;CAChC,OAAO,MAAM,OAAO,MAAM,CAAC;AAC7B;AAEA,UAAiB,EAAQ,GAAQ,GAAS;CACxC,IAAI,MAAY,KAAA,QACT,IAAI,KAAS,GAChB,AAAI,KAAS,SAAS,IAAQ,CAAC,MAAU,MACvC,MAAM;MAGL;EACL,IAAI,IAAQ;EACZ,KAAK,IAAI,KAAS,GAChB,CAAK,IAAQ,EAAQ,GAAO,EAAE,GAAO,CAAM,MAAM,SAAS,IAAQ,CAAC,MAAU,MAC3E,MAAM;CAGZ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"quantile.js","names":[],"sources":["../../../../node_modules/d3-array/src/quantile.js"],"sourcesContent":["import max from \"./max.js\";\nimport maxIndex from \"./maxIndex.js\";\nimport min from \"./min.js\";\nimport minIndex from \"./minIndex.js\";\nimport quickselect from \"./quickselect.js\";\nimport number, {numbers} from \"./number.js\";\nimport {ascendingDefined} from \"./sort.js\";\nimport greatest from \"./greatest.js\";\n\nexport default function quantile(values, p, valueof) {\n values = Float64Array.from(numbers(values, valueof));\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return min(values);\n if (p >= 1) return max(values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = max(quickselect(values, i0).subarray(0, i0 + 1)),\n value1 = min(values.subarray(i0 + 1));\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileSorted(values, p, valueof = number) {\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileIndex(values, p, valueof = number) {\n if (isNaN(p = +p)) return;\n numbers = Float64Array.from(values, (_, i) => number(valueof(values[i], i, values)));\n if (p <= 0) return minIndex(numbers);\n if (p >= 1) return maxIndex(numbers);\n var numbers,\n index = Uint32Array.from(values, (_, i) => i),\n j = numbers.length - 1,\n i = Math.floor(j * p);\n quickselect(index, i, 0, j, (i, j) => ascendingDefined(numbers[i], numbers[j]));\n i = greatest(index.subarray(0, i + 1), (i) => numbers[i]);\n return i >= 0 ? i : -1;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;;AASA,SAAwB,EAAS,GAAQ,GAAG,GAAS;AACnD,SAAS,aAAa,KAAK,EAAQ,GAAQ,EAAQ,CAAC,EAChD,IAAE,IAAI,EAAO,WAAW,MAAM,IAAI,CAAC,EAAE,GACzC;MAAI,KAAK,KAAK,IAAI,EAAG,QAAO,EAAI,EAAO;AACvC,MAAI,KAAK,EAAG,QAAO,EAAI,EAAO;EAC9B,IAAI,GACA,KAAK,IAAI,KAAK,GACd,IAAK,KAAK,MAAM,EAAE,EAClB,IAAS,EAAI,EAAY,GAAQ,EAAG,CAAC,SAAS,GAAG,IAAK,EAAE,CAAC;AAE7D,SAAO,KADM,EAAI,EAAO,SAAS,IAAK,EAAE,CAAC,GACf,MAAW,IAAI;;;AAG3C,SAAgB,EAAe,GAAQ,GAAG,IAAU,GAAQ;AACtD,SAAE,IAAI,EAAO,WAAW,MAAM,IAAI,CAAC,EAAE,GACzC;MAAI,KAAK,KAAK,IAAI,EAAG,QAAO,CAAC,EAAQ,EAAO,IAAI,GAAG,EAAO;AAC1D,MAAI,KAAK,EAAG,QAAO,CAAC,EAAQ,EAAO,IAAI,IAAI,IAAI,GAAG,EAAO;EACzD,IAAI,GACA,KAAK,IAAI,KAAK,GACd,IAAK,KAAK,MAAM,EAAE,EAClB,IAAS,CAAC,EAAQ,EAAO,IAAK,GAAI,EAAO;AAE7C,SAAO,KADM,CAAC,EAAQ,EAAO,IAAK,IAAI,IAAK,GAAG,EAAO,GAC3B,MAAW,IAAI"}
1
+ {"version":3,"file":"quantile.js","names":[],"sources":["../../../../node_modules/d3-array/src/quantile.js"],"sourcesContent":["import max from \"./max.js\";\nimport maxIndex from \"./maxIndex.js\";\nimport min from \"./min.js\";\nimport minIndex from \"./minIndex.js\";\nimport quickselect from \"./quickselect.js\";\nimport number, {numbers} from \"./number.js\";\nimport {ascendingDefined} from \"./sort.js\";\nimport greatest from \"./greatest.js\";\n\nexport default function quantile(values, p, valueof) {\n values = Float64Array.from(numbers(values, valueof));\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return min(values);\n if (p >= 1) return max(values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = max(quickselect(values, i0).subarray(0, i0 + 1)),\n value1 = min(values.subarray(i0 + 1));\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileSorted(values, p, valueof = number) {\n if (!(n = values.length) || isNaN(p = +p)) return;\n if (p <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n\nexport function quantileIndex(values, p, valueof = number) {\n if (isNaN(p = +p)) return;\n numbers = Float64Array.from(values, (_, i) => number(valueof(values[i], i, values)));\n if (p <= 0) return minIndex(numbers);\n if (p >= 1) return maxIndex(numbers);\n var numbers,\n index = Uint32Array.from(values, (_, i) => i),\n j = numbers.length - 1,\n i = Math.floor(j * p);\n quickselect(index, i, 0, j, (i, j) => ascendingDefined(numbers[i], numbers[j]));\n i = greatest(index.subarray(0, i + 1), (i) => numbers[i]);\n return i >= 0 ? i : -1;\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;;AASA,SAAwB,EAAS,GAAQ,GAAG,GAAS;CACnD,QAAS,aAAa,KAAK,EAAQ,GAAQ,CAAO,CAAC,GAC/C,IAAE,IAAI,EAAO,WAAW,MAAM,IAAI,CAAC,CAAC,IACxC;MAAI,KAAK,KAAK,IAAI,GAAG,OAAO,EAAI,CAAM;EACtC,IAAI,KAAK,GAAG,OAAO,EAAI,CAAM;EAC7B,IAAI,GACA,KAAK,IAAI,KAAK,GACd,IAAK,KAAK,MAAM,CAAC,GACjB,IAAS,EAAI,EAAY,GAAQ,CAAE,EAAE,SAAS,GAAG,IAAK,CAAC,CAAC;EAE5D,OAAO,KADM,EAAI,EAAO,SAAS,IAAK,CAAC,CACjB,IAAI,MAAW,IAAI;CAPH;AAQxC;AAEA,SAAgB,EAAe,GAAQ,GAAG,IAAU,GAAQ;CACtD,QAAE,IAAI,EAAO,WAAW,MAAM,IAAI,CAAC,CAAC,IACxC;MAAI,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,EAAQ,EAAO,IAAI,GAAG,CAAM;EACzD,IAAI,KAAK,GAAG,OAAO,CAAC,EAAQ,EAAO,IAAI,IAAI,IAAI,GAAG,CAAM;EACxD,IAAI,GACA,KAAK,IAAI,KAAK,GACd,IAAK,KAAK,MAAM,CAAC,GACjB,IAAS,CAAC,EAAQ,EAAO,IAAK,GAAI,CAAM;EAE5C,OAAO,KAAU,CADH,EAAQ,EAAO,IAAK,IAAI,IAAK,GAAG,CAAM,IAC1B,MAAW,IAAI;CAPgB;AAQ3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"quickselect.js","names":[],"sources":["../../../../node_modules/d3-array/src/quickselect.js"],"sourcesContent":["import {ascendingDefined, compareDefined} from \"./sort.js\";\n\n// Based on https://github.com/mourner/quickselect\n// ISC license, Copyright 2018 Vladimir Agafonkin.\nexport default function quickselect(array, k, left = 0, right = Infinity, compare) {\n k = Math.floor(k);\n left = Math.floor(Math.max(0, left));\n right = Math.floor(Math.min(array.length - 1, right));\n\n if (!(left <= k && k <= right)) return array;\n\n compare = compare === undefined ? ascendingDefined : compareDefined(compare);\n\n while (right > left) {\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselect(array, k, newLeft, newRight, compare);\n }\n\n const t = array[k];\n let i = left;\n let j = right;\n\n swap(array, left, k);\n if (compare(array[right], t) > 0) swap(array, left, right);\n\n while (i < j) {\n swap(array, i, j), ++i, --j;\n while (compare(array[i], t) < 0) ++i;\n while (compare(array[j], t) > 0) --j;\n }\n\n if (compare(array[left], t) === 0) swap(array, left, j);\n else ++j, swap(array, j, right);\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n\n return array;\n}\n\nfunction swap(array, i, j) {\n const t = array[i];\n array[i] = array[j];\n array[j] = t;\n}\n"],"x_google_ignoreList":[0],"mappings":";;AAIA,SAAwB,EAAY,GAAO,GAAG,IAAO,GAAG,IAAQ,UAAU,GAAS;AAKjF,KAJA,IAAI,KAAK,MAAM,EAAE,EACjB,IAAO,KAAK,MAAM,KAAK,IAAI,GAAG,EAAK,CAAC,EACpC,IAAQ,KAAK,MAAM,KAAK,IAAI,EAAM,SAAS,GAAG,EAAM,CAAC,EAEjD,EAAE,KAAQ,KAAK,KAAK,GAAQ,QAAO;AAIvC,MAFA,IAAU,MAAY,KAAA,IAAY,IAAmB,EAAe,EAAQ,EAErE,IAAQ,IAAM;AACnB,MAAI,IAAQ,IAAO,KAAK;GACtB,IAAM,IAAI,IAAQ,IAAO,GACnB,IAAI,IAAI,IAAO,GACf,IAAI,KAAK,IAAI,EAAE,EACf,IAAI,KAAM,KAAK,IAAI,IAAI,IAAI,EAAE,EAC7B,IAAK,KAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAClE,IAAU,KAAK,IAAI,GAAM,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,EAAG,CAAC,EACxD,IAAW,KAAK,IAAI,GAAO,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,EAAG,CAAC;AACtE,KAAY,GAAO,GAAG,GAAS,GAAU,EAAQ;;EAGnD,IAAM,IAAI,EAAM,IACZ,IAAI,GACJ,IAAI;AAKR,OAHA,EAAK,GAAO,GAAM,EAAE,EAChB,EAAQ,EAAM,IAAQ,EAAE,GAAG,KAAG,EAAK,GAAO,GAAM,EAAM,EAEnD,IAAI,IAAG;AAEZ,QADA,EAAK,GAAO,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GACnB,EAAQ,EAAM,IAAI,EAAE,GAAG,GAAG,GAAE;AACnC,UAAO,EAAQ,EAAM,IAAI,EAAE,GAAG,GAAG,GAAE;;AAOrC,EAJI,EAAQ,EAAM,IAAO,EAAE,KAAK,IAAG,EAAK,GAAO,GAAM,EAAE,IAClD,EAAE,GAAG,EAAK,GAAO,GAAG,EAAM,GAE3B,KAAK,MAAG,IAAO,IAAI,IACnB,KAAK,MAAG,IAAQ,IAAI;;AAG1B,QAAO;;AAGT,SAAS,EAAK,GAAO,GAAG,GAAG;CACzB,IAAM,IAAI,EAAM;AAEhB,CADA,EAAM,KAAK,EAAM,IACjB,EAAM,KAAK"}
1
+ {"version":3,"file":"quickselect.js","names":[],"sources":["../../../../node_modules/d3-array/src/quickselect.js"],"sourcesContent":["import {ascendingDefined, compareDefined} from \"./sort.js\";\n\n// Based on https://github.com/mourner/quickselect\n// ISC license, Copyright 2018 Vladimir Agafonkin.\nexport default function quickselect(array, k, left = 0, right = Infinity, compare) {\n k = Math.floor(k);\n left = Math.floor(Math.max(0, left));\n right = Math.floor(Math.min(array.length - 1, right));\n\n if (!(left <= k && k <= right)) return array;\n\n compare = compare === undefined ? ascendingDefined : compareDefined(compare);\n\n while (right > left) {\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselect(array, k, newLeft, newRight, compare);\n }\n\n const t = array[k];\n let i = left;\n let j = right;\n\n swap(array, left, k);\n if (compare(array[right], t) > 0) swap(array, left, right);\n\n while (i < j) {\n swap(array, i, j), ++i, --j;\n while (compare(array[i], t) < 0) ++i;\n while (compare(array[j], t) > 0) --j;\n }\n\n if (compare(array[left], t) === 0) swap(array, left, j);\n else ++j, swap(array, j, right);\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n\n return array;\n}\n\nfunction swap(array, i, j) {\n const t = array[i];\n array[i] = array[j];\n array[j] = t;\n}\n"],"x_google_ignoreList":[0],"mappings":";;AAIA,SAAwB,EAAY,GAAO,GAAG,IAAO,GAAG,IAAQ,UAAU,GAAS;CAKjF,IAJA,IAAI,KAAK,MAAM,CAAC,GAChB,IAAO,KAAK,MAAM,KAAK,IAAI,GAAG,CAAI,CAAC,GACnC,IAAQ,KAAK,MAAM,KAAK,IAAI,EAAM,SAAS,GAAG,CAAK,CAAC,GAEhD,EAAE,KAAQ,KAAK,KAAK,IAAQ,OAAO;CAIvC,KAFA,IAAU,MAAY,KAAA,IAAY,IAAmB,EAAe,CAAO,GAEpE,IAAQ,IAAM;EACnB,IAAI,IAAQ,IAAO,KAAK;GACtB,IAAM,IAAI,IAAQ,IAAO,GACnB,IAAI,IAAI,IAAO,GACf,IAAI,KAAK,IAAI,CAAC,GACd,IAAI,KAAM,KAAK,IAAI,IAAI,IAAI,CAAC,GAC5B,IAAK,KAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAClE,IAAU,KAAK,IAAI,GAAM,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,CAAE,CAAC,GACvD,IAAW,KAAK,IAAI,GAAO,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,CAAE,CAAC;GACrE,EAAY,GAAO,GAAG,GAAS,GAAU,CAAO;EAClD;EAEA,IAAM,IAAI,EAAM,IACZ,IAAI,GACJ,IAAI;EAKR,KAHA,EAAK,GAAO,GAAM,CAAC,GACf,EAAQ,EAAM,IAAQ,CAAC,IAAI,KAAG,EAAK,GAAO,GAAM,CAAK,GAElD,IAAI,IAAG;GAEZ,KADA,EAAK,GAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GACnB,EAAQ,EAAM,IAAI,CAAC,IAAI,IAAG,EAAE;GACnC,OAAO,EAAQ,EAAM,IAAI,CAAC,IAAI,IAAG,EAAE;EACrC;EAMA,AAJI,EAAQ,EAAM,IAAO,CAAC,MAAM,IAAG,EAAK,GAAO,GAAM,CAAC,KACjD,EAAE,GAAG,EAAK,GAAO,GAAG,CAAK,IAE1B,KAAK,MAAG,IAAO,IAAI,IACnB,KAAK,MAAG,IAAQ,IAAI;CAC1B;CAEA,OAAO;AACT;AAEA,SAAS,EAAK,GAAO,GAAG,GAAG;CACzB,IAAM,IAAI,EAAM;CAEhB,AADA,EAAM,KAAK,EAAM,IACjB,EAAM,KAAK;AACb"}
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","names":[],"sources":["../../../../node_modules/d3-array/src/range.js"],"sourcesContent":["export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAM,GAAO,GAAM,GAAM;AAC/C,KAAQ,CAAC,GAAO,IAAO,CAAC,GAAM,KAAQ,IAAI,UAAU,UAAU,KAAK,IAAO,GAAO,IAAQ,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC;AAM9G,MAJA,IAAI,IAAI,IACJ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAO,KAAS,EAAK,CAAC,GAAG,GACpD,IAAY,MAAM,EAAE,EAEjB,EAAE,IAAI,GACX,GAAM,KAAK,IAAQ,IAAI;AAGzB,QAAO"}
1
+ {"version":3,"file":"range.js","names":[],"sources":["../../../../node_modules/d3-array/src/range.js"],"sourcesContent":["export default function range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAwB,EAAM,GAAO,GAAM,GAAM;CAC/C,IAAQ,CAAC,GAAO,IAAO,CAAC,GAAM,KAAQ,IAAI,UAAU,UAAU,KAAK,IAAO,GAAO,IAAQ,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC;CAM9G,KAJA,IAAI,IAAI,IACJ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAO,KAAS,CAAI,CAAC,IAAI,GACpD,IAAY,MAAM,CAAC,GAEhB,EAAE,IAAI,IACX,EAAM,KAAK,IAAQ,IAAI;CAGzB,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"sort.js","names":[],"sources":["../../../../node_modules/d3-array/src/sort.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n"],"x_google_ignoreList":[0],"mappings":";;AA0BA,SAAgB,EAAe,IAAU,GAAW;AAClD,KAAI,MAAY,EAAW,QAAO;AAClC,KAAI,OAAO,KAAY,WAAY,OAAU,UAAU,4BAA4B;AACnF,SAAQ,GAAG,MAAM;EACf,IAAM,IAAI,EAAQ,GAAG,EAAE;AAEvB,SADI,KAAK,MAAM,IAAU,KACjB,EAAQ,GAAG,EAAE,KAAK,MAAM,EAAQ,GAAG,EAAE,KAAK;;;AAItD,SAAgB,EAAiB,GAAG,GAAG;AACrC,SAAQ,KAAK,QAAQ,EAAE,KAAK,OAAO,KAAK,QAAQ,EAAE,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAI"}
1
+ {"version":3,"file":"sort.js","names":[],"sources":["../../../../node_modules/d3-array/src/sort.js"],"sourcesContent":["import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n"],"x_google_ignoreList":[0],"mappings":";;AA0BA,SAAgB,EAAe,IAAU,GAAW;CAClD,IAAI,MAAY,GAAW,OAAO;CAClC,IAAI,OAAO,KAAY,YAAY,MAAU,UAAU,2BAA2B;CAClF,QAAQ,GAAG,MAAM;EACf,IAAM,IAAI,EAAQ,GAAG,CAAC;EAEtB,OADI,KAAK,MAAM,IAAU,KACjB,EAAQ,GAAG,CAAC,MAAM,MAAM,EAAQ,GAAG,CAAC,MAAM;CACpD;AACF;AAEA,SAAgB,EAAiB,GAAG,GAAG;CACrC,QAAQ,KAAK,QAAQ,EAAE,KAAK,OAAO,KAAK,QAAQ,EAAE,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAI;AAClF"}