@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.
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/ecoimpacthub/EcoImpactHubRoot.js.map +1 -1
- package/dist/ecoimpacthub/EcoImpactHubRoutes.js.map +1 -1
- package/dist/ecoimpacthub/components/DataTable.js.map +1 -1
- package/dist/ecoimpacthub/components/EcoDiscussion.js.map +1 -1
- package/dist/ecoimpacthub/components/EcoTags.js.map +1 -1
- package/dist/ecoimpacthub/components/EmptyState.js.map +1 -1
- package/dist/ecoimpacthub/components/EvidenceUpload.js.map +1 -1
- package/dist/ecoimpacthub/components/FeatureFlagGate.js.map +1 -1
- package/dist/ecoimpacthub/components/FileLink.js.map +1 -1
- package/dist/ecoimpacthub/components/FilterTabs.js.map +1 -1
- package/dist/ecoimpacthub/components/MetricsCard.js.map +1 -1
- package/dist/ecoimpacthub/components/MiniBar.js.map +1 -1
- package/dist/ecoimpacthub/components/PageLayout.js.map +1 -1
- package/dist/ecoimpacthub/components/Pagination.js.map +1 -1
- package/dist/ecoimpacthub/components/StateViews.js.map +1 -1
- package/dist/ecoimpacthub/components/StatusBadge.d.ts.map +1 -1
- package/dist/ecoimpacthub/components/StatusBadge.js +3 -0
- package/dist/ecoimpacthub/components/StatusBadge.js.map +1 -1
- package/dist/ecoimpacthub/components/Tabs.js.map +1 -1
- package/dist/ecoimpacthub/context/EcoImpactHubContext.js.map +1 -1
- package/dist/ecoimpacthub/hooks/useCursorPager.js.map +1 -1
- package/dist/ecoimpacthub/hooks/useEcoComments.js.map +1 -1
- package/dist/ecoimpacthub/hooks/useEcoFiles.js.map +1 -1
- package/dist/ecoimpacthub/hooks/useEcoImpactHubApi.js.map +1 -1
- package/dist/ecoimpacthub/hooks/useEcoTags.js.map +1 -1
- package/dist/ecoimpacthub/pages/DashboardPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/_shared/ConservationBadge.js.map +1 -1
- package/dist/ecoimpacthub/pages/_shared/EvidenceThumb.js.map +1 -1
- package/dist/ecoimpacthub/pages/_shared/MethodBadge.js.map +1 -1
- package/dist/ecoimpacthub/pages/_shared/TaxonChip.js.map +1 -1
- package/dist/ecoimpacthub/pages/badges.js.map +1 -1
- package/dist/ecoimpacthub/pages/carbon/CarbonPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/carbonVisuals.js.map +1 -1
- package/dist/ecoimpacthub/pages/habitat/HabitatProjectDetailPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/habitat/HabitatProjectsPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/habitat/LifecycleProgress.js.map +1 -1
- package/dist/ecoimpacthub/pages/monitoring/MonitoringPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/observations/ObservationsPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/reports/ReportDetailPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/reports/ReportsPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/sites/SiteDetailPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/sites/SitesPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/sites/siteTypeVisuals.js.map +1 -1
- package/dist/ecoimpacthub/pages/species/SpeciesDetailPage.js.map +1 -1
- package/dist/ecoimpacthub/pages/species/SpeciesPage.js.map +1 -1
- package/dist/ecoimpacthub/services/createSandboxAssistantTransport.d.ts.map +1 -1
- package/dist/ecoimpacthub/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/ecoimpacthub/types/index.d.ts.map +1 -1
- package/dist/ecoimpacthub/utils/cn.js.map +1 -1
- package/dist/ecoimpacthub/utils/formatters.js.map +1 -1
- package/dist/ecoimpacthub/utils/navigation.js.map +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
- package/dist/node_modules/d3-array/src/ascending.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisect.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisector.js.map +1 -1
- package/dist/node_modules/d3-array/src/descending.js.map +1 -1
- package/dist/node_modules/d3-array/src/max.js.map +1 -1
- package/dist/node_modules/d3-array/src/min.js.map +1 -1
- package/dist/node_modules/d3-array/src/number.js.map +1 -1
- package/dist/node_modules/d3-array/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-array/src/quickselect.js.map +1 -1
- package/dist/node_modules/d3-array/src/range.js.map +1 -1
- package/dist/node_modules/d3-array/src/sort.js.map +1 -1
- package/dist/node_modules/d3-array/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-color/src/color.js.map +1 -1
- package/dist/node_modules/d3-color/src/define.js.map +1 -1
- package/dist/node_modules/d3-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-format/src/exponent.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatDecimal.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatGroup.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatNumerals.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatRounded.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatSpecifier.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTrim.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTypes.js.map +1 -1
- package/dist/node_modules/d3-format/src/identity.js.map +1 -1
- package/dist/node_modules/d3-format/src/locale.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionFixed.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionPrefix.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionRound.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/array.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basis.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/color.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/date.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/number.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/numberArray.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/object.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/piecewise.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/rgb.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/round.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/string.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/value.js.map +1 -1
- package/dist/node_modules/d3-path/src/path.js.map +1 -1
- package/dist/node_modules/d3-scale/src/band.js.map +1 -1
- package/dist/node_modules/d3-scale/src/constant.js.map +1 -1
- package/dist/node_modules/d3-scale/src/continuous.js.map +1 -1
- package/dist/node_modules/d3-scale/src/diverging.js.map +1 -1
- package/dist/node_modules/d3-scale/src/identity.js.map +1 -1
- package/dist/node_modules/d3-scale/src/init.js.map +1 -1
- package/dist/node_modules/d3-scale/src/linear.js.map +1 -1
- package/dist/node_modules/d3-scale/src/log.js.map +1 -1
- package/dist/node_modules/d3-scale/src/nice.js.map +1 -1
- package/dist/node_modules/d3-scale/src/number.js.map +1 -1
- package/dist/node_modules/d3-scale/src/ordinal.js.map +1 -1
- package/dist/node_modules/d3-scale/src/pow.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantize.js.map +1 -1
- package/dist/node_modules/d3-scale/src/radial.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequential.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/symlog.js.map +1 -1
- package/dist/node_modules/d3-scale/src/threshold.js.map +1 -1
- package/dist/node_modules/d3-scale/src/tickFormat.js.map +1 -1
- package/dist/node_modules/d3-scale/src/time.js.map +1 -1
- package/dist/node_modules/d3-scale/src/utcTime.js.map +1 -1
- package/dist/node_modules/d3-shape/src/area.js.map +1 -1
- package/dist/node_modules/d3-shape/src/array.js.map +1 -1
- package/dist/node_modules/d3-shape/src/constant.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basis.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/bump.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linear.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/monotone.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/natural.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/step.js.map +1 -1
- package/dist/node_modules/d3-shape/src/line.js.map +1 -1
- package/dist/node_modules/d3-shape/src/noop.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/expand.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/order/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/path.js.map +1 -1
- package/dist/node_modules/d3-shape/src/point.js.map +1 -1
- package/dist/node_modules/d3-shape/src/stack.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/circle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/cross.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/square.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/star.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/wye.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol.js.map +1 -1
- package/dist/node_modules/d3-time/src/day.js.map +1 -1
- package/dist/node_modules/d3-time/src/hour.js.map +1 -1
- package/dist/node_modules/d3-time/src/interval.js.map +1 -1
- package/dist/node_modules/d3-time/src/millisecond.js.map +1 -1
- package/dist/node_modules/d3-time/src/minute.js.map +1 -1
- package/dist/node_modules/d3-time/src/month.js.map +1 -1
- package/dist/node_modules/d3-time/src/second.js.map +1 -1
- package/dist/node_modules/d3-time/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-time/src/week.js.map +1 -1
- package/dist/node_modules/d3-time/src/year.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/locale.js.map +1 -1
- package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
- package/dist/node_modules/eventemitter3/index.js.map +1 -1
- package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
- package/dist/node_modules/internmap/src/index.js.map +1 -1
- package/dist/node_modules/lodash/_DataView.js.map +1 -1
- package/dist/node_modules/lodash/_Hash.js.map +1 -1
- package/dist/node_modules/lodash/_ListCache.js.map +1 -1
- package/dist/node_modules/lodash/_Map.js.map +1 -1
- package/dist/node_modules/lodash/_MapCache.js.map +1 -1
- package/dist/node_modules/lodash/_Promise.js.map +1 -1
- package/dist/node_modules/lodash/_Set.js.map +1 -1
- package/dist/node_modules/lodash/_SetCache.js.map +1 -1
- package/dist/node_modules/lodash/_Stack.js +2 -1
- package/dist/node_modules/lodash/_Stack.js.map +1 -1
- package/dist/node_modules/lodash/_Symbol.js.map +1 -1
- package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
- package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
- package/dist/node_modules/lodash/_apply.js.map +1 -1
- package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
- package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
- package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
- package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
- package/dist/node_modules/lodash/_arraySome.js.map +1 -1
- package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
- package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
- package/dist/node_modules/lodash/_baseEach.js.map +1 -1
- package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
- package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
- package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
- package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
- package/dist/node_modules/lodash/_baseFor.js.map +1 -1
- package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
- package/dist/node_modules/lodash/_baseGet.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
- package/dist/node_modules/lodash/_baseGt.js.map +1 -1
- package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
- package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
- package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseLt.js.map +1 -1
- package/dist/node_modules/lodash/_baseMap.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
- package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
- package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseRange.js.map +1 -1
- package/dist/node_modules/lodash/_baseRest.js.map +1 -1
- package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
- package/dist/node_modules/lodash/_baseSome.js.map +1 -1
- package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
- package/dist/node_modules/lodash/_baseToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
- package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
- package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
- package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_castPath.js.map +1 -1
- package/dist/node_modules/lodash/_castSlice.js.map +1 -1
- package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
- package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
- package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
- package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
- package/dist/node_modules/lodash/_createFind.js.map +1 -1
- package/dist/node_modules/lodash/_createRange.js.map +1 -1
- package/dist/node_modules/lodash/_createSet.js.map +1 -1
- package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
- package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
- package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
- package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
- package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
- package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_getMapData.js.map +1 -1
- package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
- package/dist/node_modules/lodash/_getNative.js.map +1 -1
- package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
- package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
- package/dist/node_modules/lodash/_getTag.js.map +1 -1
- package/dist/node_modules/lodash/_getValue.js.map +1 -1
- package/dist/node_modules/lodash/_hasPath.js.map +1 -1
- package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
- package/dist/node_modules/lodash/_hashClear.js.map +1 -1
- package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
- package/dist/node_modules/lodash/_hashGet.js.map +1 -1
- package/dist/node_modules/lodash/_hashHas.js.map +1 -1
- package/dist/node_modules/lodash/_hashSet.js.map +1 -1
- package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
- package/dist/node_modules/lodash/_isIndex.js.map +1 -1
- package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
- package/dist/node_modules/lodash/_isKey.js.map +1 -1
- package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
- package/dist/node_modules/lodash/_isMasked.js.map +1 -1
- package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
- package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
- package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
- package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
- package/dist/node_modules/lodash/_objectToString.js.map +1 -1
- package/dist/node_modules/lodash/_overArg.js.map +1 -1
- package/dist/node_modules/lodash/_overRest.js.map +1 -1
- package/dist/node_modules/lodash/_root.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_setToArray.js.map +1 -1
- package/dist/node_modules/lodash/_setToString.js.map +1 -1
- package/dist/node_modules/lodash/_shortOut.js.map +1 -1
- package/dist/node_modules/lodash/_stackClear.js.map +1 -1
- package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
- package/dist/node_modules/lodash/_stackGet.js.map +1 -1
- package/dist/node_modules/lodash/_stackHas.js.map +1 -1
- package/dist/node_modules/lodash/_stackSet.js.map +1 -1
- package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
- package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
- package/dist/node_modules/lodash/_toKey.js.map +1 -1
- package/dist/node_modules/lodash/_toSource.js.map +1 -1
- package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
- package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
- package/dist/node_modules/lodash/constant.js.map +1 -1
- package/dist/node_modules/lodash/debounce.js.map +1 -1
- package/dist/node_modules/lodash/eq.js.map +1 -1
- package/dist/node_modules/lodash/every.js.map +1 -1
- package/dist/node_modules/lodash/find.js.map +1 -1
- package/dist/node_modules/lodash/findIndex.js.map +1 -1
- package/dist/node_modules/lodash/flatMap.js.map +1 -1
- package/dist/node_modules/lodash/get.js.map +1 -1
- package/dist/node_modules/lodash/hasIn.js.map +1 -1
- package/dist/node_modules/lodash/identity.js.map +1 -1
- package/dist/node_modules/lodash/isArguments.js.map +1 -1
- package/dist/node_modules/lodash/isArray.js.map +1 -1
- package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
- package/dist/node_modules/lodash/isBoolean.js.map +1 -1
- package/dist/node_modules/lodash/isBuffer.js.map +1 -1
- package/dist/node_modules/lodash/isEqual.js.map +1 -1
- package/dist/node_modules/lodash/isFunction.js.map +1 -1
- package/dist/node_modules/lodash/isLength.js.map +1 -1
- package/dist/node_modules/lodash/isNaN.js.map +1 -1
- package/dist/node_modules/lodash/isNil.js.map +1 -1
- package/dist/node_modules/lodash/isNumber.js.map +1 -1
- package/dist/node_modules/lodash/isObject.js.map +1 -1
- package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
- package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
- package/dist/node_modules/lodash/isString.js.map +1 -1
- package/dist/node_modules/lodash/isSymbol.js.map +1 -1
- package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/keys.js.map +1 -1
- package/dist/node_modules/lodash/last.js.map +1 -1
- package/dist/node_modules/lodash/map.js.map +1 -1
- package/dist/node_modules/lodash/mapValues.js.map +1 -1
- package/dist/node_modules/lodash/max.js.map +1 -1
- package/dist/node_modules/lodash/memoize.js.map +1 -1
- package/dist/node_modules/lodash/min.js.map +1 -1
- package/dist/node_modules/lodash/noop.js.map +1 -1
- package/dist/node_modules/lodash/now.js.map +1 -1
- package/dist/node_modules/lodash/property.js.map +1 -1
- package/dist/node_modules/lodash/range.js.map +1 -1
- package/dist/node_modules/lodash/some.js.map +1 -1
- package/dist/node_modules/lodash/sortBy.js.map +1 -1
- package/dist/node_modules/lodash/stubArray.js.map +1 -1
- package/dist/node_modules/lodash/stubFalse.js.map +1 -1
- package/dist/node_modules/lodash/throttle.js.map +1 -1
- package/dist/node_modules/lodash/toFinite.js.map +1 -1
- package/dist/node_modules/lodash/toInteger.js.map +1 -1
- package/dist/node_modules/lodash/toNumber.js.map +1 -1
- package/dist/node_modules/lodash/toString.js.map +1 -1
- package/dist/node_modules/lodash/uniqBy.js.map +1 -1
- package/dist/node_modules/lodash/upperFirst.js.map +1 -1
- package/dist/node_modules/object-assign/index.js.map +1 -1
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
- package/dist/node_modules/prop-types/index.js.map +1 -1
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
- package/dist/node_modules/prop-types/lib/has.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/Animate.js +2 -2
- package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Bar.js +9 -9
- package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Brush.js +12 -12
- package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +7 -7
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +13 -13
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +22 -22
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +11 -11
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +6 -6
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Label.js +14 -14
- package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/LabelList.js +6 -6
- package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Legend.js +5 -5
- package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +3 -3
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Text.js +2 -2
- package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Tooltip.js +3 -3
- package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +2 -2
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Layer.js +2 -2
- package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Surface.js +2 -2
- package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +2 -2
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Rectangle.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +9 -9
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/types.js +1 -1
- package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
- package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
- 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;
|
|
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\
|
|
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;
|
|
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":";AAMA,SAAgB,EACd,GACA,GACQ;
|
|
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 +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,
|
|
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;
|
|
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;
|
|
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,
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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"}
|