From 08da5f8206c95804bb5002df9235998ca8dbf870 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 09:37:44 +0100
Subject: [PATCH 01/11] chore: update docusaurus
---
fdm-docs/docs/README.md | 31 +-
.../01-nitrogen-balance.md | 258 ++++
.../agronomic-calculations/01-nitrogen.md | 258 ++++
.../02-norms-and-regulations.md | 26 +
.../agronomic-calculations/_category_.json | 8 +
.../nl/2025/01-index.md | 39 +
.../nl/2025/_category_.json | 8 +
.../nl/2025/dierlijke-mest-gebruiksnorm.md | 72 +
.../nl/2025/fosfaatgebruiksnorm.md | 118 ++
.../nl/2025/stikstofgebruiksnorm.md | 107 ++
.../agronomic-calculations/nl/_category_.json | 4 +
fdm-docs/docs/contributing.md | 93 --
.../contributing/01-project-architecture.md | 26 +
.../02-setting-up-local-environment.md | 65 +
.../03-releasing-fdm.md} | 5 +
fdm-docs/docs/contributing/_category_.json | 8 +
.../core-concepts/01-asset-action-model.md | 44 -
.../{02-schema.md => 01-database-schema.md} | 18 +-
fdm-docs/docs/core-concepts/02-farms.md | 32 +
fdm-docs/docs/core-concepts/03-catalogues.md | 60 -
fdm-docs/docs/core-concepts/03-fields.md | 37 +
.../core-concepts/04-architecture-overview.md | 46 -
.../docs/core-concepts/04-cultivations.md | 34 +
.../docs/core-concepts/05-authorization.md | 82 --
.../{06-harvest.md => 05-harvests.md} | 10 +-
fdm-docs/docs/core-concepts/06-fertilizers.md | 31 +
.../docs/core-concepts/07-soil-analyses.md | 35 +
fdm-docs/docs/core-concepts/08-catalogues.md | 36 +
.../docs/core-concepts/09-authentication.md | 26 +
.../docs/core-concepts/10-authorization.md | 34 +
.../docs/core-concepts/11-organizations.md | 37 +
fdm-docs/docs/core-concepts/_category_.json | 12 +-
.../fdm-app/01-introduction-to-fdm-app.md | 60 +
fdm-docs/docs/fdm-app/_category_.json | 8 +
.../docs/getting-started/01-prerequisites.md | 13 -
.../docs/getting-started/01-what-is-fdm.md | 37 +
.../getting-started/02-setup-connection.md | 91 --
.../02-the-asset-action-model.md | 67 +
.../03-basic-usage-fdm-core.md | 103 --
.../getting-started/03-quick-start-guide.md | 127 ++
.../04-using-catalogues-fdm-data.md | 83 --
.../05-running-calculations-fdm-calculator.md | 68 -
fdm-docs/docs/getting-started/_category_.json | 12 +-
fdm-docs/docs/installation.md | 62 -
fdm-docs/docusaurus.config.ts | 14 +-
fdm-docs/package.json | 14 +-
fdm-docs/src/pages/index.tsx | 2 +-
pnpm-lock.yaml | 1291 ++++++++++++++---
48 files changed, 2745 insertions(+), 1007 deletions(-)
create mode 100644 fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md
create mode 100644 fdm-docs/docs/agronomic-calculations/01-nitrogen.md
create mode 100644 fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
create mode 100644 fdm-docs/docs/agronomic-calculations/_category_.json
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md
create mode 100644 fdm-docs/docs/agronomic-calculations/nl/_category_.json
delete mode 100644 fdm-docs/docs/contributing.md
create mode 100644 fdm-docs/docs/contributing/01-project-architecture.md
create mode 100644 fdm-docs/docs/contributing/02-setting-up-local-environment.md
rename fdm-docs/docs/{core-concepts/07-release.md => contributing/03-releasing-fdm.md} (98%)
create mode 100644 fdm-docs/docs/contributing/_category_.json
delete mode 100644 fdm-docs/docs/core-concepts/01-asset-action-model.md
rename fdm-docs/docs/core-concepts/{02-schema.md => 01-database-schema.md} (98%)
create mode 100644 fdm-docs/docs/core-concepts/02-farms.md
delete mode 100644 fdm-docs/docs/core-concepts/03-catalogues.md
create mode 100644 fdm-docs/docs/core-concepts/03-fields.md
delete mode 100644 fdm-docs/docs/core-concepts/04-architecture-overview.md
create mode 100644 fdm-docs/docs/core-concepts/04-cultivations.md
delete mode 100644 fdm-docs/docs/core-concepts/05-authorization.md
rename fdm-docs/docs/core-concepts/{06-harvest.md => 05-harvests.md} (91%)
create mode 100644 fdm-docs/docs/core-concepts/06-fertilizers.md
create mode 100644 fdm-docs/docs/core-concepts/07-soil-analyses.md
create mode 100644 fdm-docs/docs/core-concepts/08-catalogues.md
create mode 100644 fdm-docs/docs/core-concepts/09-authentication.md
create mode 100644 fdm-docs/docs/core-concepts/10-authorization.md
create mode 100644 fdm-docs/docs/core-concepts/11-organizations.md
create mode 100644 fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
create mode 100644 fdm-docs/docs/fdm-app/_category_.json
delete mode 100644 fdm-docs/docs/getting-started/01-prerequisites.md
create mode 100644 fdm-docs/docs/getting-started/01-what-is-fdm.md
delete mode 100644 fdm-docs/docs/getting-started/02-setup-connection.md
create mode 100644 fdm-docs/docs/getting-started/02-the-asset-action-model.md
delete mode 100644 fdm-docs/docs/getting-started/03-basic-usage-fdm-core.md
create mode 100644 fdm-docs/docs/getting-started/03-quick-start-guide.md
delete mode 100644 fdm-docs/docs/getting-started/04-using-catalogues-fdm-data.md
delete mode 100644 fdm-docs/docs/getting-started/05-running-calculations-fdm-calculator.md
delete mode 100644 fdm-docs/docs/installation.md
diff --git a/fdm-docs/docs/README.md b/fdm-docs/docs/README.md
index ca7ae8b73..000a2d95b 100644
--- a/fdm-docs/docs/README.md
+++ b/fdm-docs/docs/README.md
@@ -1,21 +1,28 @@
---
-sidebar_position: 1
-title: Introduction to FDM
+title: Introduction
+sidebar_position: 0
---
-The Farm Data Model (FDM) provides a robust and flexible framework for organizing and analyzing agricultural data. Designed with both developers and agronomists in mind, FDM-core offers a standardized schema for representing diverse farm information, enabling seamless data integration, analysis, and decision-making.
+# Welcome to the FDM Documentation
-FDM adopts an "Asset-Action" model as its core architectural principle. This model centers around two key concepts: Assets represent physical or conceptual entities within a farm, such as fields, crops, or equipment. Actions, on the other hand, represent operations or events related to these assets, such as planting, fertilizing, or harvesting. This clear separation allows for a granular understanding of farm activities and their impact on different assets.
+This documentation provides a comprehensive overview of the Farm Data Model (FDM). It is designed to help you understand the core concepts of the FDM, learn how to use it in your own applications, and contribute to its development.
-The FDM schema further structures data using a hierarchical approach. This allows for logical grouping and efficient querying. For example, a "field" asset might contain information about its boundaries and connects to various actions where it associated with. These associated actions, like "fertilizer application," include details like date, type of fertilizer, and application rate.
+## Getting Started
-This structured schema ensures data consistency and facilitates interoperability between different farm management systems. By adhering to the FDM schema, developers can build applications that seamlessly integrate with existing farm data, while agronomists can gain valuable insights from standardized data across multiple farms. FDM-core is designed for extensibility, allowing users to add custom attributes and actions to cater to specific needs while maintaining overall schema consistency. This balance of standardization and flexibility ensures FDM can adapt to the evolving needs of modern agriculture.
+If you are new to the FDM, we recommend that you start by reading the **[Getting Started](./getting-started/01-what-is-fdm.md)** section. This section provides a high-level overview of the FDM and walks you through the basics of using it in your own applications.
-Key benefits of using the FDM include:
+## Core Concepts
-* Improved Data Management: Standardizing data collection and storage through a well-defined schema simplifies data management and analysis.
-* Enhanced Interoperability: Facilitates data exchange between different systems and platforms, enabling a holistic view of farm operations.
-* Data-Driven Decision-Making: Provides a structured framework for analyzing farm data, enabling informed decisions related to resource allocation, crop management, and overall farm productivity.
-* Scalability and Extensibility: The FDM is designed to handle large datasets and can be extended to accommodate new data types and farm practices.
+The **[Core Concepts](./core-concepts/01-database-schema.md)** section provides a detailed explanation of the fundamental components of the FDM. This is the place to go if you want to understand the "what" and the "why" of each concept.
-This documentation site provides guides on core concepts, getting started with the FDM libraries, and contributing to the project. For detailed information on the functions and types exported by each package (`fdm-core`, `fdm-data`, `fdm-calculator`), please refer to the **API Reference** section. The **Architecture Overview** page in the Core Concepts section explains the different packages within the FDM monorepo and how they interact.
+## Agronomic Calculations
+
+The **[Agronomic Calculations](./agronomic-calculations/01-nitrogen-balance.md)** section is dedicated to explaining the powerful calculation engine within the FDM. Here you will find information on how to perform common agronomic calculations, such as nitrogen balance and fertilizer recommendations.
+
+## Contributing to FDM
+
+If you are a developer who wants to contribute to the FDM project, the **[Contributing to FDM](./contributing/01-project-architecture.md)** section is for you. Here you will find information on the project's architecture, how to set up a local development environment, and the release process.
+
+## FDM App
+
+The **[FDM App](./fdm-app/01-introduction-to-fdm-app.md)** section provides a brief introduction to the `fdm-app`, which is a practical, working example of an application that is built with the FDM.
diff --git a/fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md b/fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md
new file mode 100644
index 000000000..cef85a839
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md
@@ -0,0 +1,258 @@
+---
+title: Nitrogen Balance
+sidebar_label: Nitrogen Balance
+---
+
+# Nitrogen Balance Calculation
+
+This document explains how the nitrogen (N) balance is calculated within the FDM Calculator. The balance provides insights into nitrogen inputs, outputs, and potential surpluses or deficits on a per-field basis, which are then aggregated to the farm level. It serves as a critical tool for agronomists and farmers to optimize nutrient management, enhance crop productivity, and minimize environmental impacts.
+
+## 1. Overview
+
+Nitrogen is a macronutrient essential for plant growth, playing a vital role in photosynthesis, protein synthesis, and overall crop development. However, nitrogen is also highly dynamic in agricultural systems, subject to various inputs, outputs, and transformations. An accurate nitrogen balance helps in understanding the nitrogen cycle on a farm, identifying potential nutrient deficiencies or surpluses, and guiding sustainable fertilization practices.
+
+The final nitrogen balance for each field is determined by the formula:
+
+```text
+N Balance (kg N / ha) = N Supply - N Removal - N-NH3 Emission
+```
+
+Where:
+* **N Supply:** Nitrogen added to the field.
+* **N Removal:** Nitrogen taken off the field.
+* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
+
+(Note: In the calculation, N Removal and N-NH3 Emission are typically treated as negative values when summing components to derive the final balance.)
+
+The calculations are performed for a user-defined **Time Frame**.
+
+## 2. Required Input Data
+
+Accurate N balance calculation relies on comprehensive input data that captures the various aspects of farm management and environmental conditions influencing nitrogen dynamics.
+
+* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
+ * Unique ID, area (ha), centroid coordinates (for deposition).
+ * Start and end dates defining the field's existence (if different from the balance time frame).
+* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
+ * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
+ * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
+* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
+ * Links to the specific `b_lu` (cultivation instance).
+ * `harvestable_analyses` array containing:
+ * Yield of harvested product (`b_lu_yield`, kg / ha).
+ * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
+ * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
+* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
+ * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
+ * Key parameters used:
+ * Agricultural soil type (`b_soiltype_agr`).
+ * Total N content (`a_n_rt`, mg N / kg).
+ * Organic carbon (`a_c_of`, g C / kg).
+ * C / N ratio (`a_cn_fr`).
+ * Bulk density (`a_density_sa`, g / cm³).
+ * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
+ * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
+* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
+ * Application amount (`p_app_amount`, kg / ha).
+ * Link to fertilizer type via `p_id_catalogue`.
+* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
+ * `FertilizerCatalogue` (`FertilizerDetail`):
+ * Total N content (`p_n_rt`, g N / kg).
+ * Nitrate content (`p_no3_rt`, g N / kg)
+ * Ammonium content (`p_nh4_rt`, g N/ kg)
+ * Sulfur content (`p_s_rt`, g SO3 / kg)
+ * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
+ * `CultivationCatalogue` (`CultivationDetail`):
+ * Default yield (`b_lu_yield`, kg / ha).
+ * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
+ * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
+ * Harvest Index (`b_lu_hi`, fraction).
+ * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
+
+## 3. Calculation Components
+
+### 3.1. Nitrogen Supply (kg N / ha)
+
+Nitrogen supply encompasses all pathways by which nitrogen becomes available to the crop and the soil system. Understanding these inputs is crucial for optimizing nutrient management and ensuring adequate nitrogen for crop growth while minimizing environmental losses.
+
+Total N supply is the sum of N from fertilizers, biological fixation, atmospheric deposition, and soil mineralization.
+
+#### 3.1.1. Fertilizers
+
+Fertilizers are a primary and often controlled source of nitrogen input in agricultural systems, applied to meet specific crop nutrient demands. Different fertilizer types have varying nitrogen forms and release characteristics.
+* **Formula per application:**
+ `N_supplied (kg N / ha) = Amount_applied (kg / ha) * (Total_N_content (g N / kg) / 1000)`
+* Contributions are summed for each category:
+ * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
+ * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
+ * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
+ * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
+
+#### 3.1.2. Biological Fixation
+
+Biological nitrogen fixation is a natural process where atmospheric nitrogen (N2) is converted into plant-available forms (e.g., ammonia) by microorganisms, primarily symbiotic bacteria associated with leguminous crops (e.g., clover, beans, peas). This process significantly contributes to the nitrogen supply in agricultural ecosystems, reducing the need for mineral nitrogen fertilizers.
+* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
+* These values are summed if multiple N-fixing crops are involved.
+
+#### 3.1.3. Atmospheric Deposition
+
+Atmospheric deposition refers to the input of nitrogen compounds from the atmosphere to the Earth's surface. This occurs through both wet deposition (e.g., nitrogen dissolved in rain, snow) and dry deposition (e.g., gaseous ammonia, nitric acid vapor, particulate matter). These deposited nitrogen forms can be utilized by plants, thus contributing to the overall nitrogen supply in the field.
+* **Method:**
+ 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
+ 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
+ * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
+ 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
+ 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
+ `Deposition_period (kg N / ha) = Annual_Deposition (kg N / ha / year) * (Days_in_TimeFrame + 1) / 365`
+
+#### 3.1.4. Soil Mineralization
+
+Soil mineralization is a crucial biological process where organic nitrogen (N) compounds in soil organic matter (SOM) are converted by microorganisms into inorganic, plant-available forms, primarily ammonium (NH4+). This process can be a source of nitrogen for crops. The calculation of nitrogen mineralization is based on default values that depend on the soil type and land use (grassland or arable land).
+
+* **Method:**
+ 1. The calculation is performed for each year within the specified `TimeFrame`.
+ 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
+ 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
+
+| Soil Type (`b_soiltype_agr`) | Land Use | Annual N Mineralization (kg N / ha / year) |
+| :--- | :--- | :--- |
+| `dalgrond` | Arable or Grassland | 20 |
+| `veen` | Grassland | 160 |
+| `veen` | Arable Land | 20 |
+| Other | Arable or Grassland | 0 |
+
+ 4. The annual mineralization rate is then pro-rated for the number of days the field is active within the `TimeFrame` for that year:
+ `Mineralization_period (kg N / ha) = Annual_N_Min (kg N / ha / year) * Days_in_TimeFrame_for_the_year / 365`
+
+### 3.2. Nitrogen Removal (kg N / ha)
+
+Nitrogen removal accounts for the nitrogen that leaves the field system, primarily through the harvest of crops and the removal of crop residues. Quantifying these outputs is essential for understanding the net nitrogen balance and assessing nutrient cycling efficiency. These are calculated as negative values in the balance equation.
+
+#### 3.2.1. Harvested Products
+
+The harvest of crops is typically the largest pathway for nitrogen removal from agricultural fields. Nitrogen is assimilated by plants during growth and stored in various plant parts, including the economically valuable harvested portion (e.g., grain, tubers, forage).
+* **Formula per harvest:**
+ `N_removed (kg N / ha) = Yield (kg / ha) * N_Content_Harvestable (g N / kg) / 1000 * -1`
+* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
+* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
+
+#### 3.2.2. Crop Residues
+
+Crop residues (e.g., straw, stover, roots) contain significant amounts of nitrogen. Their management is crucial for the field's nitrogen balance. If residues are removed from the field (e.g., for animal feed, bedding, or bioenergy), the nitrogen contained within them is considered a removal from the field system. If residues are left on the field and incorporated into the soil, their nitrogen contributes to the soil organic matter pool and will be subject to mineralization.
+* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
+* **Residue Mass Estimation:**
+ 1. Average yield for the cultivation is determined (from actual harvests or catalogue default).
+ 2. Harvest Index (`b_lu_hi`) is from `CultivationCatalogue`. The Harvest Index is the ratio of harvested biomass to total above-ground biomass.
+ 3. Residue Proportion = `1 - b_lu_hi`. This represents the fraction of total above-ground biomass that remains as residue.
+ 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
+* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
+* **Formula per cultivation:**
+ `N_removed_residue (kg N / ha) = Residue_Mass (kg / ha) * N_Content_Residue (g N / kg) / 1000 * -1`
+
+### 3.3. Nitrogen Emission (kg N / ha)
+
+Nitrogen emission refers to the loss of nitrogen from the agricultural system to the wider environment. This includes losses to the atmosphere, such as ammonia (NH₃) volatilization, and losses to water, such as nitrate (NO₃⁻) leaching. Accurately quantifying these emissions is crucial for improving nitrogen use efficiency and minimizing environmental impacts like air and water pollution.
+
+The total N emission is the sum of all calculated emission pathways. Currently, this includes ammonia emissions from fertilizers and crop residues. In the future, this will be expanded to include nitrate leaching.
+
+The calculations for ammonia emissions are derived from the **NEMA model (Nutrient Emission Model for Agriculture)**, a Dutch model used to estimate nutrient losses from agricultural sources.
+
+#### 3.3.1. Nitrate Leaching (Future Implementation)
+
+Nitrate leaching represents the loss of nitrogen to water bodies. In the FDM Calculator, this will be calculated as a fraction of the **Nitrogen Balance**. The balance is defined as `N Supply - N Removal - Ammonia Emission`. This approach acknowledges that leaching is primarily driven by the excess nitrogen that remains in the soil after crop uptake.
+
+*Note: This component is not yet implemented and currently returns `0`.*
+
+#### 3.3.2. Ammonia from Fertilizers
+
+Ammonia emissions from fertilizers are calculated differently depending on the fertilizer type.
+
+* **Manure, Compost, and Other Organic Fertilizers:**
+ For these organic fertilizers, the emission is calculated based on the Total Ammoniacal Nitrogen (TAN) content, as this is the amount of nitrogen that is readily available for volatilization.
+
+ * **Formula:**
+ `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * TAN Content (g N / kg) / 1000 * Emission Factor (fraction)`
+ Where:
+ * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
+ * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
+ * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
+
+ * **Emission Factors for Manure and Compost:**
+
+ | Application Method | Grassland | Cropland | Bare Soil |
+ | :-------------------- | :-------- | :------- | :-------- |
+ | Broadcasting | 0.68 | N/A | 0.69 |
+ | Narrowband | 0.264 | 0.36 | 0.36 |
+ | Slotted Coulters | 0.217 | N/A | 0.30 |
+ | Shallow Injection | 0.17 | 0.24 | 0.25 |
+ | Incorporation | N/A | N/A | 0.22 |
+ | Incorporation 2 Tracks| N/A | N/A | 0.46 |
+
+ *Note: "N/A" indicates that the method is not typically used or supported for that land type in the calculation model, and will result in an error if attempted.*
+
+* **Mineral Fertilizers:**
+ For mineral fertilizers, the emission is calculated based on the **total nitrogen content (`p_n_rt`)** of the fertilizer and the **emission factor**.
+
+ * **Formula:**
+ `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
+ Where:
+ * `Application Amount`: `p_app_amount` (kg / ha).
+ * `Total N Content`: `p_n_rt` (fraction).
+ * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
+
+ `Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
+
+ Where:
+ * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
+ * `p_no3_rt`: Nitrate content.
+ * `p_nh4_rt`: Ammonium content (TAN).
+ * `p_s_rt`: Sulfur content.
+ * `K_1`, `K_2`, `K_3`: Empirical constants.
+ * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
+ * If no inhibitor: `K_1 = 7.021 * 10^-5`
+ * `K_2 = -4.308 * 10^-5`
+ * `K_3 = 2.498 * 10^-4`
+ *Note: Currently, the presence of an inhibitor (`p_inhibitor`) is hardcoded to `false` in the calculation.*
+
+
+
+#### 3.3.3. Ammonia from Crop Residues
+
+Ammonia emissions from crop residues occur when residues are left on the field and decompose, releasing nitrogen compounds that can volatilize. The calculation of these emissions is based on the amount of nitrogen in the crop residues and a specific emission factor.
+
+* **Formula per cultivation:**
+ `NH3 Emission (kg N / ha) = Residue N Content (kg N / ha) * Emission Factor (fraction)`
+ Where:
+ * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
+ * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
+
+ * **Emission Factor Formula:**
+ `Emission Factor = (0.41 * b_lu_n_residue (g/kg dry matter)) - 5.42`
+ Where:
+ * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
+
+*Note: Ammonia emissions from crop residues are only calculated if the `m_cropresidue` flag is `false` or `null`, indicating that residues are incorporated into the soil rather than removed.*
+
+#### 3.3.4. Ammonia from Grazing
+
+Ammonia emissions from grazing are currently not calculated in the FDM Calculator and are set to `0`.
+
+## 4. Field and Farm Level Balance
+
+* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
+* **Farm Balance:**
+ 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
+ 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
+
+## 5. Output
+
+The final output (`NitrogenBalanceNumeric`) provides:
+* Overall farm balance, supply, removal, and total emission (kg N / ha).
+* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
+ * Field ID.
+ * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
+ * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
+ * Detailed breakdown of removal (total, harvests, residues).
+ * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
+
+All values are rounded numbers.
diff --git a/fdm-docs/docs/agronomic-calculations/01-nitrogen.md b/fdm-docs/docs/agronomic-calculations/01-nitrogen.md
new file mode 100644
index 000000000..cde60305a
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/01-nitrogen.md
@@ -0,0 +1,258 @@
+---
+title: Nitrogen Balance Calculation
+sidebar_label: Nitrogen
+---
+
+# Nitrogen Balance Calculation
+
+This document explains how the nitrogen (N) balance is calculated within the FDM Calculator. The balance provides insights into nitrogen inputs, outputs, and potential surpluses or deficits on a per-field basis, which are then aggregated to the farm level. It serves as a critical tool for agronomists and farmers to optimize nutrient management, enhance crop productivity, and minimize environmental impacts.
+
+## 1. Overview
+
+Nitrogen is a macronutrient essential for plant growth, playing a vital role in photosynthesis, protein synthesis, and overall crop development. However, nitrogen is also highly dynamic in agricultural systems, subject to various inputs, outputs, and transformations. An accurate nitrogen balance helps in understanding the nitrogen cycle on a farm, identifying potential nutrient deficiencies or surpluses, and guiding sustainable fertilization practices.
+
+The final nitrogen balance for each field is determined by the formula:
+
+```text
+N Balance (kg N / ha) = N Supply - N Removal - N-NH3 Emission
+```
+
+Where:
+* **N Supply:** Nitrogen added to the field.
+* **N Removal:** Nitrogen taken off the field.
+* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
+
+(Note: In the calculation, N Removal and N-NH3 Emission are typically treated as negative values when summing components to derive the final balance.)
+
+The calculations are performed for a user-defined **Time Frame**.
+
+## 2. Required Input Data
+
+Accurate N balance calculation relies on comprehensive input data that captures the various aspects of farm management and environmental conditions influencing nitrogen dynamics.
+
+* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
+ * Unique ID, area (ha), centroid coordinates (for deposition).
+ * Start and end dates defining the field's existence (if different from the balance time frame).
+* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
+ * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
+ * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
+* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
+ * Links to the specific `b_lu` (cultivation instance).
+ * `harvestable_analyses` array containing:
+ * Yield of harvested product (`b_lu_yield`, kg / ha).
+ * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
+ * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
+* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
+ * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
+ * Key parameters used:
+ * Agricultural soil type (`b_soiltype_agr`).
+ * Total N content (`a_n_rt`, mg N / kg).
+ * Organic carbon (`a_c_of`, g C / kg).
+ * C / N ratio (`a_cn_fr`).
+ * Bulk density (`a_density_sa`, g / cm³).
+ * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
+ * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
+* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
+ * Application amount (`p_app_amount`, kg / ha).
+ * Link to fertilizer type via `p_id_catalogue`.
+* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
+ * `FertilizerCatalogue` (`FertilizerDetail`):
+ * Total N content (`p_n_rt`, g N / kg).
+ * Nitrate content (`p_no3_rt`, g N / kg)
+ * Ammonium content (`p_nh4_rt`, g N/ kg)
+ * Sulfur content (`p_s_rt`, g SO3 / kg)
+ * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
+ * `CultivationCatalogue` (`CultivationDetail`):
+ * Default yield (`b_lu_yield`, kg / ha).
+ * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
+ * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
+ * Harvest Index (`b_lu_hi`, fraction).
+ * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
+
+## 3. Calculation Components
+
+### 3.1. Nitrogen Supply (kg N / ha)
+
+Nitrogen supply encompasses all pathways by which nitrogen becomes available to the crop and the soil system. Understanding these inputs is crucial for optimizing nutrient management and ensuring adequate nitrogen for crop growth while minimizing environmental losses.
+
+Total N supply is the sum of N from fertilizers, biological fixation, atmospheric deposition, and soil mineralization.
+
+#### 3.1.1. Fertilizers
+
+Fertilizers are a primary and often controlled source of nitrogen input in agricultural systems, applied to meet specific crop nutrient demands. Different fertilizer types have varying nitrogen forms and release characteristics.
+* **Formula per application:**
+ `N_supplied (kg N / ha) = Amount_applied (kg / ha) * (Total_N_content (g N / kg) / 1000)`
+* Contributions are summed for each category:
+ * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
+ * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
+ * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
+ * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
+
+#### 3.1.2. Biological Fixation
+
+Biological nitrogen fixation is a natural process where atmospheric nitrogen (N2) is converted into plant-available forms (e.g., ammonia) by microorganisms, primarily symbiotic bacteria associated with leguminous crops (e.g., clover, beans, peas). This process significantly contributes to the nitrogen supply in agricultural ecosystems, reducing the need for mineral nitrogen fertilizers.
+* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
+* These values are summed if multiple N-fixing crops are involved.
+
+#### 3.1.3. Atmospheric Deposition
+
+Atmospheric deposition refers to the input of nitrogen compounds from the atmosphere to the Earth's surface. This occurs through both wet deposition (e.g., nitrogen dissolved in rain, snow) and dry deposition (e.g., gaseous ammonia, nitric acid vapor, particulate matter). These deposited nitrogen forms can be utilized by plants, thus contributing to the overall nitrogen supply in the field.
+* **Method:**
+ 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
+ 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
+ * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
+ 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
+ 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
+ `Deposition_period (kg N / ha) = Annual_Deposition (kg N / ha / year) * (Days_in_TimeFrame + 1) / 365`
+
+#### 3.1.4. Soil Mineralization
+
+Soil mineralization is a crucial biological process where organic nitrogen (N) compounds in soil organic matter (SOM) are converted by microorganisms into inorganic, plant-available forms, primarily ammonium (NH4+). This process can be a source of nitrogen for crops. The calculation of nitrogen mineralization is based on default values that depend on the soil type and land use (grassland or arable land).
+
+* **Method:**
+ 1. The calculation is performed for each year within the specified `TimeFrame`.
+ 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
+ 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
+
+| Soil Type (`b_soiltype_agr`) | Land Use | Annual N Mineralization (kg N / ha / year) |
+| :--- | :--- | :--- |
+| `dalgrond` | Arable or Grassland | 20 |
+| `veen` | Grassland | 160 |
+| `veen` | Arable Land | 20 |
+| Other | Arable or Grassland | 0 |
+
+ 4. The annual mineralization rate is then pro-rated for the number of days the field is active within the `TimeFrame` for that year:
+ `Mineralization_period (kg N / ha) = Annual_N_Min (kg N / ha / year) * Days_in_TimeFrame_for_the_year / 365`
+
+### 3.2. Nitrogen Removal (kg N / ha)
+
+Nitrogen removal accounts for the nitrogen that leaves the field system, primarily through the harvest of crops and the removal of crop residues. Quantifying these outputs is essential for understanding the net nitrogen balance and assessing nutrient cycling efficiency. These are calculated as negative values in the balance equation.
+
+#### 3.2.1. Harvested Products
+
+The harvest of crops is typically the largest pathway for nitrogen removal from agricultural fields. Nitrogen is assimilated by plants during growth and stored in various plant parts, including the economically valuable harvested portion (e.g., grain, tubers, forage).
+* **Formula per harvest:**
+ `N_removed (kg N / ha) = Yield (kg / ha) * N_Content_Harvestable (g N / kg) / 1000 * -1`
+* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
+* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
+
+#### 3.2.2. Crop Residues
+
+Crop residues (e.g., straw, stover, roots) contain significant amounts of nitrogen. Their management is crucial for the field's nitrogen balance. If residues are removed from the field (e.g., for animal feed, bedding, or bioenergy), the nitrogen contained within them is considered a removal from the field system. If residues are left on the field and incorporated into the soil, their nitrogen contributes to the soil organic matter pool and will be subject to mineralization.
+* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
+* **Residue Mass Estimation:**
+ 1. Average yield for the cultivation is determined (from actual harvests or catalogue default).
+ 2. Harvest Index (`b_lu_hi`) is from `CultivationCatalogue`. The Harvest Index is the ratio of harvested biomass to total above-ground biomass.
+ 3. Residue Proportion = `1 - b_lu_hi`. This represents the fraction of total above-ground biomass that remains as residue.
+ 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
+* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
+* **Formula per cultivation:**
+ `N_removed_residue (kg N / ha) = Residue_Mass (kg / ha) * N_Content_Residue (g N / kg) / 1000 * -1`
+
+### 3.3. Nitrogen Emission (kg N / ha)
+
+Nitrogen emission refers to the loss of nitrogen from the agricultural system to the wider environment. This includes losses to the atmosphere, such as ammonia (NH₃) volatilization, and losses to water, such as nitrate (NO₃⁻) leaching. Accurately quantifying these emissions is crucial for improving nitrogen use efficiency and minimizing environmental impacts like air and water pollution.
+
+The total N emission is the sum of all calculated emission pathways. Currently, this includes ammonia emissions from fertilizers and crop residues. In the future, this will be expanded to include nitrate leaching.
+
+The calculations for ammonia emissions are derived from the **NEMA model (Nutrient Emission Model for Agriculture)**, a Dutch model used to estimate nutrient losses from agricultural sources.
+
+#### 3.3.1. Nitrate Leaching (Future Implementation)
+
+Nitrate leaching represents the loss of nitrogen to water bodies. In the FDM Calculator, this will be calculated as a fraction of the **Nitrogen Balance**. The balance is defined as `N Supply - N Removal - Ammonia Emission`. This approach acknowledges that leaching is primarily driven by the excess nitrogen that remains in the soil after crop uptake.
+
+*Note: This component is not yet implemented and currently returns `0`.*
+
+#### 3.3.2. Ammonia from Fertilizers
+
+Ammonia emissions from fertilizers are calculated differently depending on the fertilizer type.
+
+* **Manure, Compost, and Other Organic Fertilizers:**
+ For these organic fertilizers, the emission is calculated based on the Total Ammoniacal Nitrogen (TAN) content, as this is the amount of nitrogen that is readily available for volatilization.
+
+ * **Formula:**
+ `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * TAN Content (g N / kg) / 1000 * Emission Factor (fraction)`
+ Where:
+ * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
+ * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
+ * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
+
+ * **Emission Factors for Manure and Compost:**
+
+ | Application Method | Grassland | Cropland | Bare Soil |
+ | :-------------------- | :-------- | :------- | :-------- |
+ | Broadcasting | 0.68 | N/A | 0.69 |
+ | Narrowband | 0.264 | 0.36 | 0.36 |
+ | Slotted Coulters | 0.217 | N/A | 0.30 |
+ | Shallow Injection | 0.17 | 0.24 | 0.25 |
+ | Incorporation | N/A | N/A | 0.22 |
+ | Incorporation 2 Tracks| N/A | N/A | 0.46 |
+
+ *Note: "N/A" indicates that the method is not typically used or supported for that land type in the calculation model, and will result in an error if attempted.*
+
+* **Mineral Fertilizers:**
+ For mineral fertilizers, the emission is calculated based on the **total nitrogen content (`p_n_rt`)** of the fertilizer and the **emission factor**.
+
+ * **Formula:**
+ `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
+ Where:
+ * `Application Amount`: `p_app_amount` (kg / ha).
+ * `Total N Content`: `p_n_rt` (fraction).
+ * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
+
+ `Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
+
+ Where:
+ * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
+ * `p_no3_rt`: Nitrate content.
+ * `p_nh4_rt`: Ammonium content (TAN).
+ * `p_s_rt`: Sulfur content.
+ * `K_1`, `K_2`, `K_3`: Empirical constants.
+ * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
+ * If no inhibitor: `K_1 = 7.021 * 10^-5`
+ * `K_2 = -4.308 * 10^-5`
+ * `K_3 = 2.498 * 10^-4`
+ *Note: Currently, the presence of an inhibitor (`p_inhibitor`) is hardcoded to `false` in the calculation.*
+
+
+
+#### 3.3.3. Ammonia from Crop Residues
+
+Ammonia emissions from crop residues occur when residues are left on the field and decompose, releasing nitrogen compounds that can volatilize. The calculation of these emissions is based on the amount of nitrogen in the crop residues and a specific emission factor.
+
+* **Formula per cultivation:**
+ `NH3 Emission (kg N / ha) = Residue N Content (kg N / ha) * Emission Factor (fraction)`
+ Where:
+ * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
+ * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
+
+ * **Emission Factor Formula:**
+ `Emission Factor = (0.41 * b_lu_n_residue (g/kg dry matter)) - 5.42`
+ Where:
+ * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
+
+*Note: Ammonia emissions from crop residues are only calculated if the `m_cropresidue` flag is `false` or `null`, indicating that residues are incorporated into the soil rather than removed.*
+
+#### 3.3.4. Ammonia from Grazing
+
+Ammonia emissions from grazing are currently not calculated in the FDM Calculator and are set to `0`.
+
+## 4. Field and Farm Level Balance
+
+* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
+* **Farm Balance:**
+ 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
+ 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
+
+## 5. Output
+
+The final output (`NitrogenBalanceNumeric`) provides:
+* Overall farm balance, supply, removal, and total emission (kg N / ha).
+* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
+ * Field ID.
+ * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
+ * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
+ * Detailed breakdown of removal (total, harvests, residues).
+ * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
+
+All values are rounded numbers.
diff --git a/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md b/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
new file mode 100644
index 000000000..2d55d5e38
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
@@ -0,0 +1,26 @@
+---
+title: Norms and Regulations
+sidebar_label: Norms and Regulations
+---
+
+# Norms and Regulations
+
+The `fdm-calculator` is not only a tool for agronomic calculations, but also a powerful engine for ensuring compliance with legal and regional norms. This is particularly important for nutrient management, where regulations are often in place to protect the environment.
+
+## Implementation of Norms
+
+Norms and regulations are implemented in the `fdm-calculator` as a series of checks and constraints that are applied to the input data. For example, when calculating fertilizer recommendations, the calculator will take into account the legal limits for nutrient application in specific regions, such as Nitrate Vulnerable Zones (NVZs).
+
+The calculator includes a detailed implementation of the Dutch nutrient management regulations for 2025. This includes the following usage norms (`gebruiksnormen`):
+
+* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./nl/2025/stikstofgebruiksnorm.md):** This norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation takes into account the main crop, the geographical location (including `NV-gebieden`), and the soil region.
+* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./nl/2025/fosfaatgebruiksnorm.md):** This norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. The maximum is determined by the land use type (grassland or arable land) and the phosphate status of the soil.
+* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./nl/2025/dierlijke-mest-gebruiksnorm.md):** This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
+
+For more detailed information on these norms, please refer to the specific pages for each one.
+
+## Customization
+
+The `fdm-calculator` is designed to be flexible and customizable. You can define your own sets of norms and regulations to meet the specific requirements of your region or certification scheme.
+
+This is done by providing a custom configuration file that specifies the limits and constraints for different nutrients and regions.
diff --git a/fdm-docs/docs/agronomic-calculations/_category_.json b/fdm-docs/docs/agronomic-calculations/_category_.json
new file mode 100644
index 000000000..9e0ed94e5
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "Agronomic Calculations (`fdm-calculator`)",
+ "position": 3,
+ "link": {
+ "type": "generated-index",
+ "description": "This section is dedicated to explaining the powerful calculation engine within FDM."
+ }
+}
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md b/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
new file mode 100644
index 000000000..91653fba7
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
@@ -0,0 +1,39 @@
+---
+title: 2025 Dutch Fertilizer Application Norms
+sidebar_label: "Introduction"
+position: 1
+---
+
+# Calculating the 2025 Dutch Fertilizer Application Norms
+
+This guide explains how the FDM Calculator determines the official Dutch legal usage norms (`gebruiksnormen`) for nitrogen and phosphate for the year 2025. These calculations are essential for ensuring your farm management plan complies with national environmental regulations.
+
+The FDM Calculator automates these complex calculations based on your specific farm, field, and cultivation data. It calculates three key norms:
+
+1. **Nitrogen Usage Norm (`Stikstofgebruiksnorm`)**: The maximum effective nitrogen from all fertilizers.
+2. **Phosphate Usage Norm (`Fosfaatgebruiksnorm`)**: The maximum phosphate, based on your soil's phosphate status.
+3. **Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)**: The maximum nitrogen from animal manure, with specific rules for derogation farms.
+
+:::danger Official Source & Disclaimer
+The calculations in this document are based on the official 2025 norms published by the RVO (Rijksdienst voor Ondernemend Nederland). While we strive for accuracy, this document is for informational purposes only.
+
+Always consult your agricultural advisor for definitive guidance and values tailored to your specific situation. FDM is not liable for any discrepancies or decisions made based on this information.
+:::
+
+## How the Calculator Works: Required Data
+
+To calculate the norms for a specific field, the FDM Calculator requires the following information for the 2025 calendar year.
+
+* **Farm Details**:
+ * **Derogation Status**: Does the farm have a derogation permit for 2025? This is a critical factor for nitrogen and animal manure norms.
+
+* **Field & Location**:
+ * **Field Location**: The precise geographical coordinates of the field are used to determine if it falls within special regulatory zones, such as Nutrient-Polluted Areas (`NV-gebieden`), Groundwater Protection Areas (`GWBG-gebieden`), or specific soil regions (sand, clay, peat, loess).
+
+* **Cultivation Plan for 2025**:
+ * **Main Crop (`hoofdteelt`)**: The primary crop grown on the field. The calculator identifies the main crop as the one with the longest cultivation period between May 15th and July 15th.
+ * **Crop Variety**: For certain crops like potatoes and flowers, the specific variety can result in a higher or lower nitrogen norm.
+ * **Cultivation Dates**: The start and end dates of cultivation are crucial for time-sensitive norms, such as those for temporary grassland.
+
+* **Latest Soil Analysis Data**:
+ * **Phosphate Levels**: The P-CaCl2 (or P-PAE) and P-Al values from your most recent soil test are used to classify the soil's phosphate status, which directly determines the phosphate usage norm.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json b/fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json
new file mode 100644
index 000000000..a24f609d3
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "2025",
+ "position": 1,
+ "link": {
+ "type": "generated-index",
+ "description": "Learn more about the 2025 Dutch Fertilizer Application Norms."
+ }
+}
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md b/fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md
new file mode 100644
index 000000000..0d89a01fa
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md
@@ -0,0 +1,72 @@
+---
+title: Dierlijke Mest Gebruiksnorm 2025
+sidebar_label: "Dierlijke Mest Gebruiksnorm"
+---
+
+# Dierlijke Mest Gebruiksnorm 2025
+
+This document explains how the FDM Calculator determines the official Dutch legal usage norm (`gebruiksnorm`) for nitrogen from animal manure and how the applied animal manure counts towards this norm (the `filling`). It also covers the derogation regulations for 2025.
+
+---
+
+## Calculating the Gebruiksnorm (Usage Norm)
+
+### How the Norm Works
+
+This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
+
+#### Standard Norm (No Derogation):
+
+If the farm does **not** have a derogation permit, the standard norm is **170 kg N/ha**.
+
+#### Derogation Norms for 2025:
+
+Derogation is a temporary exception that allows farms with at least 80% grassland to use more nitrogen from grazing animal manure. However, derogation is being phased out, and the norms for 2025 are as follows:
+
+1. **Derogation-Free Zones**:
+ * If a field is in a **derogation-free zone** (`derogatievrije zone`) around a Natura 2000 area, the standard norm of **170 kg N/ha** applies, even with a derogation permit.
+
+2. **Nutrient-Polluted and Groundwater Protection Areas**:
+ * If a field is in a **Nutrient-Polluted Area (`NV-gebied`)** or a **Groundwater Protection Area (`GWBG-gebied`)**, the derogation norm is **190 kg N/ha**.
+
+3. **Other Areas**:
+ * For all other fields, the derogation norm is **200 kg N/ha**.
+
+### How the FDM Calculator Determines the Norm
+
+The `fdm-calculator` uses the `calculateAnimalManureUsageNorm` function in `fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.ts`. This function takes the farm's derogation status and the field's geographical context as input to apply the correct norm.
+
+---
+
+## Calculating the Opvulling (Filling)
+
+### How the Filling Works
+
+The filling for the animal manure usage norm is based on the **total nitrogen** from all applied animal manures. Unlike the nitrogen usage norm, no efficiency coefficients are applied here; the total nitrogen content of the manure counts.
+
+#### Calculation Formula:
+
+`Total Nitrogen (kg N) = Applied Amount (ton) × Total Nitrogen Content (kg N/ton)`
+
+#### Forfaitair Nitrogen Content (`Forfaitaire Stikstofgehalten`):
+
+The forfaitair nitrogen content per ton of manure is determined by the animal species, category, and manure type, as specified in RVO Tabel 11. This table provides standard values for various manure codes (`mestcodes`).
+
+**Example from RVO Tabel 11**:
+
+| Diersoort (Animal Species) | Omschrijving (Description) | Mestcode | Kg stikstof per ton | Kg fosfaat per ton |
+| :------------------------ | :------------------------- | :------- | :------------------ | :----------------- |
+| Rundvee (Cattle) | Vaste mest (Solid manure) | 10 | 6.4 | 3.2 |
+| Rundvee | Drijfmest (Slurry) | 17 | 4.0 | 1.3 |
+| Varkens (Pigs) | Drijfmest vleesvarkens | 46 | 6.4 | 2.4 |
+| Kippen (Chickens) | Mestband (Belt manure) | 32 | 26.0 | 3.8 |
+
+### How the FDM Calculator Determines the Filling
+
+The `fdm-calculator` uses the `calculateAnimalManureFilling` function in `fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts`. This function relies on:
+
+* The applied amount of animal manure.
+* The manure code (`mestcode`) of the applied manure.
+* The forfaitair nitrogen values from `fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts`, which implements RVO Tabel 11.
+
+If a specific analysis value for the nitrogen content is known, it will be used; otherwise, the forfaitair content is applied.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md b/fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md
new file mode 100644
index 000000000..d788334f0
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md
@@ -0,0 +1,118 @@
+---
+title: Fosfaatgebruiksnorm 2025
+sidebar_label: "Fosfaatgebruiksnorm"
+---
+
+# Fosfaatgebruiksnorm 2025
+
+This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for phosphate in 2025. It covers how the norm is calculated and how the amount of applied phosphate counts towards this norm (`opvulling`), with a special focus on the regulations for organic-rich fertilizers as introduced in the 7th Action Programme Nitraatrichtlijn.
+
+---
+
+## Calculating the Gebruiksnorm (Usage Norm)
+
+### How the Norm Works
+
+The phosphate usage norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. This maximum is determined by two key factors: the **land use type** and the **phosphate status of the soil**.
+
+The process involves three steps:
+
+1. **Determine Land Type**: First, the land is classified as either **`grasland`** (grassland) or **`bouwland`** (arable land) based on the main crop.
+2. **Determine Phosphate Class**: Based on a recent soil analysis (using P-CaCl₂ and P-Al values), the soil is assigned a phosphate class. The classes range from `Arm` (Poor) to `Hoog` (High). The specific thresholds for each class differ for grassland and arable land.
+3. **Look Up the Final Norm**: The combination of land type and phosphate class determines the final usage norm, as shown in the official table below.
+
+| Klasse | Grasland (kg P₂O₅/ha) | Bouwland (kg P₂O₅/ha) |
+| :------- | :-------------------- | :-------------------- |
+| Arm | 120 | 120 |
+| Laag | 105 | 80 |
+| Neutraal | 95 | 70 |
+| Ruim | 90 | 60 |
+| Hoog | 75 | 40 |
+
+The result of this calculation is the maximum allowable phosphate application for the parcel.
+
+### How the FDM Calculator Determines the Norm
+
+The `fdm-calculator` uses the `calculatePhosphateUsageNorm` function, located in `fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.ts`.
+
+This function requires the following inputs, defined in `input.ts`:
+* **Main Crop**: To determine if the land is `grasland` or `bouwland`.
+* **Soil Analysis Data**: The latest P-CaCl₂ and P-Al values.
+
+The core logic uses `fosfaatgebruiksnorm-data.ts`, which contains the official thresholds for phosphate classes and the corresponding norm values for both grassland and arable land.
+
+---
+
+## Calculating the Opvulling (Filling)
+
+### How the Filling Works
+
+The "filling" (`opvulling`) refers to how much of the applied phosphate counts towards the usage norm. While most fertilizers count for 100% of their phosphate content, the Dutch government encourages the use of **organic-rich fertilizers** (`Organische Stofrijke meststoffen`) to improve soil quality. To stimulate their use, these fertilizers count for a lower percentage of their phosphate content.
+
+#### Differentiated Percentages for Organic-Rich Fertilizers:
+
+The phosphate in qualifying organic-rich fertilizers counts towards the usage norm according to the following differentiated percentages:
+
+* **25% of phosphate counts for:**
+ * GFT-compost
+ * Groencompost (Green compost)
+
+* **75% of phosphate counts for:**
+ * Vaste strorijke mest van rundvee (Straw-rich solid manure from cattle)
+ * Vaste strorijke mest van varkens (only for organic farms) (Straw-rich solid manure)
+ * Vaste strorijke mest van schapen (Straw-rich solid manure from sheep)
+ * Vaste strorijke mest van geiten (Straw-rich solid manure from goats)
+ * Vaste strorijke mest van paarden (Straw-rich solid manure from horses)
+ * Champost
+
+* **100% of phosphate counts for:**
+ * All other fertilizers, including mineral fertilizers and other organic fertilizers not listed above.
+
+#### Conditions for Differentiated Percentages:
+
+To use these lower percentages, two important conditions must be met:
+
+1. **Minimum Application**: At least **20 kg P₂O₅ per hectare** of a specific organic-rich fertilizer must be applied. This ensures the application is substantial enough to contribute to soil improvement.
+2. **Maximum for Differentiated Calculation**: The differentiated percentage (25% or 75%) applies only to the amount of phosphate **up to the parcel's maximum usage norm**. If you apply more phosphate from an organic-rich source than the norm allows, the excess amount counts for **100%**.
+
+#### Calculation Examples:
+
+**Example 1: Standard Application**
+* **Parcel**: Arable land, phosphate status `Ruim`.
+* **Norm**: 60 kg P₂O₅/ha.
+* **Application**: 10 tons/ha of straw-rich cattle manure (forfaitair: 3.2 kg P₂O₅/ton).
+
+1. **Total Phosphate Applied**: `10 ton/ha × 3.2 kg P₂O₅/ton = 32 kg P₂O₅/ha`.
+2. **Check Conditions**:
+ * The applied amount (32 kg) is > 20 kg (minimum met).
+ * The applied amount (32 kg) is < 60 kg (norm).
+ * The 75% rule applies.
+3. **Calculate Filling**: `32 kg P₂O₅/ha × 75% = 24 kg P₂O₅/ha`.
+ * **Result**: Only **24 kg** counts towards the 60 kg norm, leaving **36 kg** of usage room.
+
+**Example 2: High Application of Compost**
+* **Parcel**: Grassland, phosphate status `Arm`.
+* **Norm**: 120 kg P₂O₅/ha.
+* **Application**: 210 kg P₂O₅/ha from green compost.
+
+1. **Check Conditions**:
+ * The applied amount (210 kg) is > 20 kg (minimum met).
+ * The differentiated percentage of 25% applies up to the norm of 120 kg.
+2. **Calculate Filling**:
+ * **Part 1 (up to the norm)**: `120 kg P₂O₅/ha × 25% = 30 kg P₂O₅/ha`.
+ * **Part 2 (above the norm)**: The remaining phosphate is `210 kg - 120 kg = 90 kg`. This amount counts for 100%.
+ * **Total Filling**: `30 kg + 90 kg = 120 kg P₂O₅/ha`.
+ * **Result**: The total filling is **120 kg**, which meets the 120 kg norm exactly.
+
+### How the FDM Calculator Determines the Filling
+
+The `fdm-calculator` uses the `calculatePhosphateFilling` function, located in `fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts`.
+
+This function processes a list of fertilizer applications and implements the following logic:
+1. It identifies which fertilizers are classified as organic-rich and determines their applicable percentage (25% or 75%).
+2. For each application of an organic-rich fertilizer, it checks if the **20 kg P₂O₅/ha minimum** is met.
+3. It calculates the filling by applying the differentiated percentage to the phosphate amount that falls **within the usage norm**.
+4. Any phosphate from an organic-rich fertilizer applied **above the usage norm** is counted at 100%.
+5. All other fertilizers are always counted at 100%.
+
+The function sums the calculated filling from all applications to provide the total phosphate filling for the parcel.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md b/fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md
new file mode 100644
index 000000000..db7112dab
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md
@@ -0,0 +1,107 @@
+---
+title: Stikstofgebruiksnorm 2025
+sidebar_label: "Stikstofgebruiksnorm"
+---
+
+# Stikstofgebruiksnorm 2025
+
+This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for nitrogen in 2025. It covers how the norm is calculated, the rules for catch crops and winter crops, and how the applied nitrogen counts towards this norm (`opvulling`).
+
+---
+
+## Calculating the Gebruiksnorm (Usage Norm)
+
+### How the Norm Works
+
+The nitrogen usage norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation follows a step-by-step process to find the most precise norm based on various factors.
+
+#### Calculation Steps:
+
+1. **Identify Main Crop**: The main crop for 2025 is determined from your cultivation plan.
+2. **Determine Geographical Context**: The field's location is used to check:
+ * If it is in a **Nutrient-Polluted Area (`NV-gebied`)**, which results in a stricter (lower) norm.
+ * The dominant **soil region** (`zand_nwc`, `zand_zuid`, `klei`, `veen`, or `loess`).
+3. **Find the Standard Norm**: The main crop is looked up in the official RVO Table 2 (or Tabel 2g for NV-gebieden).
+4. **Apply Specific Rules**: The standard norm is refined with additional rules for certain crops:
+ * **Temporary Grassland (`Tijdelijk grasland`)**: The norm is adjusted based on the cultivation end date.
+ * **Potatoes (`Aardappelen`)**: The norm is adjusted based on the potato variety. See [RVO Tabel 2c](https://www.rvo.nl/sites/default/files/2024-12/Tabel-2c-Consumptieaardappelen%20hoge%20of%20lage%20norm-2025.pdf).
+ * **Maize (`Maïs`)**: The norm depends on the farm's derogation status.
+ * **Outdoor Flowers (`Buitenbloemen`)**: A higher norm is applied for specific varieties.
+5. **Select the Final Norm**: The final value is selected based on the field's soil region and `NV-gebied` status.
+6. **Apply Nitrogen Usage Norm Reduction (`Korting Stikstofgebruiksnorm`)**: The norm can be reduced (`korting`) if catch crop (`vanggewas`) or winter crop (`winterteelt`) requirements were not met in the previous year on sand and loess soils.
+
+### How the FDM Calculator Determines the Norm
+
+The `fdm-calculator` uses the `calculateNitrogenUsageNorm` function in `fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts`, which relies on:
+* **`stikstofgebruiksnorm-data.ts`**: Contains the data from RVO Tabel 2 and Tabel 2g.
+* **`input.ts`**: Defines the required inputs, such as derogation status, location, and crop data.
+
+---
+
+## Vanggewassen en Winterteelten (Catch Crops and Winter Crops)
+
+### How the Rules Work
+
+On sand and loess soils, the land must be covered during the winter to prevent nitrogen leaching. This can be achieved with a catch crop or a designated winter crop. Failure to comply results in a reduction of the nitrogen usage norm for the following year.
+
+#### 1. Winter Crop Exception
+
+No reduction is applied if the main crop of the current year is a designated **winter crop (`winterteelt`)**. These crops provide sufficient ground cover and nitrogen uptake.
+**Official Source**: [RVO Tabel 2F Vanggewassen en winterteelten](https://www.rvo.nl/sites/default/files/2023-11/Tabel-2F-Vanggewassen-en-winterteelten-op-zand-en-l%C3%B6ssgrond-2024.pdf)
+
+#### 2. Catch Crop Rules
+
+If there is no winter crop, a **catch crop (`vanggewas`)** must be sown. The sowing date determines the reduction:
+
+* **No Reduction**: Sown by **October 1st**.
+* **5 kg N/ha Reduction**: Sown between **October 2nd and October 14th**.
+* **10 kg N/ha Reduction**: Sown between **October 15th and October 31st**.
+* **20 kg N/ha Reduction**: No valid catch crop, sown on or after **November 1st**, or destroyed before **February 1st**.
+
+### How the FDM Calculator Implements These Rules
+
+This logic is part of the `calculateNitrogenUsageNorm` function:
+
+1. **Check for Winter Crop**: The calculator checks if the current year's main crop is a winter crop.
+2. **Check for Catch Crop**: If not, it checks the previous year's cultivation data for a catch crop.
+3. **Apply Reduction**: The sowing date determines the reduction, which is applied to the current year's norm.
+
+---
+
+## Calculating the Opvulling (Filling)
+
+### How the Filling Works
+
+The filling is based on the **effective nitrogen** (`werkzame stikstof`) applied, which is calculated using an efficiency coefficient (`werkingscoëfficiënt`).
+
+**Official Source**: [RVO Tabel 9 Werkzame stikstof landbouwgrond 2025](https://www.rvo.nl/sites/default/files/2024-12/Tabel-9-Werkzame-stikstof-landbouwgrond-2025.pdf)
+
+#### Calculation Formula
+
+`Effective Nitrogen (kg N) = Applied Amount (kg or ton) × Total Nitrogen Content (%) × Efficiency Coefficient (%)`
+
+#### Efficiency Coefficients (`Werkingscoëfficiënten`)
+
+| Mestsoort (Manure Type) & Herkomst (Origin) | Toepassing (Application) | Werkingscoëfficiënt (%) |
+| :--- | :--- | :--- |
+| **Drijfmest en dunne fractie** | | |
+| Drijfmest van graasdieren (eigen bedrijf) | Met beweiding | 45 |
+| | Zonder beweiding | 60 |
+| Drijfmest van graasdieren (aangevoerd) | | 60 |
+| Drijfmest van varkens | Klei en veen | 60 |
+| | Zand en löss | 80 |
+| Overige drijfmest en dunne fractie | | 80 |
+| **Vaste mest** | | |
+| Vaste mest van graasdieren (eigen bedrijf) | Bouwland (sep-jan) | 30 |
+| | Overig met beweiding | 45 |
+| | Overig zonder beweiding | 60 |
+| Vaste mest van graasdieren (aangevoerd) | Bouwland (sep-jan) | 30 |
+| | Overige | 40 |
+| Vaste mest van varkens, pluimvee, nertsen | | 55 |
+| **Overig** | | |
+| Compost / Champost | | 10 / 25 |
+| Kunstmest (Mineral fertilizer) | | 100 |
+
+### How the FDM Calculator Determines the Filling
+
+The `calculateNitrogenFilling` function in `fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts` uses the fertilizer type, application method, and the coefficients from `table-9.ts` to calculate the effective nitrogen.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/_category_.json b/fdm-docs/docs/agronomic-calculations/nl/_category_.json
new file mode 100644
index 000000000..617b87028
--- /dev/null
+++ b/fdm-docs/docs/agronomic-calculations/nl/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "The Netherlands",
+ "position": 1
+}
diff --git a/fdm-docs/docs/contributing.md b/fdm-docs/docs/contributing.md
deleted file mode 100644
index b3bad6a78..000000000
--- a/fdm-docs/docs/contributing.md
+++ /dev/null
@@ -1,93 +0,0 @@
----
-title: "Contributing"
-sidebar_position: 9 # Keep it towards the end
----
-
-# Contributing to FDM
-
-We welcome contributions to the Farm Data Model (FDM) project! Whether you're a developer, agronomist, or simply an interested user, your contributions can help improve FDM for everyone.
-
-This guide focuses on contributions to the codebase and documentation within the FDM monorepo.
-
-## Getting Started with Development
-
-### Prerequisites
-* [Git](https://git-scm.com/)
-* [Node.js](https://nodejs.org/) (Check `.node-version` or `package.json` engines field for recommended version)
-* [pnpm](https://pnpm.io/) (Enable corepack via `corepack enable` if needed)
-* [Docker](https://www.docker.com/) and Docker Compose (for running a local PostgreSQL database if you don't have one)
-
-### Setup
-1. **Fork & Clone:** Fork the main [SvenVw/fdm](https://github.com/SvenVw/fdm) repository on GitHub and clone your fork locally.
- ```bash
- git clone https://github.com/SvenVw/fdm.git
- cd fdm
- ```
-2. **Install Dependencies:** Install all dependencies for the entire monorepo using pnpm from the root directory.
- ```bash
- pnpm install
- ```
-3. **Setup Environment Variables:** Each package might require its own `.env` file. Copy the `.env.example` file in the respective package directory (e.g., `fdm-core/.env.example`) to `.env` and fill in the necessary values. For `fdm-core`, you'll need database credentials. You can use the provided `docker-compose.yml` at the root to easily spin up a PostgreSQL instance:
- ```bash
- docker compose up -d # Starts postgres in the background
- ```
- Then configure `fdm-core/.env` accordingly (usually defaults match the docker-compose setup).
-
-## Development Workflow
-
-### Running Tasks with Turbo
-This monorepo uses [Turborepo](https://turbo.build/repo) to manage tasks. Common tasks can be run from the root directory:
-
-* **Build all packages:** `turbo run build`
-* **Run tests for all packages:** `turbo run test`
-* **Lint all packages:** `turbo run lint` (or specific lint command if defined)
-* **Format all packages:** `turbo run format` (using Biome)
-* **Develop `fdm-app` (example):** `turbo run dev --filter=fdm-app`
-* **Develop `fdm-docs`:** `turbo run watch-docs --filter=fdm-docs`
-
-Refer to the `turbo.json` file and individual `package.json` scripts for more details on available tasks.
-
-### Code Style & Linting
-We use [Biome](https://biomejs.dev/) for formatting and linting. Please ensure your code adheres to the configured style.
-
-* **Check formatting and linting:** `turbo run lint` (or `pnpm biome check .` from root)
-* **Apply formatting and safe fixes:** `turbo run format` (or `pnpm biome format --write .` and `pnpm biome check --apply .` from root)
-
-It's recommended to set up Biome integration in your editor for automatic formatting on save.
-
-### Testing
-Each package should have its own tests (usually using Vitest).
-
-* **Run all tests:** `turbo run test`
-* **Run tests for a specific package:** `turbo run test --filter=fdm-core`
-
-Please add tests for any new features or bug fixes.
-
-### Branching Strategy
-* Create a new branch for your changes from the `main` or `development` branch.
-* Use a descriptive branch name (e.g., `feat/add-soil-texture-calc`, `fix/farm-creation-bug`, `docs/update-contributing-guide`).
-
-### Committing Changes & Changesets
-Follow conventional commit message standards (e.g., `feat: ...`, `fix: ...`, `docs: ...`, `chore: ...`).
-
-If your changes affect any of the published packages (`fdm-core`, `fdm-data`, `fdm-calculator`, `fdm-app`, `fdm-docs`) and should trigger a version bump and changelog entry, you **must** add a changeset:
-
-1. Run `pnpm changeset` from the root directory.
-2. Follow the prompts to select the packages that changed, the type of change (patch, minor, major), and write a concise summary of the change. This summary will be used in the changelogs.
-3. Commit the generated Markdown file in the `.changeset` directory along with your code changes.
-
-Changes that don't require a version bump (e.g., fixing typos in internal comments, CI/CD adjustments) do not need a changeset.
-
-### Creating a Pull Request
-1. Push your branch to your fork on GitHub.
-2. Create a Pull Request (PR) from your branch to the `development` branch of the `SvenVw/fdm` repository.
-3. Fill in the PR template, clearly describing the changes, the motivation, and linking any relevant issues.
-4. Ensure all automated checks (linting, testing, building) pass.
-5. The maintainers will review your PR, provide feedback, and merge it once approved.
-
-## Reporting Bugs & Requesting Features
-
-* **Bugs:** Please report bugs via [GitHub Issues](https://github.com/SvenVw/fdm/issues). Include a clear description, steps to reproduce, expected vs. actual behavior, and environment details.
-* **Features:** Suggest new features or ideas via [GitHub Discussions](https://github.com/SvenVw/fdm/discussions/categories/ideas).
-
-Thank you for contributing to FDM!
diff --git a/fdm-docs/docs/contributing/01-project-architecture.md b/fdm-docs/docs/contributing/01-project-architecture.md
new file mode 100644
index 000000000..d4bc89f16
--- /dev/null
+++ b/fdm-docs/docs/contributing/01-project-architecture.md
@@ -0,0 +1,26 @@
+---
+title: Project Architecture
+sidebar_label: Project Architecture
+---
+
+# Project Architecture
+
+The Farm Data Model (FDM) is a monorepo that is managed with `pnpm` workspaces and `turbo`. This structure allows us to manage multiple packages within a single repository, which simplifies dependency management and improves code sharing.
+
+## Monorepo Structure
+
+The FDM monorepo is organized into the following packages:
+
+* **`fdm-core`**: This package contains the core data model, including the database schema, TypeScript types, and JSON schemas.
+* **`fdm-data`**: This package contains the standardized catalogues for crops, fertilizers, and other agricultural inputs.
+* **`fdm-calculator`**: This package contains the agronomic calculation engine, which is used to perform calculations such as nitrogen balance and fertilizer recommendations.
+* **`fdm-app`**: This package is a reference implementation of a farm management application that is built on top of the FDM.
+* **`fdm-docs`**: This package contains the documentation for the FDM project, which is built with Docusaurus.
+
+## `pnpm` Workspaces
+
+`pnpm` workspaces are used to manage the dependencies between the different packages in the monorepo. This allows us to install all the dependencies for all the packages with a single command, and it also ensures that the same version of a dependency is used across all packages.
+
+## `turbo`
+
+`turbo` is a high-performance build system for JavaScript and TypeScript codebases. It is used to orchestrate the build process for the FDM monorepo, and it provides features such as caching and parallel execution to speed up the build process.
diff --git a/fdm-docs/docs/contributing/02-setting-up-local-environment.md b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
new file mode 100644
index 000000000..f876ad84a
--- /dev/null
+++ b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
@@ -0,0 +1,65 @@
+---
+title: Setting up Local Environment
+sidebar_label: Setting up Local Environment
+---
+
+# Setting up Local Environment
+
+This guide will walk you through the process of setting up a local development environment for the Farm Data Model (FDM) project.
+
+## Prerequisites
+
+Before you begin, you will need to have the following software installed on your machine:
+
+* **Node.js:** FDM is a TypeScript and JavaScript project, so you will need to have Node.js installed.
+* **`pnpm`**: FDM uses `pnpm` for package management, so you will need to have it installed.
+* **Git:** FDM is hosted on GitHub, so you will need to have Git installed to clone the repository.
+* **Docker:** FDM uses Docker to run the necessary services, such as the PostgreSQL database.
+
+## Cloning the Repository
+
+First, you need to clone the FDM repository from GitHub:
+
+```bash
+git clone https://github.com/SvenVw/fdm.git
+```
+
+## Installing Dependencies
+
+Next, you need to install the dependencies for all the packages in the monorepo. You can do this by running the following command from the root of the repository:
+
+```bash
+pnpm install
+```
+
+## Setting up `.env` files
+
+FDM uses `.env` files to manage environment variables. You will need to create a `.env` file in the `fdm-app` package. You can do this by copying the `.env.example` file:
+
+```bash
+cp fdm-app/.env.example fdm-app/.env
+```
+
+You will then need to fill in the values for the environment variables in the `.env` file.
+
+## Running Necessary Services
+
+FDM requires a PostgreSQL database to be running. The easiest way to do this is to use Docker. You can start the database by running the following command from the root of the repository:
+
+```bash
+docker-compose up -d
+```
+
+## External Services
+
+The `fdm-calculator` requires the `nmi-api` for Dutch nutrient advices. You can find the documentation for this API at [https://api.nmi-agro.nl/docs](https://api.nmi-agro.nl/docs).
+
+## Running the Application
+
+Once you have completed all the previous steps, you can run the `fdm-app` by running the following command from the root of the repository:
+
+```bash
+pnpm --filter fdm-app dev
+```
+
+This will start the development server, and you should be able to access the application in your browser at `http://localhost:5173`.
diff --git a/fdm-docs/docs/core-concepts/07-release.md b/fdm-docs/docs/contributing/03-releasing-fdm.md
similarity index 98%
rename from fdm-docs/docs/core-concepts/07-release.md
rename to fdm-docs/docs/contributing/03-releasing-fdm.md
index fdb2531ea..d7e630fb8 100644
--- a/fdm-docs/docs/core-concepts/07-release.md
+++ b/fdm-docs/docs/contributing/03-releasing-fdm.md
@@ -1,3 +1,8 @@
+---
+title: Releasing FDM
+sidebar_label: Releasing FDM
+---
+
# Release Process
This document outlines the release process for the `fdm` monorepo. Our process is built on a `development` -> `release` -> `main` branching strategy and is automated using GitHub Actions and [Changesets](https://github.com/changesets/changesets).
diff --git a/fdm-docs/docs/contributing/_category_.json b/fdm-docs/docs/contributing/_category_.json
new file mode 100644
index 000000000..9b4b65284
--- /dev/null
+++ b/fdm-docs/docs/contributing/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "Contributing to FDM",
+ "position": 4,
+ "link": {
+ "type": "generated-index",
+ "description": "This section is for developers who want to contribute to the FDM project itself."
+ }
+}
diff --git a/fdm-docs/docs/core-concepts/01-asset-action-model.md b/fdm-docs/docs/core-concepts/01-asset-action-model.md
deleted file mode 100644
index 3c10d089e..000000000
--- a/fdm-docs/docs/core-concepts/01-asset-action-model.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-title: "Asset-Action model"
----
-
-# The Asset-Action Model: A Foundation for Agricultural Data Management
-
-The Asset-Action model provides a powerful and intuitive framework for organizing and understanding complex agricultural data. Its core principle lies in separating things from the events that happen to them. This separation brings clarity and structure to farm data, enabling more effective analysis and decision-making.
-
-## Core concepts
-The model revolves around two fundamental concepts:
-
-* **Assets**: These represent physical or conceptual entities within a farm operation. Examples include fields, crops, equipment, livestock, or even abstract concepts like soil health or water resources. An asset is essentially anything that has value or plays a significant role in the farm system.
-
-* **Actions**: These represent operations or events that affect assets. Sowing a crop, applying fertilizer, harvesting, irrigating, or performing maintenance on equipment are all examples of actions. Actions capture the dynamic processes that shape the state and productivity of farm assets.
-
-## Intuitiveness
-
-The intuitiveness of the Asset-Action model stems from its alignment with how farmers and agronomists naturally think about their operations. They manage things (assets) and perform activities (actions) upon them. This model directly reflects this real-world perspective, making it easy to understand and apply. For example:
-
-* A farmer doesn't think solely in terms of an abstract "effective nitrogen dose." They consider the specific type and amount of fertilizer, the particular field it's applied to, and the date of application. In this context, the field is the asset, and the act of applying fertilizer is the action.
-* An agronomist analyzing nitrogen use efficiency doesn't simply take a single measurement. They analyze the total nitrogen applied to a specific field from all sources (like synthetic fertilizer and manure), the timing of each application in relation to the crop's growth stages, and the final crop yield and its nitrogen uptake. The field and the crop itself are considered assets, while the applications of fertilizer and manure are the actions.
-
-This inherent intuitiveness makes the Asset-Action model accessible to a broad range of users, regardless of their technical background.
-
-## Flexibility
-The Asset-Action model's flexibility shines in its ability to represent a diverse range of agricultural practices and data types. Its open structure allows for:
-
-* **Granular Detail:** Actions can be defined with varying levels of detail, from broad categories like "planting" to highly specific instances like "planting hybrid corn variety X at a seeding rate of Y on date Z."
-
-* **Diverse Relationships:** The model can capture complex relationships between assets and actions. A single action can affect multiple assets (e.g., harvesting a field involves both the field and the harvesting equipment). Similarly, multiple actions can be performed on a single asset over time (e.g., a field undergoes plowing, planting, fertilizing, and harvesting).
-
-* **Customizable Attributes:** Both assets and actions can be enriched with custom attributes to capture specific data relevant to the farm operation. For example, a "field" asset might include attributes like geometry. A "fertilizer application" action might include attributes like fertilizer type, application rate, and application method.
-
-* **Temporal Tracking:** The model naturally accommodates the temporal dimension of farming activities. Actions are typically associated with timestamps, allowing for analysis of how assets change over time in response to different actions.
-
-## Practical Applications
-The Asset-Action model has broad applicability across various agricultural domains:
-
-* **Farm Management Software:** Provides a structured framework for organizing farm records and enabling data-driven decision-making.
-* **Precision Agriculture:** Enables the integration and analysis of data from various sensors and sources, supporting site-specific management practices.
-* **Agricultural Research:** Facilitates the collection and analysis of experimental data, leading to improved understanding of crop growth and farm system dynamics.
-* **Sustainability Assessments:** Provides a framework for tracking resource use and environmental impacts associated with different farming practices.
-
-By capturing the essential elements of agricultural activities in a clear and structured way, the Asset-Action model empowers stakeholders across the agricultural value chain to make more informed decisions, optimize resource utilization, lower environmental impact and improve farm productivity.
diff --git a/fdm-docs/docs/core-concepts/02-schema.md b/fdm-docs/docs/core-concepts/01-database-schema.md
similarity index 98%
rename from fdm-docs/docs/core-concepts/02-schema.md
rename to fdm-docs/docs/core-concepts/01-database-schema.md
index 190965fd9..1d2f46f40 100644
--- a/fdm-docs/docs/core-concepts/02-schema.md
+++ b/fdm-docs/docs/core-concepts/01-database-schema.md
@@ -1,11 +1,19 @@
---
-title: "Schema"
+title: Database Schema
---
-# Farm Data Model (FDM) Database Schema
+# Database Schema
This document provides a comprehensive overview of the Farm Data Model (FDM) database schema. It details each schema and table, their properties, and columns, explaining their purpose and how they relate to the overall data structure.
+FDM uses a relational database to store its data. The schema is defined using TypeScript and then translated into a physical database schema using a tool called an **Object-Relational Mapper (ORM)**.
+
+> **What is an ORM?**
+>
+> An ORM is a library that provides a way to interact with a database using an object-oriented programming language. It maps the tables in a database to classes in the code, and the rows in those tables to instances of those classes. This allows developers to work with the database in a more intuitive and natural way, without having to write raw SQL queries.
+>
+> FDM uses the [Drizzle ORM](https://orm.drizzle.team/) to manage its database schema.
+
## Schema Overview
The FDM database is organized into four distinct PostgreSQL schemas:
@@ -344,7 +352,7 @@ This schema holds the primary data related to farm operations.
| **created** | `timestamp with time zone` | Not Null | Timestamp when this record was created (default: now()). |
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
-#### **`fertilizer_applying`**
+#### **`fertilizerApplication`**
**Purpose**: Logs the event of applying a specific fertilizer instance to a field.
| Column | Type | Constraints | Description |
@@ -726,6 +734,7 @@ These custom types are defined in `schema-custom-types.ts` to handle specific da
* **Purpose**: A workaround for Drizzle ORM potentially returning `numeric` SQL types as strings. This custom type ensures that numeric values are correctly parsed as numbers (`float`) in the application layer.
* **SQL Type**: `numeric` or `numeric(precision, scale)`
* **Application Type**: `number`
+* **Note**: Maps SQL `numeric` to TypeScript `number`. Be aware of potential precision loss for values exceeding JavaScript's `Number.MAX_SAFE_INTEGER` range, though this is rare for agricultural data.
#### **`geometry`**
* **Purpose**: Handles PostGIS `geometry` types, allowing storage and retrieval of GeoJSON-like data.
@@ -733,4 +742,5 @@ These custom types are defined in `schema-custom-types.ts` to handle specific da
* **Application Type**: GeoJSON `Geometry` object (e.g., `Polygon`, `MultiPoint`).
* **Dependencies**: Requires the PostGIS extension enabled in the PostgreSQL database.
* **Current Implementation**: The provided code in `schema-custom-types.ts` includes parsing logic primarily for `Polygon` and `MultiPoint` types when reading from the database (especially from hexewkb format). Writing uses `ST_GeomFromGeoJSON`. Support for other geometry types might be limited or require additional parsing logic.
-* **SRID**: Assumes SRID 4326 (WGS 84).
\ No newline at end of file
+* **SRID**: Assumes SRID 4326 (WGS 84).
+* **Note**: Stored as SRID 4326 (WGS 84). Area and distance calculations should cast to `geography` to account for earth curvature.
diff --git a/fdm-docs/docs/core-concepts/02-farms.md b/fdm-docs/docs/core-concepts/02-farms.md
new file mode 100644
index 000000000..beb28ea5d
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/02-farms.md
@@ -0,0 +1,32 @@
+---
+title: Farms
+---
+
+# Farms
+
+The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming operation and is the primary organizational unit within the system.
+
+## Properties
+
+A `Farm` has the following properties, which are stored in the `farms` table:
+
+* **`b_id_farm`**: A unique identifier for the farm. This is the primary key for the `farms` table.
+* **`b_name_farm`**: The name of the farm.
+* **`b_businessid_farm`**: The business ID associated with the farm (e.g., a Chamber of Commerce number).
+* **`b_address_farm`**: The physical address of the farm.
+* **`b_postalcode_farm`**: The postal code of the farm address.
+
+## Users and Roles
+
+Users are associated with a `Farm` through the `fdm-authz` schema. The `role` table links a `principal_id` (the user) to a `resource_id` (the `b_id_farm`). This allows you to control who has access to the farm's data and what actions they can perform.
+
+For a detailed explanation of the authorization system, please see the [Authorization](./10-authorization.md) page.
+
+## Farm-Related Data
+
+In addition to the basic properties, a `Farm` can have several other types of data associated with it:
+
+* **Organic Certifications:** You can store information about a farm's organic certifications in the `organicCertifications` and `organicCertificationsHolding` tables. This includes details like the certification body, certification numbers (e.g., TRACES, Skal), and the dates the certification was issued and expires.
+* **Derogations:** The `derogations` and `derogationApplying` tables are used to track any special permissions (derogations) that a farm has been granted for a specific year. These are often related to legal norms for fertilizer application.
+* **Grazing Intentions:** The `intendingGrazing` table allows you to record a farm's intention to graze animals for a specific year. This is a boolean flag associated with the farm and the year.
+* **Catalogue Preferences:** The `fertilizerCatalogueEnabling` and `cultivationCatalogueSelecting` tables allow you to specify which data sources a farm uses for its fertilizer and cultivation catalogues. This provides flexibility in managing standardized data.
diff --git a/fdm-docs/docs/core-concepts/03-catalogues.md b/fdm-docs/docs/core-concepts/03-catalogues.md
deleted file mode 100644
index 2d458769b..000000000
--- a/fdm-docs/docs/core-concepts/03-catalogues.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-title: "Catalogues & FDM Data"
-sidebar_position: 3 # Position after Schema
----
-
-# FDM Data Package (`fdm-data`)
-
-The `@svenvw/fdm-data` package serves as a central repository for standardized agricultural data catalogues used within the Farm Data Model ecosystem. Its primary purpose is to provide consistent, pre-defined lists for common entities like cultivations and fertilizers.
-
-## Purpose of Catalogues
-
-Using standardized catalogues offers several benefits:
-
-* **Consistency:** Ensures that the same cultivation (e.g., "Winter Wheat") or fertilizer (e.g., "Urea (46%)") is referred to using the same identifier (`b_lu_catalogue` or `p_id_catalogue`) across different datasets and applications.
-* **Data Quality:** Reduces errors from manual data entry by providing validated options.
-* **Simplified Integration:** Makes it easier to integrate data from different sources that adhere to the same catalogue references.
-* **Analysis:** Facilitates comparative analysis across farms or regions based on standardized inputs.
-
-## Structure and Usage
-
-Catalogues within `fdm-data` are typically structured as TypeScript files exporting arrays or objects containing the catalogue entries. Each entry usually includes:
-
-* A unique identifier (e.g., `b_lu_catalogue`, `p_id_catalogue`).
-* Human-readable names (often in multiple languages, e.g., `p_name_nl`, `p_name_en`).
-* Relevant attributes specific to the catalogue type (e.g., nutrient content for fertilizers, harvestability for cultivations).
-* A source identifier (e.g., `b_lu_source`, `p_source`) indicating the origin of the catalogue data (e.g., 'BRP', 'baat', 'NMI').
-* A hash for tracking changes to the entry.
-
-**Using Existing Catalogues:**
-
-Applications can directly import the exported catalogues from `@svenvw/fdm-data` to:
-
-1. Populate UI elements like dropdown menus.
-2. Validate user input.
-3. Retrieve the correct catalogue ID (`b_lu_catalogue` or `p_id_catalogue`) needed when calling `fdm-core` functions like `addCultivation` or `addFertilizer`.
-
-Refer to the **Using Catalogues (`fdm-data`)** guide in the "Getting Started" section for code examples.
-
-## Contributing New Catalogue Data Sources
-
-The `fdm-data` package is designed to be extensible. If you have a standardized data source for cultivations or fertilizers (e.g., an official regional list, an updated BRP or BAAT version) that isn't already included, you can contribute it. This involves adding a new data source for the *existing* catalogue types (cultivations or fertilizers).
-
-**Process:**
-
-1. **Identify Catalogue Type:** Determine if you are adding data for `cultivations` or `fertilizers`.
-2. **Prepare Data:** Structure your data according to the existing TypeScript types defined within `fdm-data` (e.g., `CatalogueCultivationItem`, `CatalogueFertilizerItem`). Ensure you include all required properties (like unique IDs, names, source identifier) and maintain consistent data types.
-3. **Create Source File:** Add a new TypeScript file for your data source within the correct subdirectory:
- * For fertilizers: `fdm-data/src/fertilizers/catalogues/your-source-name.ts`
- * For cultivations: `fdm-data/src/cultivations/catalogues/your-source-name.ts`
-4. **Export Data:** In your new file, export the catalogue data as a constant array conforming to the appropriate type (e.g., `export const fertilizersCatalogueYourSource: CatalogueFertilizerItem[] = [...]`). Assign a clear `p_source` or `b_lu_source` identifier value within your data entries.
-5. **Update Type Index:** Add an export statement for your new catalogue constant in the relevant type index file (`fdm-data/src/fertilizers/index.ts` or `fdm-data/src/cultivations/index.ts`) so it becomes part of the package's public API.
-6. **Hashing (Recommended):** Implement hashing for your entries (see `fdm-data/src/hash.ts` and how existing catalogues use it) to generate the `hash` property. This helps track changes. Update the main index (`fdm-data/src/index.ts`) to include your hashed data export if applicable.
-7. **Documentation:** Briefly document your new source within the `fdm-data` package's README or relevant documentation files.
-8. **Pull Request:** Submit a pull request to the FDM repository with your changes, following the guidelines in the **Contributing** guide.
-
-*Note: Currently, adding entirely new *types* of catalogues (e.g., for pesticides or machinery) would require modifications to `fdm-core`'s schema and functions, in addition to creating the data in `fdm-data`.*
-
-## Syncing Catalogues with `fdm-core`
-
-While applications can use `fdm-data` by directly importing the catalogues, `fdm-core` also provides a `syncCatalogues` function. This function can be used to populate the `fertilizers_catalogue` and `cultivations_catalogue` tables within an FDM database instance directly from the data provided by `fdm-data`. This might be useful for scenarios where database-level referential integrity or querying against the catalogue tables is desired. Refer to the `fdm-core` API reference for details on `syncCatalogues`.
diff --git a/fdm-docs/docs/core-concepts/03-fields.md b/fdm-docs/docs/core-concepts/03-fields.md
new file mode 100644
index 000000000..169ab84e3
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/03-fields.md
@@ -0,0 +1,37 @@
+---
+title: Fields
+---
+
+# Fields
+
+The `Field` asset is the primary spatial asset in the Farm Data Model (FDM). It represents a specific area of land where agricultural activities take place.
+
+## Geometric Properties
+
+A `Field` has a `b_geometry` property that stores its geometric information as a GeoJSON polygon. This allows you to represent the exact shape and location of the field on a map.
+
+The geometry is stored in the [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS_84) coordinate system (SRID 4326), which is the standard for GPS and web mapping.
+
+## Properties
+
+A `Field` has the following properties, which are stored in the `fields` table:
+
+* **`b_id`**: A unique identifier for the field. This is the primary key for the `fields` table.
+* **`b_name`**: The name of the field.
+* **`b_geometry`**: The geometry of the field, as a GeoJSON polygon.
+* **`b_id_source`**: An optional identifier from an external data source.
+
+## Relationship to a Farm
+
+A `Field` is always associated with a `Farm`. This relationship is established through the `fieldAcquiring` table, which links a `field` (`b_id`) to a `farm` (`b_id_farm`). This table also records:
+
+* **`b_start`**: The date when the farm's management of the field began.
+* **`b_acquiring_method`**: The method by which the farm acquired the field (e.g., ownership, lease).
+
+The `fieldDiscarding` table is used to mark when a field is no longer actively managed by the farm.
+
+## Role in Tracking Activities
+
+The `Field` asset plays a crucial role in tracking location-specific activities. Actions such as sowing (`cultivationStarting`) and fertilizing (`fertilizerApplication`) are directly linked to the `field`. Other activities, such as harvesting (`cultivationHarvesting`), are linked to the `cultivation` which is growing on the field, thereby creating an indirect link to the field.
+
+This interconnected data structure allows you to build a complete history of all activities that have taken place on a specific field, which is essential for traceability, compliance, and precision agriculture.
diff --git a/fdm-docs/docs/core-concepts/04-architecture-overview.md b/fdm-docs/docs/core-concepts/04-architecture-overview.md
deleted file mode 100644
index 1fbcbadb2..000000000
--- a/fdm-docs/docs/core-concepts/04-architecture-overview.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: "Architecture Overview"
-sidebar_position: 4
----
-
-# FDM Architecture Overview
-
-The Farm Data Model (FDM) project is structured as a monorepo, containing several distinct packages that work together to provide a comprehensive solution for farm data management and analysis. Understanding the role of each package is key to effectively using and contributing to FDM.
-
-## Monorepo Structure
-
-The project utilizes `pnpm` workspaces and `turbo` for managing the monorepo. This setup allows for efficient dependency management and task running across multiple packages.
-
-## Key Packages
-
-Here's a breakdown of the main packages within the FDM monorepo:
-
-* **`fdm-core`**:
- * **Purpose:** This is the heart of the FDM. It defines the core database schema (using Drizzle ORM), provides functions for interacting with the database (creating farms, fields, adding actions like cultivations and fertilizations), and handles authentication and authorization logic.
- * **Audience:** Developers building applications on top of FDM, contributors extending the core model.
-
-* **`fdm-data`**:
- * **Purpose:** Contains standardized data catalogues, primarily for cultivations and fertilizers. It provides functions to load, manage, and access these catalogues. This ensures consistency in terminology and data values across different FDM instances.
- * **Audience:** Developers needing access to standardized lists, contributors maintaining or adding to the catalogues.
-
-* **`fdm-calculator`**:
- * **Purpose:** Provides calculation logic based on FDM data. This could include nutrient balancing, yield predictions, or other agronomic calculations. It consumes data structured according to `fdm-core`.
- * **Audience:** Developers or agronomists needing to perform specific calculations based on FDM data.
-
-* **`fdm-app`**:
- * **Purpose:** A reference web application built using Remix, demonstrating how to use the FDM packages (`fdm-core`, `fdm-data`, `fdm-calculator`) to build a user-facing farm management tool. It showcases UI components and workflows for interacting with FDM data.
- * **Audience:** Developers looking for an example implementation, potentially end-users of this specific application (though this documentation primarily targets developers/agronomists using the libraries).
-
-* **`fdm-docs`**:
- * **Purpose:** Contains this documentation website, built with Docusaurus.
- * **Audience:** Anyone looking to learn about, use, or contribute to FDM.
-
-## Interaction Flow
-
-Typically, an application using FDM (like `fdm-app` or a custom application) would:
-1. Use `fdm-core` to connect to the database and manage core entities (farms, fields, users).
-2. Use `fdm-core` functions to record actions (cultivation starting, fertilizer applying, etc.).
-3. Optionally use `fdm-data` to populate selection lists or validate inputs against standardized catalogues (e.g., selecting a fertilizer from the catalogue).
-4. Optionally use `fdm-calculator` to perform calculations based on the data stored via `fdm-core`.
-
-This modular architecture allows developers to select the components they need for their specific application.
diff --git a/fdm-docs/docs/core-concepts/04-cultivations.md b/fdm-docs/docs/core-concepts/04-cultivations.md
new file mode 100644
index 000000000..ee8bc4a44
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/04-cultivations.md
@@ -0,0 +1,34 @@
+---
+title: Cultivations
+---
+
+# Cultivations
+
+A `Cultivation` represents the lifecycle of a crop on a `Field`. It is a central concept in the Farm Data Model (FDM) that allows you to track the entire process of growing a crop, from planting to harvest.
+
+## The Cultivation Lifecycle
+
+A `Cultivation` is defined by a sequence of actions that are stored in separate tables:
+
+1. **`cultivationStarting`**: This action marks the beginning of a cultivation. It links a `cultivation` to a `field` and records the following information:
+ * `b_lu_start`: The date when the crop was planted.
+ * `b_sowing_amount`: The amount of seed that was used.
+ * `b_sowing_method`: The method used for sowing.
+2. **`cultivationHarvesting`**: This action represents the gathering of the crop. It links a `cultivation` to a `harvestable` and records the `b_lu_harvest_date`. A single cultivation can have multiple harvesting events.
+3. **`cultivationEnding`**: This action marks the end of a cultivation. It records the `b_lu_end` date and whether the crop residue was left on the field (`m_cropresidue`).
+
+This sequence of actions defines a single cultivation period. A `Field` can have multiple cultivations over time, but only one active cultivation at any given time.
+
+## Linking to Catalogues
+
+Each `Cultivation` is linked to the `cultivationsCatalogue` via the `b_lu_catalogue` foreign key. This catalogue is a standardized list of crops that ensures data consistency and comparability across different farms and applications.
+
+The `cultivationsCatalogue` provides a wealth of information about each crop, including:
+
+* `b_lu_name`: The name of the crop.
+* `b_lu_variety_options`: A list of possible varieties for the crop.
+* `b_lu_harvestable`: Indicates whether the crop is harvested `none`, `once`, or `multiple` times.
+* `b_lu_yield`: The typical yield of the crop.
+* `b_lu_n_harvestable` and `b_lu_n_residue`: The nitrogen content of the harvestable part of the crop and the residue, respectively.
+
+A farm can select which cultivation catalogues it wants to use by creating an entry in the `cultivationCatalogueSelecting` table.
diff --git a/fdm-docs/docs/core-concepts/05-authorization.md b/fdm-docs/docs/core-concepts/05-authorization.md
deleted file mode 100644
index e37da2ce2..000000000
--- a/fdm-docs/docs/core-concepts/05-authorization.md
+++ /dev/null
@@ -1,82 +0,0 @@
----
-title: "Authorization"
-sidebar_position: 5
----
-
-# Authorization in FDM Core
-
-The `@svenvw/fdm-core` package includes a built-in authorization system to control access to resources based on user roles. This system operates primarily using the `fdm-authz` database schema and associated functions within the library.
-
-## Core Concepts
-
-The authorization model is based on Role-Based Access Control (RBAC) and uses the following concepts:
-
-* **Principal (`PrincipalId`):** Represents the user attempting an action. This is typically the user ID obtained from the authentication system (`fdm-authn` schema, `user` table).
-* **Resource (`Resource`):** The type of entity being accessed. Defined resources include:
- * `farm`
- * `field`
- * `cultivation`
- * `harvesting`
- * `fertilizer_application`
- * `soil_analysis`
- * `user` (for managing user details/settings)
- * `organization` (if multi-tenancy/organizations are used)
-* **Resource ID (`ResourceId`):** The specific unique identifier of the resource instance (e.g., a specific `b_id_farm`, `b_id`, `p_app_id`).
-* **Role (`Role`):** The role assigned to a principal for a specific resource. Defined roles include:
- * `owner`: Typically full control over the resource and its children.
- * `advisor`: Often read/write access for management purposes.
- * `researcher`: Usually limited to read access for analysis.
-* **Action (`Action`):** The operation the principal wants to perform. Defined actions include:
- * `read`: View resource details.
- * `write`: Create or modify the resource or related actions.
- * `list`: View a list of resources (often checked at a higher level, e.g., listing fields within a farm).
- * `share`: Grant or revoke roles for the resource.
-* **Permissions:** A predefined mapping (within `authorization.ts`) defines which `Role` can perform which `Action` on each `Resource` type. For example, an `owner` of a `farm` can `read`, `write`, `list`, and `share` that farm and its related child resources (fields, cultivations etc.), while a `researcher` might only have `read` access.
-
-## How it Works
-
-1. **Granting Access:** Access is granted by assigning a `Role` to a `PrincipalId` for a specific `ResourceId`. This is done using the `grantRole` function, which creates a record in the `fdm-authz.role` table.
- ```typescript
- import { grantRole, FdmServerType, PrincipalId } from '@svenvw/fdm-core';
-
- // Assume fdm, principalId, targetUserId, farmId are defined
- // Grant the 'advisor' role for a specific farm to another user
- // await grantRole(fdm, 'farm', 'advisor', farmId, targetUserId);
- ```
-2. **Revoking Access:** Access is revoked using the `revokeRole` function, which marks the corresponding record in the `fdm-authz.role` table as deleted (soft delete).
- ```typescript
- import { revokeRole, FdmServerType, PrincipalId } from '@svenvw/fdm-core';
-
- // Assume fdm, principalId, targetUserId, farmId are defined
- // Revoke the 'advisor' role for a specific farm from a user
- // await revokeRole(fdm, 'farm', 'advisor', farmId, targetUserId);
- ```
-3. **Checking Permissions:** When you call most data manipulation or retrieval functions in `fdm-core` (e.g., `addField`, `getField`, `addCultivation`), they internally call the `checkPermission` function.
- * `checkPermission` takes the `principalId`, the target `resource`, the intended `action`, and the `resource_id`.
- * It determines the required roles for the action based on the predefined `permissions`.
- * **Resource Chain Lookup:** It then uses an internal helper (`getResourceChain`) to identify the hierarchical relationship of the target resource. FDM resources often have a parent-child relationship. For example:
- * A `fertilizer_application` happens on a `field`.
- * A `field` belongs to a `farm`.
- * A `cultivation` happens on a `field`, which belongs to a `farm`.
- * A `harvesting` event relates to a `cultivation`, which happens on a `field`, which belongs to a `farm`.
- The `getResourceChain` function queries the database to find these links and returns an ordered list representing this hierarchy, like `[{ resource: 'farm', resource_id: 'farm123' }, { resource: 'field', resource_id: 'fieldABC' }, { resource: 'fertilizer_application', resource_id: 'fertAppXYZ' }]`.
- * **Permission Check Along the Chain:** `checkPermission` iterates through this chain, starting from the most specific resource (e.g., `fertilizer_application`) up to the highest level (e.g., `farm`). At each level, it checks if the `principalId` has one of the required roles assigned *specifically for that resource bead* (e.g., checking roles for `fertAppXYZ`, then roles for `fieldABC`, then roles for `farm123`) in the `fdm-authz.role` table.
- * **Cascading Permissions:** If permission is granted at *any* level in the chain (e.g., the user is `owner` of the `farm`), the check succeeds, and the original function proceeds. This effectively means permissions granted at higher levels (like the farm) cascade down to child resources (like fields, cultivations, applications within that farm).
- * If no required role is found for the principal at any level of the chain, `checkPermission` throws a "Permission denied" error, halting the original function call.
-4. **Listing Accessible Resources:** The `listResources` function can be used to find all resources of a specific type (e.g., `farm`) that a user has permission to perform a certain action on (e.g., `read`).
- ```typescript
- import { listResources, FdmServerType, PrincipalId } from '@svenvw/fdm-core';
-
- // Assume fdm, principalId are defined
- // Get all farm IDs the user can read
- // const readableFarmIds = await listResources(fdm, 'farm', 'read', principalId);
- // console.log(readableFarmIds);
- ```
-5. **Auditing:** Every call to `checkPermission` (whether successful or failed) is logged as an entry in the `fdm-authz.audit` table. This provides a trail of who attempted what action on which resource, when, from where (`origin`), whether it was allowed, and which role assignment granted the access if successful.
-
-## Key Considerations
-
-* **Principal ID:** All core functions that involve data access require the `principalId` to perform permission checks.
-* **Role Management:** Granting and revoking roles is typically an administrative task, often performed via dedicated UI elements or scripts that call `grantRole` and `revokeRole`.
-* **Resource Chain:** Understanding the resource hierarchy (`getResourceChain`) is crucial for predicting how permissions propagate (e.g., farm owner permissions cascade down).
-* **Predefined Permissions:** The mapping between roles, resources, and actions is currently hardcoded in the `permissions` array within `authorization.ts`. Modifying these permissions requires changing the library code.
diff --git a/fdm-docs/docs/core-concepts/06-harvest.md b/fdm-docs/docs/core-concepts/05-harvests.md
similarity index 91%
rename from fdm-docs/docs/core-concepts/06-harvest.md
rename to fdm-docs/docs/core-concepts/05-harvests.md
index 1bfaa293b..0429a1b4a 100644
--- a/fdm-docs/docs/core-concepts/06-harvest.md
+++ b/fdm-docs/docs/core-concepts/05-harvests.md
@@ -1,13 +1,17 @@
-# Harvest
+---
+title: Harvests
+---
-Harvesting is a critical event in the cultivation cycle, representing the culmination of a season's efforts. In the Farm Data Model (FDM), the harvest is not just a single data point but a comprehensive model that captures the nuances of different crops and their specific measurements. This detailed approach allows for accurate agronomic calculations, such as nutrient balances and yield comparisons.
+# Harvests
+
+Harvesting is a critical event in the cultivation cycle. In the Farm Data Model (FDM), the harvest is not just a single data point but a detailed data structure that captures the nuances of different crops and their specific measurements. This detailed approach allows for accurate agronomic calculations, such as nutrient balances and yield comparisons.
## The Harvest Data Model
In FDM, a harvest is intrinsically linked to a **cultivation**. A single cultivation can have multiple harvest events, especially for crops like grass that are cut multiple times a season. The core data structure for a harvest involves several related entities:
- `cultivation_harvesting`: This table links a harvest event to a specific cultivation (`b_lu`) and records the `b_lu_harvest_date`.
-- `harvestables`: Each harvest event can produce one or more "harvestables", and "harvestable" can be linked to multiple harvest events. For example, a potato harvestable might be linked to multiple fields, but collected in the same batch. Note that while the database schema supports it, due to the complexity fdm-core functions currently only support 1:1 relations between harvests and haverstables.
+- `harvestables`: Each harvest event can produce one or more "harvestables", and "harvestable" can be linked to multiple harvest events. For example, a potato harvestable might be linked to multiple fields, but collected in the same batch. Note that while the database schema supports it, due to the complexity fdm-core functions currently only support 1:1 relations between harvests and harvestables.
- `harvestable_analyses`: For each harvestable, one or more analyses can be recorded. This is where the specific measurements for the harvest are stored.
This structure provides a flexible and detailed representation of harvest events, accommodating a wide range of crops and harvesting practices.
diff --git a/fdm-docs/docs/core-concepts/06-fertilizers.md b/fdm-docs/docs/core-concepts/06-fertilizers.md
new file mode 100644
index 000000000..b371bc6b0
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/06-fertilizers.md
@@ -0,0 +1,31 @@
+---
+title: Fertilizers
+---
+
+# Fertilizers
+
+Fertilizer management is a critical aspect of modern agriculture, and the Farm Data Model (FDM) provides a comprehensive way to track and manage fertilizer applications.
+
+## Defining and Applying Fertilizers
+
+In FDM, there are two main ways to work with fertilizers:
+
+1. **Using Pre-defined Fertilizers from a Catalogue:** FDM includes a `fertilizersCatalogue` that contains a standardized list of common fertilizers. This catalogue provides information about each fertilizer, including its nutrient content, density, and application methods. When you use a fertilizer from the catalogue, you create a `fertilizerPicking` record to link your specific fertilizer instance to the catalogue entry.
+2. **Defining Custom Fertilizers:** If a fertilizer is not in the catalogue, you can define a custom one by creating a new entry in the `fertilizers` table. Storing specific nutrient analysis for custom fertilizers is a planned feature and not yet implemented. This is particularly useful for manure and other organic fertilizers, which can have highly variable nutrient content.
+
+When you apply a fertilizer to a `Field`, you create a `fertilizer_applying` action. This action is stored in the `fertilizerApplication` table and records:
+
+* **`p_app_id`**: A unique identifier for the application event.
+* **`b_id`**: The ID of the `Field` where the fertilizer was applied.
+* **`p_id`**: The ID of the specific fertilizer instance that was used.
+* **`p_app_amount`**: The amount of fertilizer that was applied (typically in kg/ha).
+* **`p_app_method`**: The method of application (e.g., broadcasting, injection).
+* **`p_app_date`**: The date of the application.
+
+## The `fertilizersCatalogue`
+
+The `fertilizersCatalogue` is a key component of the FDM. It provides a structured way to represent fertilizers, which has several benefits:
+
+* **Data Consistency:** Using a standardized list of fertilizers helps ensure that data is consistent and comparable across different farms and applications.
+* **Reduced Data Entry:** By pre-defining common fertilizers, the need for manual data entry is reduced.
+* **Facilitates Calculations:** The `fertilizersCatalogue` provides data useful for agronomic calculations, such as nutrient balance and fertilizer recommendations. Each entry in the catalogue contains a detailed breakdown of the fertilizer's composition, including its content of macro and micronutrients.
diff --git a/fdm-docs/docs/core-concepts/07-soil-analyses.md b/fdm-docs/docs/core-concepts/07-soil-analyses.md
new file mode 100644
index 000000000..dcf8da6c5
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/07-soil-analyses.md
@@ -0,0 +1,35 @@
+---
+title: Soil Analyses
+---
+
+# Soil Analyses
+
+Soil analysis is a fundamental practice in agriculture, providing valuable insights into the health and fertility of the soil. The Farm Data Model (FDM) provides a structured way to store and manage soil analysis data.
+
+## Structure of Soil Sample Data
+
+In FDM, soil analysis data is linked to a specific `Field`. A `soilSampling` action is created to record the details of the sampling event. This is stored in the `soilSampling` table, which includes:
+
+* **`b_id_sampling`**: A unique identifier for the sampling event.
+* **`b_id`**: The ID of the `Field` where the sample was taken.
+* **`a_id`**: The ID of the corresponding `soilAnalysis` record.
+* **`b_sampling_date`**: The date when the soil sample was taken.
+* **`a_depth_upper` and `a_depth_lower`**: The upper and lower depths of the soil sample.
+* **`b_sampling_geometry`**: The geographic coordinates where the sample was taken, stored as a GeoJSON `MultiPoint`.
+
+The results of the soil analysis are stored in the `soilAnalysis` table. This table includes a wide range of parameters, such as:
+
+* **`a_id`**: A unique identifier for the analysis record.
+* **`a_date`**: The date the analysis was performed.
+* **`a_source`**: The laboratory that performed the analysis.
+* **`a_ph_cc`**: The pH of the soil.
+* **`a_som_loi`**: The organic matter content of the soil.
+* **Nutrient Levels:** A comprehensive set of columns for the levels of key nutrients, such as nitrogen (N), phosphorus (P), and potassium (K), as well as micronutrients.
+* **`b_gwl_class`**: The groundwater level classification.
+* **`b_soiltype_agr`**: The agricultural soil type.
+
+## Linking to Fields
+
+Each `soilAnalysis` record is linked to a `soilSampling` record, which in turn is linked to a `Field`. This creates a clear and traceable link between the soil analysis results and the specific location where the sample was taken.
+
+This allows you to track changes in soil health over time, identify areas of nutrient deficiency or excess, and make more informed decisions about fertilizer and amendment applications.
diff --git a/fdm-docs/docs/core-concepts/08-catalogues.md b/fdm-docs/docs/core-concepts/08-catalogues.md
new file mode 100644
index 000000000..e81c7d3e7
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/08-catalogues.md
@@ -0,0 +1,36 @@
+---
+title: Catalogues
+---
+
+# Catalogues
+
+The `fdm-data` package is a key component of the Farm Data Model (FDM) that provides pre-defined, standardized data sets for a variety of agricultural concepts. These data sets are known as **catalogues**.
+
+## Purpose of Catalogues
+
+The primary purpose of the catalogues is to ensure data consistency and reduce the need for manual data entry. By providing standardized lists of common agricultural inputs and products, the catalogues help to:
+
+* **Standardize Data:** Ensure that the same terminology is used for the same concepts across different farms and applications.
+* **Improve Data Quality:** Reduce the risk of errors and inconsistencies that can arise from manual data entry.
+* **Simplify Data Entry:** Make it easier and faster to enter data by providing pre-populated lists of options.
+
+## Available Catalogues
+
+The `fdm-data` package includes the following catalogues, which are stored in the `cultivations_catalogue` and `fertilizers_catalogue` tables respectively:
+
+* **`cultivationsCatalogue`**: A standardized list of crops, including their names, varieties, typical yields, nutrient content, and other agronomic properties. Each entry has a `b_lu_catalogue` as its primary key.
+* **`fertilizersCatalogue`**: A standardized list of common fertilizers, including their nutrient content, density, and application methods. Each entry has a `p_id_catalogue` as its primary key.
+
+## Farm-Specific Catalogue Selection
+
+FDM provides a flexible system for managing which catalogues a farm uses. The `cultivationCatalogueSelecting` and `fertilizerCatalogueEnabling` tables allow each farm to specify which catalogue sources (`b_lu_source` and `p_source`) they want to use. This allows for customization and localization of the standardized data.
+
+## Benefits of Data Consistency
+
+The data consistency provided by the catalogues is essential for a wide range of applications, including:
+
+* **Benchmarking:** Comparing the performance of different farms or fields.
+* **Agronomic Modeling:** Building accurate models to predict crop growth and nutrient dynamics.
+* **Supply Chain Management:** Tracking the flow of agricultural products from farm to fork.
+
+By providing a common language for describing agricultural data, the catalogues in `fdm-data` play a crucial role in enabling a more connected and data-driven agricultural industry.
diff --git a/fdm-docs/docs/core-concepts/09-authentication.md b/fdm-docs/docs/core-concepts/09-authentication.md
new file mode 100644
index 000000000..a8d8e2174
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/09-authentication.md
@@ -0,0 +1,26 @@
+---
+title: Authentication
+---
+
+# Authentication
+
+Authentication is the process of verifying the identity of a user. The Farm Data Model (FDM) provides a standard authentication system that supports a variety of authentication strategies.
+
+## How Users are Verified
+
+FDM uses a combination of JSON Web Tokens (JWTs) and sessions to authenticate users.
+
+> **What is a JWT?**
+>
+> A JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.
+
+When a user logs in, they are issued a JWT that contains their user ID and other relevant information. This JWT is then sent with each subsequent request to the server, where it is used to verify the user's identity.
+
+## Supported Strategies
+
+FDM supports a variety of authentication strategies, including:
+
+* **Username and Password:** The traditional method of authentication, where users provide a username and password to log in.
+* **OAuth Providers:** FDM can be integrated with popular OAuth providers, such as Google and Microsoft, to allow users to log in with their existing accounts.
+
+The authentication mechanisms are handled by the `fdm-core/src/authentication.ts` file, which is built on top of the `better-auth` library.
diff --git a/fdm-docs/docs/core-concepts/10-authorization.md b/fdm-docs/docs/core-concepts/10-authorization.md
new file mode 100644
index 000000000..0177ff176
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/10-authorization.md
@@ -0,0 +1,34 @@
+---
+title: Authorization
+---
+
+# Authorization
+
+Authorization is the process of determining what actions a user is allowed to perform. The Farm Data Model (FDM) provides a resource-based permission model that allows you to control access to your data.
+
+## The Permission Model
+
+FDM's permission model is based on a combination of **resources**, **roles**, and **actions**.
+
+* **Resources:** These are the main entities in the FDM, such as `farm`, `field`, `cultivation`, etc.
+* **Roles:** These are collections of permissions that can be assigned to a user for a specific resource. FDM defines the following roles:
+ * `owner`: Full control over the resource.
+ * `advisor`: Can view and edit the resource.
+ * `researcher`: Can only view the resource.
+* **Actions:** These are the operations that can be performed on a resource, such as `read`, `write`, `list`, and `share`.
+
+## How Access Control is Handled
+
+Access control is handled by the `fdm-authz` schema, which contains two main tables:
+
+* **`role`**: This table stores the roles that have been assigned to users for specific resources. Each row in this table represents a single role assignment, linking a `principal_id` (user) to a `resource` and `resource_id`.
+* **`audit`**: This table provides an audit trail of all authorization checks. It records who attempted to perform what action on which resource, and whether the action was allowed or denied.
+
+When a user attempts to perform an action, the `checkPermission` function is called. This function does the following:
+
+1. **Determines the required roles:** It first determines which roles are required to perform the requested action on the given resource.
+2. **Constructs the resource hierarchy:** It then constructs the resource hierarchy for the target resource. For example, if the target resource is a `cultivation`, the hierarchy would be `farm` -> `field` -> `cultivation`.
+3. **Checks for permissions:** It then checks to see if the user has been granted any of the required roles on any of the resources in the hierarchy.
+4. **Audits the check:** Finally, it records the result of the check in the `audit` table.
+
+This system provides a flexible and secure way to control access to your data, while also providing a complete audit trail of all access control decisions.
diff --git a/fdm-docs/docs/core-concepts/11-organizations.md b/fdm-docs/docs/core-concepts/11-organizations.md
new file mode 100644
index 000000000..eca20e921
--- /dev/null
+++ b/fdm-docs/docs/core-concepts/11-organizations.md
@@ -0,0 +1,37 @@
+---
+title: Organizations
+---
+
+# Organizations
+
+Organizations provide a way to group and manage multiple farms and users under a single entity. This is particularly useful for large agricultural businesses, cooperatives, and other organizations that need to manage data from multiple farms.
+
+## The Organization Schema
+
+The organization-related tables are part of the `fdm-authn` schema, which is based on the `better-auth` library. The main tables are:
+
+* **`organization`**: This table stores the basic information about an organization, including its `id`, `name`, `slug`, and `logo`.
+* **`member`**: This table links users to organizations. Each row represents a user's membership in an organization and includes their `userId`, `organizationId`, and `role` within that organization (e.g., 'admin', 'member').
+* **`invitation`**: This table is used to manage invitations for users to join an organization.
+
+## Multi-Farm Access and Management
+
+Organizations enable a powerful mechanism for managing access to farms for groups of users. Instead of granting roles to individual users for each farm, an owner of a farm can grant a role (e.g., `advisor` or `researcher`) directly to an `Organization`.
+
+When a role is granted to an `Organization` for a specific farm, all members of that `Organization` automatically "inherit" this role for that farm. This significantly simplifies access management, especially for larger setups or when working with teams.
+
+This capability allows you to:
+
+* **Centralize Access Control**: Manage farm access for an entire team by granting a single role to their organization.
+* **Streamline Onboarding**: New members joining an organization automatically gain the appropriate farm access without individual assignments.
+* **Facilitate Multi-Farm Analysis**: Members of an organization can easily compare and view data across multiple farms to which their organization has been granted access.
+* **Identify Trends and Patterns**: Analyze data and identify trends across the collective farms managed by the organization.
+* **Roll Up Data**: Aggregate data to the organization level for high-level reporting and strategic decision-making.
+
+This direct linkage of roles between organizations and farms via the `fdm-authz` schema provides a robust and efficient way to manage multi-farm operations.
+
+## User Management
+
+Organizations also provide a mechanism to manage users *within* the organization. You can add users to an organization and assign them roles (e.g., `owner`, `admin`, `member`) that determine their level of administrative access and permissions within that organization itself. This, in conjunction with the organization's inherited roles on farms, collectively determines a user's overall access to data.
+
+This simplifies user management and ensures that users only have access to the data they need.
diff --git a/fdm-docs/docs/core-concepts/_category_.json b/fdm-docs/docs/core-concepts/_category_.json
index 32b639daf..e7bc297a7 100644
--- a/fdm-docs/docs/core-concepts/_category_.json
+++ b/fdm-docs/docs/core-concepts/_category_.json
@@ -1,8 +1,8 @@
{
- "label": "Core Concepts",
- "position": 3,
- "link": {
- "type": "generated-index",
- "description": "Learn about the fundamental concepts behind the Farm Data Model."
- }
+ "label": "Core Concepts",
+ "position": 2,
+ "link": {
+ "type": "generated-index",
+ "description": "This section will provide detailed information on the fundamental components of the Farm Data Model, explaining both the 'what' and the 'why' of each concept."
+ }
}
diff --git a/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md b/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
new file mode 100644
index 000000000..575bc9dd6
--- /dev/null
+++ b/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
@@ -0,0 +1,60 @@
+---
+title: Introduction to FDM App
+sidebar_label: Introduction
+---
+
+# Introduction to FDM App
+
+The `fdm-app` is a practical, working example of an application that is built with the Farm Data Model (FDM). It serves as a reference implementation and a showcase of the capabilities of the FDM.
+
+## Features
+
+The `fdm-app` includes the following features:
+
+* **Farm Data Visualization:** You can view your farm data on a map, including field polygon and with tables for your rotation.
+* **Action Logging:** You can log the actions that take place on your farm, such as sowing, fertilizing, and harvesting.
+* **Data Analysis:** You can use the `fdm-app` to analyze your farm data and gain insights into your nutrient management.
+
+## Technical Stack
+
+The `fdm-app` is built with a technical stack that provides specific functionalities and benefits:
+
+* **Frontend Framework:**
+ * **React 19:** A JavaScript library for building user interfaces.
+ * **React Router 7 (formerly Remix):** Manages both frontend routing and backend data operations, contributing to a cohesive development experience.
+ * **Vite:** A build tool that provides fast server starts and Hot Module Replacement (HMR) for development.
+
+* **UI & Styling:**
+ * **Tailwind CSS 4:** A utility-first CSS framework for building custom designs.
+ * **shadcn/ui (Radix UI):** A collection of re-usable components built on Radix UI primitives and styled with Tailwind CSS, supporting accessibility and modularity.
+ * **Framer Motion:** A motion library for React that supports animations and gestures in the UI.
+ * **Lucide React:** An icon library that integrates with React applications.
+ * **Sonner:** A toast component for displaying notifications and messages to the user.
+
+* **Backend & Data Management:**
+ * **PostgreSQL:** An open-source relational database system.
+ * **Drizzle ORM:** A TypeScript ORM for interacting with the database in a type-safe way.
+ * **@svenvw/fdm-core:** The core Farm Data Model library, providing business logic and data interaction capabilities.
+ * **@svenvw/fdm-data:** Standardized agricultural catalogues for consistent data entry and reference.
+ * **@svenvw/fdm-calculator:** A library for performing agronomic calculations.
+
+* **Authentication & Authorization:**
+ * **Better Auth:** A library for user authentication and session management.
+ * **@svenvw/fdm-core (Authorization module):** Manages role-based access control (RBAC) for various FDM resources.
+
+* **GIS & Mapping:**
+ * **Mapbox GL JS & React Map GL:** For interactive maps and geospatial data visualization.
+ * **Turf.js:** A geospatial library for spatial analysis operations.
+ * **Proj4:** A JavaScript library for coordinate transformation.
+ * **Flatgeobuf:** An open format for publishing and consuming geospatial data.
+
+* **Error Tracking & Analytics:**
+ * **Sentry:** For error tracking and performance monitoring.
+ * **PostHog:** For product analytics.
+
+This combination of technologies supports a functional environment for building agricultural applications.
+
+
+## A Working Application
+
+The `fdm-app` is not just a demo, it is a working application that can be used as inspiration for your own farm management solutions. You can use it as a starting point for your own projects, or you can contribute to its development to help make it even better.
diff --git a/fdm-docs/docs/fdm-app/_category_.json b/fdm-docs/docs/fdm-app/_category_.json
new file mode 100644
index 000000000..d473af351
--- /dev/null
+++ b/fdm-docs/docs/fdm-app/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "FDM App",
+ "position": 5,
+ "link": {
+ "type": "generated-index",
+ "description": "A brief section introducing the `fdm-app` as a practical, working example of an application built with FDM."
+ }
+}
diff --git a/fdm-docs/docs/getting-started/01-prerequisites.md b/fdm-docs/docs/getting-started/01-prerequisites.md
deleted file mode 100644
index 47d37063b..000000000
--- a/fdm-docs/docs/getting-started/01-prerequisites.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-title: Prerequisites
----
-
-This guide provides a comprehensive walkthrough on how to create a farm using `fdm-core`, the core library of the Farm Data Model (FDM). It covers the necessary steps, code examples, and explanations to help you get started.
-
-## Prerequisites
-
-Before you begin, ensure you have the following:
-
-* **PostgreSQL Database:** `fdm-core` uses a PostgreSQL-compatible database. Make sure you have a running PostgreSQL instance with the necessary credentials and the `PostGIS` extension enabled.
-* **fdm-core installed:** Install `fdm-core` in your project using `pnpm install @svenvw/fdm-core`.
-* **Database Connection:** Configure the database connection in your `.env` file as per the `fdm-core` documentation.
diff --git a/fdm-docs/docs/getting-started/01-what-is-fdm.md b/fdm-docs/docs/getting-started/01-what-is-fdm.md
new file mode 100644
index 000000000..1d9c20fdd
--- /dev/null
+++ b/fdm-docs/docs/getting-started/01-what-is-fdm.md
@@ -0,0 +1,37 @@
+---
+title: What is FDM?
+---
+
+# What is FDM?
+
+The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions.
+
+## What Problem Does FDM Solve?
+
+The agricultural industry is becoming increasingly data-driven. However, farm data is often fragmented, inconsistent, and locked into proprietary systems. This makes it difficult to:
+
+* **Share data** between different applications and services.
+* **Analyze data** from multiple sources to gain a holistic view of farm operations.
+* **Develop new and innovative** farm management tools.
+
+FDM addresses these challenges by providing a common language for describing farm data. It defines a standardized schema for a wide range of agricultural concepts, including:
+
+* **Farms and Fields:** The core assets of any agricultural operation.
+* **Cultivations:** The lifecycle of a crop, from sowing to harvest.
+* **Actions:** The various activities that take place on a farm, such as fertilizing, spraying, and soil sampling.
+* **Catalogues:** Standardized lists of crops, fertilizers, and other agricultural inputs.
+
+## Who is the Target Audience?
+
+FDM is designed for a diverse audience, including:
+
+* **Agronomists:** FDM provides a structured way to record and analyze farm data, enabling them to make more informed decisions.
+* **Developers:** FDM offers a flexible and extensible data model for building a new generation of farm management applications.
+* **Researchers:** FDM provides a standardized dataset for conducting research and developing new agricultural technologies.
+
+## What are the Key Features?
+
+* **Standardized Schema:** FDM provides a comprehensive and well-documented schema for a wide range of agricultural data.
+* **Calculation Engine:** FDM includes a powerful calculation engine for performing common agronomic calculations, such as nitrogen balance and nutrient recommendations.
+* **Open-Source:** FDM is an open-source project, which means it is free to use, modify, and distribute.
+* **Extensible:** FDM is designed to be extensible, allowing users to add their own custom data types and calculations.
diff --git a/fdm-docs/docs/getting-started/02-setup-connection.md b/fdm-docs/docs/getting-started/02-setup-connection.md
deleted file mode 100644
index 60fdb9bb3..000000000
--- a/fdm-docs/docs/getting-started/02-setup-connection.md
+++ /dev/null
@@ -1,91 +0,0 @@
----
-title: Setup the FDM instance
----
-
-In the previous step, we made sure that all the prerequisites for `fdm-core` are met. In this step, we will set up an FDM instance.
-
-## Configure Environment Variables
-
-`fdm-core` relies on environment variables for configuration. These variables specify crucial details for connecting to your database. Create a `.env` file in the root of your project and add the following, replacing the placeholders with your actual database credentials:
-
-```env
-# DB configuration
-# The hostname or IP address of the PostgreSQL database server.
-POSTGRES_HOST=
-
-# The port number on which the PostgreSQL database server is listening. Defaults to 5432 if not specified.
-POSTGRES_PORT=
-
-# The name of the PostgreSQL database to connect to.
-POSTGRES_DB=
-
-# The username used to authenticate with the PostgreSQL database server.
-POSTGRES_USER=
-
-# The password used to authenticate with the PostgreSQL database server. Ensure this is stored securely and not exposed in version control.
-POSTGRES_PASSWORD=
-
-# Security Note:
-# 1. Never commit this .env file to version control
-# 2. Consider using a secrets management service in production
-# 3. Rotate credentials regularly
-```
-
-## Intialize the FDM Instance
-Once the schema is in place, you can initialize an instance of fdm-core to start interacting with your FDM data.
-
-```typescript
-import { drizzle } from 'drizzle-orm/postgres-js'
-import { migrate } from 'drizzle-orm/postgres-js/migrator'
-import { fdmSchema as schema, syncCatalogues } from '@svenvw/fdm-core'
-
-// Get credentials to connect to db
-const host = process.env.POSTGRES_HOST ??
- (() => { throw new Error('POSTGRES_HOST environment variable is required') })()
-const port = Number(process.env.POSTGRES_PORT) ||
- (() => { throw new Error('POSTGRES_PORT environment variable is required') })()
-const user = process.env.POSTGRES_USER ??
- (() => { throw new Error('POSTGRES_USER environment variable is required') })()
-const password = process.env.POSTGRES_PASSWORD ??
- (() => { throw new Error('POSTGRES_PASSWORD environment variable is required') })()
-const database = process.env.POSTGRES_DB ??
- (() => { throw new Error('POSTGRES_DB environment variable is required') })()
-const migrationsFolderPath = 'node_modules/@svenvw/fdm-core/dist/db/migrations'
-
-// initialize FDM instance
-
-export const fdm = await (async () => {
- try {
- const db = drizzle({
- connection : {
- user : user,
- password : password,
- host : host,
- port : port,
- database : database
- },
- logger: false,
- schema: schema
- });
-
- console.log('Successfully connected to database');
- return db;
- } catch (error) {
- console.error('Failed to connect to database:', error);
- throw error;
- }
-})();
-
-// Apply database migration if needed
-await migrate(fdm, { migrationsFolder: migrationsFolderPath, migrationsSchema: 'fdm-migrations' })
-
-// Sync catalogues
-await syncCatalogues(fdm).catch((error) =>
- console.error("Error in syncing catalogues 🚨:", error),
-)
-
-```
-
-The fdm object now provides access to all the functionality offered by `fdm-core`, enabling you to create farms, add fields, manage cultivations, and more. Consult the specific documentation for each function to understand its usage and parameters.
-
-In the next page you will create your first farm.
diff --git a/fdm-docs/docs/getting-started/02-the-asset-action-model.md b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
new file mode 100644
index 000000000..7fbebef58
--- /dev/null
+++ b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
@@ -0,0 +1,67 @@
+---
+title: The Asset-Action Model
+---
+
+# The Asset-Action Model
+
+The core architectural concept of the Farm Data Model (FDM) is the **Asset-Action Model**. This model provides a simple yet powerful way to represent the complex and dynamic nature of farm operations.
+
+## Assets
+
+**Assets** are the fundamental building blocks of the FDM. They represent the physical and logical entities that make up a farm, such as:
+
+* **Farms:** The top-level container for all other assets.
+* **Fields:** The primary spatial asset, representing a specific area of land.
+* **Cultivations:** An instance of a crop being grown on a field.
+* **Fertilizers:** A specific batch or acquisition of a fertilizer product.
+* **Soil Samples:** A physical sample of soil taken from a field.
+
+## Actions
+
+**Actions** are the events that create or modify assets over time. They represent the various activities that take place on a farm, such as:
+
+* **Sowing:** The action of planting a crop, which creates a new `cultivation` asset.
+* **Fertilizing:** The action of applying fertilizer to a field, which modifies the `field` asset.
+* **Harvesting:** The action of gathering a crop, which modifies the `cultivation` asset.
+* **Soil Sampling:** The action of taking a soil sample, which creates a new `soil sample` asset.
+
+## How it Works
+
+The Asset-Action Model creates a traceable history of all farm activities. Each action is linked to a specific asset, and the sequence of actions on an asset tells the story of that asset over time.
+
+For example, the history of a `field` asset might look like this:
+
+1. **Create Field:** The `field` asset is created with its initial geometry and properties.
+2. **Sow Crop:** A `sowing` action is performed on the `field`, creating a new `cultivation` asset.
+3. **Apply Fertilizer:** A `fertilizing` action is performed on the `field`, adding nutrients to the soil.
+4. **Harvest Crop:** A `harvesting` action is performed on the `field`, gathering the crop and ending the `cultivation`.
+
+This creates a complete and auditable record of everything that has happened on the farm, which is essential for traceability, compliance, and decision-making.
+
+## Diagram
+
+The following diagram illustrates the relationship between assets and actions:
+
+```mermaid
+graph TD
+ subgraph "Assets"
+ A[Farm]
+ B[Field]
+ C[Cultivation]
+ D[Fertilizer]
+ E[Soil Sample]
+ end
+
+ subgraph "Actions"
+ F[Sowing]
+ G[Fertilizing]
+ H[Harvesting]
+ I[Soil Sampling]
+ end
+
+ A --> B
+ F --> C
+ G --> B
+ H --> C
+ I --> E
+```
diff --git a/fdm-docs/docs/getting-started/03-basic-usage-fdm-core.md b/fdm-docs/docs/getting-started/03-basic-usage-fdm-core.md
deleted file mode 100644
index 862dc2ce4..000000000
--- a/fdm-docs/docs/getting-started/03-basic-usage-fdm-core.md
+++ /dev/null
@@ -1,103 +0,0 @@
----
-title: "Basic Usage (fdm-core)"
----
-
-# Basic Usage (`fdm-core`)
-
-After setting up your database connection as described in the previous step, you can start interacting with the FDM using functions exported by `@svenvw/fdm-core`. This section provides basic examples of common operations using direct function calls.
-
-**Note:** Most functions require a `principal_id` (representing the user performing the action) and the initialized `fdm` instance (database connection, likely of type `FdmServerType`) as arguments. Authorization checks are performed internally based on the `principal_id`.
-
-```typescript
-import {
- createFdmServer,
- addFarm,
- addField,
- addCultivation,
- // Import other needed functions and types
- FdmServerType,
- PrincipalId
-} from '@svenvw/fdm-core';
-import { createId } from '@paralleldrive/cuid2';
-
-// --- Assume Initialization ---
-// Replace with your actual initialization logic
-declare const fdm: FdmServerType;
-declare const principalId: PrincipalId;
-// --- End Initialization ---
-
-
-async function runExamples() {
- let farmId: string | undefined;
- let fieldId: string | undefined;
-
- // --- Example: Creating a Farm ---
- console.log("Attempting to create farm...");
- try {
- const newFarmData = {
- // b_id_farm is generated by addFarm if not provided
- b_name_farm: 'My Example Farm ' + createId(), // Add unique part to name
- b_businessid_farm: 'BUSINESS123',
- b_address_farm: '123 Farm Lane',
- b_postalcode_farm: '12345',
- };
- const createdFarm = await addFarm(fdm, principalId, newFarmData);
- console.log('Farm created successfully:', createdFarm);
- farmId = createdFarm.b_id_farm; // Capture the ID for next steps
- } catch (error) {
- console.error('Error creating farm:', error);
- return; // Stop if farm creation fails
- }
-
- // --- Example: Adding a Field ---
- if (farmId) {
- console.log(`Attempting to add field to farm ${farmId}...`);
- try {
- const newFieldData = {
- // b_id is generated by addField if not provided
- b_name: 'North Field ' + createId(), // Add unique part to name
- // b_geometry: { type: 'Polygon', coordinates: [...] }, // GeoJSON Polygon - Requires PostGIS
- b_id_source: 'ExternalSystemID-' + createId(),
- b_acquiring_method: 'owner', // 'owner', 'lease', or 'unknown'
- b_start: new Date(), // Optional: When management started
- };
- const createdFieldResult = await addField(fdm, principalId, farmId, newFieldData);
- console.log('Field added successfully:', createdFieldResult);
- // Assuming the result structure includes the field ID, adjust if needed
- fieldId = createdFieldResult.field?.b_id;
- } catch (error) {
- console.error('Error adding field:', error);
- // Continue even if field adding fails, to show next example if possible
- }
- }
-
- // --- Example: Adding a Cultivation ---
- if (farmId && fieldId) {
- console.log(`Attempting to add cultivation to field ${fieldId}...`);
- try {
- // You would typically get this ID from fdm-data or your own source
- const catalogueId = 'REPLACE_WITH_VALID_CATALOGUE_ID'; // e.g., a wheat variety ID
-
- const cultivationData = {
- // b_lu (cultivation instance ID) is generated if not provided
- b_lu_catalogue: catalogueId,
- b_lu_start: new Date(), // Sowing date/time
- b_sowing_amount: 150, // Optional: amount in kg/ha or other unit
- b_sowing_method: 'Drilled', // Optional: method
- };
- const cultivationResult = await addCultivation(fdm, principalId, fieldId, cultivationData);
- console.log('Cultivation started successfully:', cultivationResult);
- } catch (error) {
- console.error('Error starting cultivation:', error);
- }
- } else {
- console.log("Skipping cultivation example as farmId or fieldId is missing.");
- }
-}
-
-// To run these examples:
-// runExamples();
-
-```
-
-These examples illustrate the direct usage pattern for `@svenvw/fdm-core` functions. Remember to replace placeholder values (like `REPLACE_WITH_VALID_CATALOGUE_ID`) and consult the API Reference or source code for exact function signatures and return types. The next sections cover using catalogues (`fdm-data`) and calculations (`fdm-calculator`).
diff --git a/fdm-docs/docs/getting-started/03-quick-start-guide.md b/fdm-docs/docs/getting-started/03-quick-start-guide.md
new file mode 100644
index 000000000..a229ec5ce
--- /dev/null
+++ b/fdm-docs/docs/getting-started/03-quick-start-guide.md
@@ -0,0 +1,127 @@
+---
+title: Quick Start Guide
+---
+
+# Quick Start Guide
+
+This guide will walk you through the basics of using the Farm Data Model (FDM) in your own applications. We will cover how to install FDM, connect to a database, create a `farm`, add a `field`, and perform a simple `action` like sowing a crop.
+
+## Installation
+
+First, you need to install the FDM packages from `npm`. You will need `fdm-core` for the core data model and `fdm-data` for the standardized catalogues.
+
+```bash
+npm install @svenvw/fdm-core @svenvw/fdm-data
+```
+
+## Connecting to a Database
+
+FDM uses a PostgreSQL database to store its data. You will need to have a running PostgreSQL instance and the necessary credentials to connect to it.
+
+Here is an example of how to create a `Drizzle` client and connect to a PostgreSQL database:
+
+```typescript
+import { createFdmServer } from '@svenvw/fdm-core';
+
+// Ensure your environment variables are set for PostgreSQL connection
+const fdm = createFdmServer(
+ process.env.DB_HOST,
+ Number(process.env.DB_PORT),
+ process.env.DB_USER,
+ process.env.DB_PASSWORD,
+ process.env.DB_NAME,
+);
+
+// Define a placeholder principal ID for actions
+const principal_id = 'quick-start-user-id';
+```
+
+## Creating a Farm
+
+The `farm` is the top-level asset in FDM. It is the container for all other assets and actions.
+
+Here is how you can create a new `farm`:
+
+```typescript
+import { addFarm } from '@svenvw/fdm-core';
+
+// To create a new farm:
+const farmName = 'My Test Farm';
+const b_id_farm = await addFarm(
+ fdm,
+ principal_id,
+ farmName,
+ '123456', // Dummy business ID
+ 'Farm Lane 1', // Dummy address
+ '1234AB', // Dummy postal code
+);
+console.log(`Created Farm with ID: ${b_id_farm}`);
+```
+
+## Adding a Field
+
+A `field` is the primary spatial asset in FDM. It represents a specific area of land where agricultural activities take place.
+
+Here is how you can add a new `field` to a `farm`:
+
+```typescript
+import { addField } from '@svenvw/fdm-core';
+
+// To add a new field to the farm:
+const fieldName = 'My Test Field';
+const fieldGeometry = {
+ type: 'Polygon',
+ coordinates: [
+ [
+ [0, 0],
+ [0, 1],
+ [1, 1],
+ [1, 0],
+ [0, 0],
+ ],
+ ],
+}; // Dummy GeoJSON geometry
+
+const b_id_field = await addField(
+ fdm,
+ principal_id,
+ b_id_farm, // Use the farm ID from the previous step
+ fieldName,
+ 'source-1', // Dummy source ID
+ fieldGeometry,
+ new Date(), // Current date as start date
+ 'owned', // Acquiring method
+);
+console.log(`Added Field with ID: ${b_id_field}`);
+```
+
+## Sowing a Crop
+
+Sowing is an `action` that creates a new `cultivation` asset on a `field`.
+
+Here is how you can sow a crop on a `field`:
+
+```typescript
+import { addCultivation } from '@svenvw/fdm-core';
+import { cultivationsCatalogue } from '@svenvw/fdm-data';
+
+// To sow a crop on a field:
+const cropName = 'Wheat'; // Example crop
+const sowingDate = new Date(); // Current date as sowing date
+
+const crop = cultivationsCatalogue.find(c => c.b_lu_name === cropName);
+
+if (!crop) {
+ throw new Error(`Crop not found: ${cropName}`);
+}
+
+const b_lu_cultivation = await addCultivation(
+ fdm,
+ principal_id,
+ crop.b_lu_catalogue,
+ b_id_field, // Use the field ID from the previous step
+ sowingDate, // b_lu_start
+ // b_lu_end, m_cropresidue, b_lu_variety are optional
+);
+console.log(`Sowed ${cropName} on Field ${b_id_field} with Cultivation ID: ${b_lu_cultivation}`);
+```
diff --git a/fdm-docs/docs/getting-started/04-using-catalogues-fdm-data.md b/fdm-docs/docs/getting-started/04-using-catalogues-fdm-data.md
deleted file mode 100644
index 9d12bb0bc..000000000
--- a/fdm-docs/docs/getting-started/04-using-catalogues-fdm-data.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: "Using Catalogues (fdm-data & fdm-core)"
----
-
-# Using Catalogues (`fdm-data` & `fdm-core`)
-
-Standardized catalogues simplify data entry and ensure consistency. You can access catalogue data in two main ways:
-
-1. **Directly from `@svenvw/fdm-data`:** For populating general UI elements or accessing the raw catalogue definitions.
-2. **Via `@svenvw/fdm-core` functions:** For retrieving catalogue entries relevant to a specific farm context (e.g., only showing enabled catalogues).
-
-## 1. Accessing Raw Catalogue Data (from `fdm-data`)
-
-The `@svenvw/fdm-data` package exports arrays containing the raw catalogue entries. Import these directly for general use.
-
-```typescript
-// Example: Importing raw cultivation and fertilizer catalogues
-import {
- cultivationsCatalogueBRPCrops,
- fertilizersCatalogueBaat
-} from '@svenvw/fdm-data';
-
-console.log('Total BRP Crops in package:', cultivationsCatalogueBRPCrops.length);
-console.log('Total BAAT Fertilizers in package:', fertilizersCatalogueBaat.length);
-
-// Example: Finding a specific entry's ID from the raw data
-const wheatEntry = cultivationsCatalogueBRPCrops.find(c => c.b_lu_name === 'Winter wheat');
-const wheatCatalogueId = wheatEntry?.b_lu_catalogue;
-// Use wheatCatalogueId when calling fdm-core functions like addCultivation
-
-const manureEntry = fertilizersCatalogueBAAT.find(f => f.p_name_nl === 'Rundveedrijfmest');
-const manureCatalogueId = manureEntry?.p_id_catalogue;
-// Use manureCatalogueId when calling fdm-core functions like addFertilizer
-```
-*Note: Check `fdm-data` exports for exact variable names.*
-
-## 2. Retrieving Contextual Catalogue Data (via `fdm-core`)
-
-`@svenvw/fdm-core` provides functions like `getCultivationsFromCatalogue` and `getFertilizersFromCatalogue`. These functions query the database and typically return catalogue entries that are relevant to the specific farm context, potentially considering which catalogues have been enabled for that farm (using the `cultivation_catalogue_selecting` and `fertilizer_catalogue_enabling` tables).
-
-```typescript
-import {
- createFdmServer,
- getCultivationsFromCatalogue, // Function from fdm-core
- FdmServerType,
- PrincipalId
-} from '@svenvw/fdm-core';
-
-// --- Assume Initialization ---
-declare const fdm: FdmServerType;
-declare const principalId: PrincipalId;
-declare const farmId: string;
-// --- End Initialization ---
-
-async function getFarmEnabledCultivations() {
- console.log(`Getting enabled/relevant cultivations for farm ${farmId}...`);
- try {
- // This function queries the DB catalogue tables, potentially filtered
- const availableCultivations = await getCultivationsFromCatalogue(fdm, principalId, farmId);
-
- console.log(`Found ${availableCultivations.length} cultivations relevant to the farm.`);
- // Use this list to populate UI choices specific to the farm context
-
- // Example: Find wheat within the farm-specific list
- const farmWheatEntry = availableCultivations.find(c => c.b_lu_name === 'Winter wheat');
- if (farmWheatEntry) {
- console.log('Farm-relevant Winter Wheat ID:', farmWheatEntry.b_lu_catalogue);
- // Use this ID when calling addCultivation for this farm/field
- }
-
- return availableCultivations;
-
- } catch (error) {
- console.error('Error getting cultivations from catalogue:', error);
- }
-}
-
-// getFarmEnabledCultivations();
-```
-
-## Linking Actions to Catalogues
-
-Regardless of how you obtain the catalogue ID (directly from `fdm-data` or via `fdm-core` functions like `getCultivationsFromCatalogue`), you use this ID when recording related actions using `fdm-core` functions (e.g., `addCultivation`, `addFertilizer`). This ensures data consistency. See the "Basic Usage (`fdm-core`)" guide for examples of these action functions.
diff --git a/fdm-docs/docs/getting-started/05-running-calculations-fdm-calculator.md b/fdm-docs/docs/getting-started/05-running-calculations-fdm-calculator.md
deleted file mode 100644
index 521a96d9e..000000000
--- a/fdm-docs/docs/getting-started/05-running-calculations-fdm-calculator.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-title: "Running Calculations (fdm-calculator)"
----
-
-# Running Calculations (`fdm-calculator`)
-
-The `@svenvw/fdm-calculator` package provides functions to perform various agronomic calculations based on data stored within the FDM structure. This allows for deriving insights and recommendations from the recorded farm data.
-
-## Overview
-
-The calculator package typically takes data retrieved using `fdm-core` as input, or uses `fdm-core` functions internally to fetch data before performing calculations.
-
-## Example: Calculating Total Fertilizer Dose for a Field
-
-The `fdm-calculator` package exports a convenient function `getDoseForField` that calculates the cumulative N, P2O5, K2O, and workable N doses applied to a specific field. It handles fetching the necessary fertilizer applications and fertilizer details using `fdm-core` internally.
-
-```typescript
-import {
- createFdmServer,
- // Import needed types
- FdmServerType,
- PrincipalId
-} from '@svenvw/fdm-core';
-import {
- getDoseForField // Import the function from fdm-calculator
-} from '@svenvw/fdm-calculator';
-
-// --- Assume Initialization ---
-// Replace with your actual initialization logic
-declare const fdm: FdmServerType;
-declare const principalId: PrincipalId;
-// --- End Initialization ---
-
-async function calculateFieldDose(fieldId: string) {
- console.log(`Attempting to calculate total dose for field ${fieldId}...`);
- try {
- // Call the calculator function directly, providing the fdm instance,
- // the user performing the action, and the target field ID.
- const totalDose = await getDoseForField({
- fdm: fdm,
- principal_id: principalId,
- b_id: fieldId
- });
-
- console.log(`Calculated dose for field ${fieldId}:`, totalDose);
- // Example output format (based on Dose type):
- // { p_dose_n: 120.5, p_dose_nw: 85.3, p_dose_p2o5: 60.0, p_dose_k2o: 90.0 }
- return totalDose;
-
- } catch (error) {
- console.error(`Error calculating dose for field ${fieldId}:`, error);
- // Handle error appropriately
- }
-}
-
-// Example Usage:
-// const fieldId = 'your_field_id'; // Get this from fdm-core, e.g., via getFields
-// calculateFieldDose(fieldId);
-
-```
-
-This example demonstrates the general workflow using the `getDoseForField` function:
-1. Initialize your `fdm-core` instance (`fdm`).
-2. Have the `principalId` of the user making the request.
-3. Call the specific calculation function from `@svenvw/fdm-calculator` (e.g., `getDoseForField`) with the required parameters.
-4. The function handles fetching the necessary underlying data via `fdm-core` and returns the calculated result.
-
-Refer to the API Reference section or the source code for details on other available calculation functions, their specific parameters, and return types.
diff --git a/fdm-docs/docs/getting-started/_category_.json b/fdm-docs/docs/getting-started/_category_.json
index 511e17551..79124bf62 100644
--- a/fdm-docs/docs/getting-started/_category_.json
+++ b/fdm-docs/docs/getting-started/_category_.json
@@ -1,8 +1,8 @@
{
- "label": "Getting Started",
- "position": 4,
- "link": {
- "type": "generated-index",
- "description": "Guides to help you start using the FDM libraries."
- }
+ "label": "Getting Started",
+ "position": 1,
+ "link": {
+ "type": "generated-index",
+ "description": "This section will serve as a high-level introduction for developers who want to use FDM in their own applications. These pages should be guide-style, referencing the `api-reference` where necessary, but focusing on practical implementation."
+ }
}
diff --git a/fdm-docs/docs/installation.md b/fdm-docs/docs/installation.md
deleted file mode 100644
index d316999f7..000000000
--- a/fdm-docs/docs/installation.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-sidebar_position: 2 # Or adjust as needed based on final structure
-title: Installation & Setup
----
-
-# Installation & Setup
-
-This guide covers how to install the Farm Data Model (FDM) packages for use in your own projects, and how to set up the monorepo for contributing to FDM development.
-
-[!WARNING] FDM is currently in an alpha stage of development.FDM is currently in an alpha stage of development. This means the software is under active development, and while core functionalities are stable, there may still be significant changes to its API and schema before the 1.0.0 release. **Until version 1.0.0, database schema migrations are not automatically handled for all breaking changes, and manual intervention might be required for schema updates between versions**. Please use caution and be prepared for potential breaking changes. We encourage you to experiment and provide feedback.
-
-## Using FDM Packages
-
-To use the FDM libraries (like `@svenvw/fdm-core`, `@svenvw/fdm-data`, etc.) in your project:
-
-### Prerequisites
-* [Node.js](https://nodejs.org/) (Check `package.json` engines field in the specific package for recommended version)
-* A package manager like [pnpm](https://pnpm.io/), npm, or yarn.
-* For `@svenvw/fdm-core`: A running [PostgreSQL-compatible](https://www.postgresql.org/) database.
-
-### Installation
-Install the desired packages using your package manager. For example, using pnpm:
-
-```bash
-# Install the core library
-pnpm add @svenvw/fdm-core
-
-# Install the data catalogues library
-pnpm add @svenvw/fdm-data
-
-# Install the calculator library
-pnpm add @svenvw/fdm-calculator
-```
-*(Note: Replace `@svenvw/...` with the actual published package names if they differ).*
-
-### Setup
-* **Database:** Ensure your PostgreSQL database is running.
-* **Environment Variables:** Configure the necessary environment variables, especially the database connection string for `@svenvw/fdm-core`. Refer to the "Setup Connection" guide in the "Getting Started" section for details.
-
-## Contributing to FDM
-
-If you want to contribute to the development of FDM itself:
-
-### Prerequisites
-* [Git](https://git-scm.com/)
-* [Node.js](https://nodejs.org/) (Check `.node-version` or root `package.json` engines field)
-* [pnpm](https://pnpm.io/) (Corepack recommended: `corepack enable`)
-* [Docker](https://www.docker.com/) & Docker Compose (Optional, for easy local database setup)
-
-### Setup
-1. **Fork & Clone:** Fork the main [SvenVw/fdm](https://github.com/SvenVw/fdm) repository and clone your fork.
- ```bash
- git clone https://github.com/SvenVw/fdm.git
- cd fdm
- ```
-2. **Install Dependencies:** Use pnpm from the monorepo root.
- ```bash
- pnpm install
- ```
-3. **Environment & Database:** Set up required `.env` files (copy from `.env.example` in package directories) and ensure a PostgreSQL database is running and configured (e.g., using `docker compose up -d` from the root).
-
-For detailed development workflows (building, testing, linting, changesets), please refer to the **Contributing** guide.
diff --git a/fdm-docs/docusaurus.config.ts b/fdm-docs/docusaurus.config.ts
index f3e2a586a..7bfa0476d 100644
--- a/fdm-docs/docusaurus.config.ts
+++ b/fdm-docs/docusaurus.config.ts
@@ -21,6 +21,10 @@ const config: Config = {
defaultLocale: "en",
locales: ["en"],
},
+ markdown: {
+ mermaid: true,
+ },
+ themes: ["@docusaurus/theme-mermaid"],
presets: [
[
@@ -138,23 +142,19 @@ const config: Config = {
},
{
label: "Getting Started",
- to: "/docs/getting-started/prerequisites",
+ to: "/docs/getting-started/what-is-fdm",
},
{
label: "Core Concepts",
- to: "/docs/core-concepts/asset-action-model",
+ to: "/docs/core-concepts/database-schema",
},
{
label: "API Reference",
to: "/api",
},
- {
- label: "Installation",
- to: "/docs/installation",
- },
{
label: "Contributing",
- to: "/docs/contributing",
+ to: "/docs/contributing/project-architecture",
},
],
},
diff --git a/fdm-docs/package.json b/fdm-docs/package.json
index e780aea90..2f9727008 100644
--- a/fdm-docs/package.json
+++ b/fdm-docs/package.json
@@ -19,9 +19,11 @@
"preinstall": "npx only-allow pnpm"
},
"dependencies": {
- "@docusaurus/core": "3.9.1",
- "@docusaurus/faster": "3.9.1",
- "@docusaurus/preset-classic": "3.9.1",
+ "@docusaurus/core": "3.9.2",
+ "@docusaurus/faster": "3.9.2",
+ "@docusaurus/preset-classic": "3.9.2",
+ "@docusaurus/theme-mermaid": "3.9.2",
+ "@mermaid-js/layout-elk": "^0.1.9",
"@mdx-js/react": "^3.1.1",
"clsx": "^2.1.1",
"lucide-react": "^0.552.0",
@@ -30,9 +32,9 @@
"react-dom": "^19.2.0"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "3.9.1",
- "@docusaurus/tsconfig": "3.9.1",
- "@docusaurus/types": "3.9.1",
+ "@docusaurus/module-type-aliases": "3.9.2",
+ "@docusaurus/tsconfig": "3.9.2",
+ "@docusaurus/types": "3.9.2",
"docusaurus-plugin-typedoc": "^1.4.2",
"typedoc": "catalog:",
"typedoc-plugin-markdown": "^4.9.0",
diff --git a/fdm-docs/src/pages/index.tsx b/fdm-docs/src/pages/index.tsx
index 6dbaf09d6..83ad145a3 100644
--- a/fdm-docs/src/pages/index.tsx
+++ b/fdm-docs/src/pages/index.tsx
@@ -28,7 +28,7 @@ function HomepageHeader() {
Get started
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 839917d82..ad6bbef0b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -531,17 +531,23 @@ importers:
fdm-docs:
dependencies:
'@docusaurus/core':
- specifier: 3.9.1
- version: 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ specifier: 3.9.2
+ version: 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
'@docusaurus/faster':
- specifier: 3.9.1
- version: 3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
+ specifier: 3.9.2
+ version: 3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
'@docusaurus/preset-classic':
- specifier: 3.9.1
- version: 3.9.1(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)
+ specifier: 3.9.2
+ version: 3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)
+ '@docusaurus/theme-mermaid':
+ specifier: 3.9.2
+ version: 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
'@mdx-js/react':
specifier: ^3.1.1
version: 3.1.1(@types/react@19.2.2)(react@19.2.0)
+ '@mermaid-js/layout-elk':
+ specifier: ^0.1.9
+ version: 0.1.9(mermaid@11.12.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -559,14 +565,14 @@ importers:
version: 19.2.0(react@19.2.0)
devDependencies:
'@docusaurus/module-type-aliases':
- specifier: 3.9.1
- version: 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ specifier: 3.9.2
+ version: 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@docusaurus/tsconfig':
- specifier: 3.9.1
- version: 3.9.1
+ specifier: 3.9.2
+ version: 3.9.2
'@docusaurus/types':
- specifier: 3.9.1
- version: 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ specifier: 3.9.2
+ version: 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
docusaurus-plugin-typedoc:
specifier: ^1.4.2
version: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)))
@@ -685,6 +691,12 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ '@antfu/install-pkg@1.1.0':
+ resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
+ '@antfu/utils@9.3.0':
+ resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==}
+
'@apm-js-collab/code-transformer@0.8.2':
resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==}
@@ -1340,6 +1352,9 @@ packages:
'@borewit/text-codec@0.1.1':
resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==}
+ '@braintree/sanitize-url@7.1.1':
+ resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==}
+
'@changesets/apply-release-plan@7.0.13':
resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==}
@@ -1395,6 +1410,21 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+ '@chevrotain/cst-dts-gen@11.0.3':
+ resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
+
+ '@chevrotain/gast@11.0.3':
+ resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==}
+
+ '@chevrotain/regexp-to-ast@11.0.3':
+ resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==}
+
+ '@chevrotain/types@11.0.3':
+ resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==}
+
+ '@chevrotain/utils@11.0.3':
+ resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
+
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -1702,12 +1732,12 @@ packages:
search-insights:
optional: true
- '@docusaurus/babel@3.9.1':
- resolution: {integrity: sha512-/uoi3oG+wvbVWNBRfPrzrEslOSeLxrQEyWMywK51TLDFTANqIRivzkMusudh5bdDty8fXzCYUT+tg5t697jYqg==}
+ '@docusaurus/babel@3.9.2':
+ resolution: {integrity: sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==}
engines: {node: '>=20.0'}
- '@docusaurus/bundler@3.9.1':
- resolution: {integrity: sha512-E1c9DgNmAz4NqbNtiJVp4UgjLtr8O01IgtXD/NDQ4PZaK8895cMiTOgb3k7mN0qX8A3lb8vqyrPJ842+yMpuUg==}
+ '@docusaurus/bundler@3.9.2':
+ resolution: {integrity: sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==}
engines: {node: '>=20.0'}
peerDependencies:
'@docusaurus/faster': '*'
@@ -1715,8 +1745,8 @@ packages:
'@docusaurus/faster':
optional: true
- '@docusaurus/core@3.9.1':
- resolution: {integrity: sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==}
+ '@docusaurus/core@3.9.2':
+ resolution: {integrity: sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==}
engines: {node: '>=20.0'}
hasBin: true
peerDependencies:
@@ -1724,103 +1754,103 @@ packages:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/cssnano-preset@3.9.1':
- resolution: {integrity: sha512-2y7+s7RWQMqBg+9ejeKwvZs7Bdw/hHIVJIodwMXbs2kr+S48AhcmAfdOh6Cwm0unJb0hJUshN0ROwRoQMwl3xg==}
+ '@docusaurus/cssnano-preset@3.9.2':
+ resolution: {integrity: sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==}
engines: {node: '>=20.0'}
- '@docusaurus/faster@3.9.1':
- resolution: {integrity: sha512-zJIrIv+R/IN5TTLV9L+SvO3hwz62L6pO/L16k+b2nC3to3Gn01cnEGHL6doTGAezuPwTSmteJl+kzaoOf+znzg==}
+ '@docusaurus/faster@3.9.2':
+ resolution: {integrity: sha512-DEVIwhbrZZ4ir31X+qQNEQqDWkgCJUV6kiPPAd2MGTY8n5/n0c4B8qA5k1ipF2izwH00JEf0h6Daaut71zzkyw==}
engines: {node: '>=20.0'}
peerDependencies:
'@docusaurus/types': '*'
- '@docusaurus/logger@3.9.1':
- resolution: {integrity: sha512-C9iFzXwHzwvGlisE4bZx+XQE0JIqlGAYAd5LzpR7fEDgjctu7yL8bE5U4nTNywXKHURDzMt4RJK8V6+stFHVkA==}
+ '@docusaurus/logger@3.9.2':
+ resolution: {integrity: sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==}
engines: {node: '>=20.0'}
- '@docusaurus/mdx-loader@3.9.1':
- resolution: {integrity: sha512-/1PY8lqry8jCt0qZddJSpc0U2sH6XC27kVJZfpA7o2TiQ3mdBQyH5AVbj/B2m682B1ounE+XjI0LdpOkAQLPoA==}
+ '@docusaurus/mdx-loader@3.9.2':
+ resolution: {integrity: sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/module-type-aliases@3.9.1':
- resolution: {integrity: sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==}
+ '@docusaurus/module-type-aliases@3.9.2':
+ resolution: {integrity: sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==}
peerDependencies:
react: '*'
react-dom: '*'
- '@docusaurus/plugin-content-blog@3.9.1':
- resolution: {integrity: sha512-vT6kIimpJLWvW9iuWzH4u7VpTdsGlmn4yfyhq0/Kb1h4kf9uVouGsTmrD7WgtYBUG1P+TSmQzUUQa+ALBSRTig==}
+ '@docusaurus/plugin-content-blog@3.9.2':
+ resolution: {integrity: sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==}
engines: {node: '>=20.0'}
peerDependencies:
'@docusaurus/plugin-content-docs': '*'
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-content-docs@3.9.1':
- resolution: {integrity: sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==}
+ '@docusaurus/plugin-content-docs@3.9.2':
+ resolution: {integrity: sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-content-pages@3.9.1':
- resolution: {integrity: sha512-/1wFzRnXYASI+Nv9ck9IVPIMw0O5BGQ8ZVhDzEwhkL+tl44ycvSnY6PIe6rW2HLxsw61Z3WFwAiU8+xMMtMZpg==}
+ '@docusaurus/plugin-content-pages@3.9.2':
+ resolution: {integrity: sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-css-cascade-layers@3.9.1':
- resolution: {integrity: sha512-/QyW2gRCk/XE3ttCK/ERIgle8KJ024dBNKMu6U5SmpJvuT2il1n5jR/48Pp/9wEwut8WVml4imNm6X8JsL5A0Q==}
+ '@docusaurus/plugin-css-cascade-layers@3.9.2':
+ resolution: {integrity: sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==}
engines: {node: '>=20.0'}
- '@docusaurus/plugin-debug@3.9.1':
- resolution: {integrity: sha512-qPeAuk0LccC251d7jg2MRhNI+o7niyqa924oEM/AxnZJvIpMa596aAxkRImiAqNN6+gtLE1Hkrz/RHUH2HDGsA==}
+ '@docusaurus/plugin-debug@3.9.2':
+ resolution: {integrity: sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-google-analytics@3.9.1':
- resolution: {integrity: sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==}
+ '@docusaurus/plugin-google-analytics@3.9.2':
+ resolution: {integrity: sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-google-gtag@3.9.1':
- resolution: {integrity: sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==}
+ '@docusaurus/plugin-google-gtag@3.9.2':
+ resolution: {integrity: sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-google-tag-manager@3.9.1':
- resolution: {integrity: sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==}
+ '@docusaurus/plugin-google-tag-manager@3.9.2':
+ resolution: {integrity: sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-sitemap@3.9.1':
- resolution: {integrity: sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==}
+ '@docusaurus/plugin-sitemap@3.9.2':
+ resolution: {integrity: sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/plugin-svgr@3.9.1':
- resolution: {integrity: sha512-TeZOXT2PSdTNR1OpDJMkYqFyX7MMhbd4t16hQByXksgZQCXNyw3Dio+KaDJ2Nj+LA4WkOvsk45bWgYG5MAaXSQ==}
+ '@docusaurus/plugin-svgr@3.9.2':
+ resolution: {integrity: sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/preset-classic@3.9.1':
- resolution: {integrity: sha512-ZHga2xsxxsyd0dN1BpLj8S889Eu9eMBuj2suqxdw/vaaXu/FjJ8KEGbcaeo6nHPo8VQcBBnPEdkBtSDm2TfMNw==}
+ '@docusaurus/preset-classic@3.9.2':
+ resolution: {integrity: sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
@@ -1831,51 +1861,62 @@ packages:
peerDependencies:
react: '*'
- '@docusaurus/theme-classic@3.9.1':
- resolution: {integrity: sha512-LrAIu/mQ04nG6s1cssC0TMmICD8twFIIn/hJ5Pd9uIPQvtKnyAKEn12RefopAul5KfMo9kixPaqogV5jIJr26w==}
+ '@docusaurus/theme-classic@3.9.2':
+ resolution: {integrity: sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/theme-common@3.9.1':
- resolution: {integrity: sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==}
+ '@docusaurus/theme-common@3.9.2':
+ resolution: {integrity: sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==}
engines: {node: '>=20.0'}
peerDependencies:
'@docusaurus/plugin-content-docs': '*'
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/theme-search-algolia@3.9.1':
- resolution: {integrity: sha512-WjM28bzlgfT6nHlEJemkwyGVpvGsZWPireV/w+wZ1Uo64xCZ8lNOb4xwQRukDaLSed3oPBN0gSnu06l5VuCXHg==}
+ '@docusaurus/theme-mermaid@3.9.2':
+ resolution: {integrity: sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==}
+ engines: {node: '>=20.0'}
+ peerDependencies:
+ '@mermaid-js/layout-elk': ^0.1.9
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@mermaid-js/layout-elk':
+ optional: true
+
+ '@docusaurus/theme-search-algolia@3.9.2':
+ resolution: {integrity: sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==}
engines: {node: '>=20.0'}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/theme-translations@3.9.1':
- resolution: {integrity: sha512-mUQd49BSGKTiM6vP9+JFgRJL28lMIN3PUvXjF3rzuOHMByUZUBNwCt26Z23GkKiSIOrRkjKoaBNTipR/MHdYSQ==}
+ '@docusaurus/theme-translations@3.9.2':
+ resolution: {integrity: sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==}
engines: {node: '>=20.0'}
- '@docusaurus/tsconfig@3.9.1':
- resolution: {integrity: sha512-stdzM1dNDgRO0OvxeznXlE3N1igUoeHPNJjiKqyffLizgpVgNXJBAWeG6fuoYiCH4udGUBqy2dyM+1+kG2/UPQ==}
+ '@docusaurus/tsconfig@3.9.2':
+ resolution: {integrity: sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==}
- '@docusaurus/types@3.9.1':
- resolution: {integrity: sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==}
+ '@docusaurus/types@3.9.2':
+ resolution: {integrity: sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/utils-common@3.9.1':
- resolution: {integrity: sha512-4M1u5Q8Zn2CYL2TJ864M51FV4YlxyGyfC3x+7CLuR6xsyTVNBNU4QMcPgsTHRS9J2+X6Lq7MyH6hiWXyi/sXUQ==}
+ '@docusaurus/utils-common@3.9.2':
+ resolution: {integrity: sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==}
engines: {node: '>=20.0'}
- '@docusaurus/utils-validation@3.9.1':
- resolution: {integrity: sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ==}
+ '@docusaurus/utils-validation@3.9.2':
+ resolution: {integrity: sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==}
engines: {node: '>=20.0'}
- '@docusaurus/utils@3.9.1':
- resolution: {integrity: sha512-YAL4yhhWLl9DXuf5MVig260a6INz4MehrBGFU/CZu8yXmRiYEuQvRFWh9ZsjfAOyaG7za1MNmBVZ4VVAi/CiJA==}
+ '@docusaurus/utils@3.9.2':
+ resolution: {integrity: sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==}
engines: {node: '>=20.0'}
'@dotenvx/dotenvx@1.51.0':
@@ -2231,6 +2272,12 @@ packages:
peerDependencies:
react-hook-form: ^7.55.0
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@3.0.2':
+ resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==}
+
'@inquirer/external-editor@1.0.2':
resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
engines: {node: '>=18'}
@@ -2398,6 +2445,14 @@ packages:
'@types/react': '>=16'
react: '>=16'
+ '@mermaid-js/layout-elk@0.1.9':
+ resolution: {integrity: sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw==}
+ peerDependencies:
+ mermaid: ^11.0.2
+
+ '@mermaid-js/parser@0.6.3':
+ resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==}
+
'@mjackson/node-fetch-server@0.2.0':
resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==}
@@ -4780,33 +4835,99 @@ packages:
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+ '@types/d3-axis@3.0.6':
+ resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
+
+ '@types/d3-brush@3.0.6':
+ resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
+
+ '@types/d3-chord@3.0.6':
+ resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
+
'@types/d3-color@3.1.3':
resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+ '@types/d3-contour@3.0.6':
+ resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
+
+ '@types/d3-delaunay@6.0.4':
+ resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
+
+ '@types/d3-dispatch@3.0.7':
+ resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
+
+ '@types/d3-drag@3.0.7':
+ resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+
+ '@types/d3-dsv@3.0.7':
+ resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
'@types/d3-ease@3.0.2':
resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+ '@types/d3-fetch@3.0.7':
+ resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+ '@types/d3-force@3.0.10':
+ resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
+ '@types/d3-format@3.0.4':
+ resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
+
+ '@types/d3-geo@3.1.0':
+ resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+ '@types/d3-hierarchy@3.1.7':
+ resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
'@types/d3-interpolate@3.0.4':
resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
'@types/d3-path@3.1.1':
resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+ '@types/d3-polygon@3.0.2':
+ resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
+
+ '@types/d3-quadtree@3.0.6':
+ resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+ '@types/d3-random@3.0.3':
+ resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+ '@types/d3-scale-chromatic@3.1.0':
+ resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
'@types/d3-scale@4.0.9':
resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+ '@types/d3-selection@3.0.11':
+ resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
+
'@types/d3-shape@3.1.7':
resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+ '@types/d3-time-format@4.0.3':
+ resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
+
'@types/d3-time@3.0.4':
resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
'@types/d3-timer@3.0.2':
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+ '@types/d3-transition@3.0.9':
+ resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
+
'@types/d3-voronoi@1.1.12':
resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==}
+ '@types/d3-zoom@3.0.8':
+ resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+
+ '@types/d3@7.4.3':
+ resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
+
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
@@ -5001,6 +5122,9 @@ packages:
'@types/tedious@4.0.14':
resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==}
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
'@types/unist@2.0.11':
resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
@@ -5586,6 +5710,14 @@ packages:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
engines: {node: '>= 6'}
+ chevrotain-allstar@0.3.1:
+ resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==}
+ peerDependencies:
+ chevrotain: ^11.0.0
+
+ chevrotain@11.0.3:
+ resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==}
+
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -5715,6 +5847,12 @@ packages:
concaveman@1.2.1:
resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==}
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.2:
+ resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -5774,6 +5912,12 @@ packages:
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+ cose-base@1.0.3:
+ resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
+
+ cose-base@2.2.0:
+ resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
+
cosmiconfig@8.3.6:
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
@@ -5912,6 +6056,20 @@ packages:
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ cytoscape-cose-bilkent@4.1.0:
+ resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+
+ cytoscape-fcose@2.2.0:
+ resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+
+ cytoscape@3.33.1:
+ resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==}
+ engines: {node: '>=0.10'}
+
d3-array@1.2.4:
resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
@@ -5919,14 +6077,55 @@ packages:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
+ d3-axis@3.0.0:
+ resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+ engines: {node: '>=12'}
+
+ d3-brush@3.0.0:
+ resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+ engines: {node: '>=12'}
+
+ d3-chord@3.0.1:
+ resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+ engines: {node: '>=12'}
+
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
+ d3-contour@4.0.2:
+ resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ engines: {node: '>=12'}
+
+ d3-delaunay@6.0.4:
+ resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
+ engines: {node: '>=12'}
+
+ d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+
+ d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+
+ d3-dsv@3.0.1:
+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+
d3-ease@3.0.1:
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
+ d3-fetch@3.0.1:
+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+
+ d3-force@3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+
d3-format@3.1.0:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
@@ -5934,18 +6133,55 @@ packages:
d3-geo@1.7.1:
resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==}
+ d3-geo@3.1.1:
+ resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
+ engines: {node: '>=12'}
+
+ d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
+ d3-path@1.0.9:
+ resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
+ d3-polygon@3.0.1:
+ resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+ engines: {node: '>=12'}
+
+ d3-quadtree@3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+
+ d3-random@3.0.1:
+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+
+ d3-sankey@0.12.3:
+ resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
+
+ d3-scale-chromatic@3.1.0:
+ resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+ engines: {node: '>=12'}
+
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
+ d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+
+ d3-shape@1.3.7:
+ resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
@@ -5962,9 +6198,26 @@ packages:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
+ d3-transition@3.0.1:
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+
d3-voronoi@1.1.2:
resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==}
+ d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+
+ d3@7.9.0:
+ resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
+ engines: {node: '>=12'}
+
+ dagre-d3-es@7.0.13:
+ resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==}
+
data-view-buffer@1.0.2:
resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
engines: {node: '>= 0.4'}
@@ -5983,6 +6236,9 @@ packages:
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
+ dayjs@1.11.19:
+ resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
+
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -6071,6 +6327,9 @@ packages:
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+ delaunator@5.0.1:
+ resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
@@ -6149,6 +6408,9 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
+ dompurify@3.3.0:
+ resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
+
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
@@ -6292,6 +6554,9 @@ packages:
electron-to-chromium@1.5.244:
resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==}
+ elkjs@0.9.3:
+ resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -6509,6 +6774,9 @@ packages:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
@@ -6820,6 +7088,10 @@ packages:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
+ globals@15.15.0:
+ resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ engines: {node: '>=18'}
+
globals@16.5.0:
resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'}
@@ -6868,6 +7140,9 @@ packages:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
+ hachure-fill@0.5.2:
+ resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
+
handle-thing@2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
@@ -7057,6 +7332,10 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
iconv-lite@0.7.0:
resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
engines: {node: '>=0.10.0'}
@@ -7498,12 +7777,19 @@ packages:
resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==}
engines: {node: '>= 12'}
+ katex@0.16.25:
+ resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==}
+ hasBin: true
+
kdbush@4.0.2:
resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ khroma@2.1.0:
+ resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
+
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
@@ -7512,10 +7798,17 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
kysely@0.28.8:
resolution: {integrity: sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==}
engines: {node: '>=20.0.0'}
+ langium@3.3.1:
+ resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
+ engines: {node: '>=16.0.0'}
+
latest-version@7.0.0:
resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
engines: {node: '>=14.16'}
@@ -7523,6 +7816,12 @@ packages:
launch-editor@2.12.0:
resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==}
+ layout-base@1.0.2:
+ resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
+
+ layout-base@2.0.1:
+ resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
+
leac@0.6.0:
resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==}
@@ -7621,6 +7920,10 @@ packages:
resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
engines: {node: '>=8.9.0'}
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
@@ -7633,6 +7936,9 @@ packages:
resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -7838,6 +8144,9 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
+ mermaid@11.12.1:
+ resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==}
+
methods@1.1.2:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
@@ -8060,6 +8369,9 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
+ mlly@1.8.0:
+ resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
module-details-from-path@1.0.4:
resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
@@ -8353,6 +8665,9 @@ packages:
package-manager-detector@0.2.11:
resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+ package-manager-detector@1.5.0:
+ resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==}
+
pako@2.1.0:
resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
@@ -8395,6 +8710,9 @@ packages:
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ path-data-parser@0.1.0:
+ resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
+
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -8477,12 +8795,24 @@ packages:
resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
engines: {node: '>=14.16'}
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
point-in-polygon-hao@1.2.4:
resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==}
point-in-polygon@1.1.0:
resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
+ points-on-curve@0.2.0:
+ resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
+
+ points-on-path@0.2.1:
+ resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
+
polyclip-ts@0.16.8:
resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==}
@@ -9493,6 +9823,9 @@ packages:
rou3@0.5.1:
resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==}
+ roughjs@4.6.6:
+ resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
+
rtlcss@4.3.0:
resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==}
engines: {node: '>=12.0.0'}
@@ -9902,6 +10235,9 @@ packages:
peerDependencies:
postcss: ^8.4.31
+ stylis@4.3.6:
+ resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
subtag@0.5.0:
resolution: {integrity: sha512-CaIBcTSb/nyk4xiiSOtZYz1B+F12ZxW8NEp54CdT+84vmh/h4sUnHGC6+KQXUfED8u22PQjCYWfZny8d2ELXwg==}
@@ -10010,6 +10346,10 @@ packages:
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+ tinyexec@1.0.2:
+ resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+ engines: {node: '>=18'}
+
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
@@ -10078,6 +10418,10 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+ ts-dedent@2.2.0:
+ resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+ engines: {node: '>=6.10'}
+
tsconfck@3.1.6:
resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
engines: {node: ^18 || >=20}
@@ -10224,6 +10568,9 @@ packages:
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+ ufo@1.6.1:
+ resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
uint8array-extras@1.5.0:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
@@ -10368,6 +10715,10 @@ packages:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
+ uuid@11.1.0:
+ resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+ hasBin: true
+
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -10497,6 +10848,26 @@ packages:
jsdom:
optional: true
+ vscode-jsonrpc@8.2.0:
+ resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
+
+ vscode-languageserver-protocol@3.17.5:
+ resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+ vscode-languageserver-textdocument@1.0.12:
+ resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+
+ vscode-languageserver-types@3.17.5:
+ resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ vscode-languageserver@9.0.1:
+ resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+ hasBin: true
+
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
watchpack@2.4.4:
resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==}
engines: {node: '>=10.13.0'}
@@ -10884,6 +11255,13 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
+ '@antfu/install-pkg@1.1.0':
+ dependencies:
+ package-manager-detector: 1.5.0
+ tinyexec: 1.0.2
+
+ '@antfu/utils@9.3.0': {}
+
'@apm-js-collab/code-transformer@0.8.2': {}
'@apm-js-collab/tracing-hooks@0.3.1':
@@ -11711,6 +12089,8 @@ snapshots:
'@borewit/text-codec@0.1.1': {}
+ '@braintree/sanitize-url@7.1.1': {}
+
'@changesets/apply-release-plan@7.0.13':
dependencies:
'@changesets/config': 3.1.1
@@ -11855,6 +12235,23 @@ snapshots:
human-id: 4.1.2
prettier: 2.8.8
+ '@chevrotain/cst-dts-gen@11.0.3':
+ dependencies:
+ '@chevrotain/gast': 11.0.3
+ '@chevrotain/types': 11.0.3
+ lodash-es: 4.17.21
+
+ '@chevrotain/gast@11.0.3':
+ dependencies:
+ '@chevrotain/types': 11.0.3
+ lodash-es: 4.17.21
+
+ '@chevrotain/regexp-to-ast@11.0.3': {}
+
+ '@chevrotain/types@11.0.3': {}
+
+ '@chevrotain/utils@11.0.3': {}
+
'@colors/colors@1.5.0':
optional: true
@@ -12169,7 +12566,7 @@ snapshots:
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/babel@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/babel@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
'@babel/core': 7.28.5
'@babel/generator': 7.28.5
@@ -12181,8 +12578,8 @@ snapshots:
'@babel/runtime': 7.28.4
'@babel/runtime-corejs3': 7.28.4
'@babel/traverse': 7.28.5
- '@docusaurus/logger': 3.9.1
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
babel-plugin-dynamic-import-node: 2.3.3
fs-extra: 11.3.2
tslib: 2.8.1
@@ -12195,14 +12592,14 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/bundler@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/bundler@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
'@babel/core': 7.28.5
- '@docusaurus/babel': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/cssnano-preset': 3.9.1
- '@docusaurus/logger': 3.9.1
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/babel': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/cssnano-preset': 3.9.2
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
babel-loader: 9.2.1(@babel/core@7.28.5)(webpack@5.102.1(@swc/core@1.15.0))
clean-css: 5.3.3
copy-webpack-plugin: 11.0.0(webpack@5.102.1(@swc/core@1.15.0))
@@ -12222,7 +12619,7 @@ snapshots:
webpack: 5.102.1(@swc/core@1.15.0)
webpackbar: 6.0.1(webpack@5.102.1(@swc/core@1.15.0))
optionalDependencies:
- '@docusaurus/faster': 3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
+ '@docusaurus/faster': 3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))
transitivePeerDependencies:
- '@parcel/css'
- '@rspack/core'
@@ -12238,15 +12635,15 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/core@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/core@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/babel': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/bundler': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/babel': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/bundler': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0)
boxen: 6.2.1
chalk: 4.1.2
@@ -12302,16 +12699,16 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/cssnano-preset@3.9.1':
+ '@docusaurus/cssnano-preset@3.9.2':
dependencies:
cssnano-preset-advanced: 6.1.2(postcss@8.5.6)
postcss: 8.5.6
postcss-sort-media-queries: 5.2.0(postcss@8.5.6)
tslib: 2.8.1
- '@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))':
+ '@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))':
dependencies:
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@rspack/core': 1.6.0
'@swc/core': 1.15.0
'@swc/html': 1.15.0
@@ -12326,16 +12723,16 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/logger@3.9.1':
+ '@docusaurus/logger@3.9.2':
dependencies:
chalk: 4.1.2
tslib: 2.8.1
- '@docusaurus/mdx-loader@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/mdx-loader@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/logger': 3.9.1
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@mdx-js/mdx': 3.1.1
'@slorber/remark-comment': 1.0.0
escape-html: 1.0.3
@@ -12366,9 +12763,9 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/module-type-aliases@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/module-type-aliases@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@types/history': 4.7.11
'@types/react': 19.2.2
'@types/react-router-config': 5.0.11
@@ -12384,17 +12781,17 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/plugin-content-blog@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
- dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/plugin-content-docs': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
cheerio: 1.0.0-rc.12
feed: 4.2.2
fs-extra: 11.3.2
@@ -12425,17 +12822,17 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
- dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/module-type-aliases': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@types/react-router-config': 5.0.11
combine-promises: 1.2.0
fs-extra: 11.3.2
@@ -12465,13 +12862,13 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-content-pages@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-content-pages@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
fs-extra: 11.3.2
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@@ -12495,12 +12892,12 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-css-cascade-layers@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-css-cascade-layers@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
tslib: 2.8.1
transitivePeerDependencies:
- '@docusaurus/faster'
@@ -12522,11 +12919,11 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-debug@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-debug@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
fs-extra: 11.3.2
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@@ -12550,11 +12947,11 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-google-analytics@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-google-analytics@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
tslib: 2.8.1
@@ -12576,11 +12973,11 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-google-gtag@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-google-gtag@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@types/gtag.js': 0.0.12
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@@ -12603,11 +13000,11 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-google-tag-manager@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-google-tag-manager@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
tslib: 2.8.1
@@ -12629,14 +13026,14 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-sitemap@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-sitemap@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
fs-extra: 11.3.2
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@@ -12660,12 +13057,12 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/plugin-svgr@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ '@docusaurus/plugin-svgr@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@svgr/core': 8.1.0(typescript@5.9.3)
'@svgr/webpack': 8.1.0(typescript@5.9.3)
react: 19.2.0
@@ -12690,23 +13087,23 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/preset-classic@3.9.1(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)':
- dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-content-pages': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-css-cascade-layers': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-debug': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-google-analytics': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-google-gtag': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-google-tag-manager': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-sitemap': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-svgr': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/theme-classic': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/theme-search-algolia': 3.9.1(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-content-pages': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-css-cascade-layers': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-debug': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-google-analytics': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-google-gtag': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-google-tag-manager': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-sitemap': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-svgr': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/theme-classic': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
transitivePeerDependencies:
@@ -12735,21 +13132,21 @@ snapshots:
'@types/react': 19.2.2
react: 19.2.0
- '@docusaurus/theme-classic@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
- dependencies:
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/plugin-content-blog': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/plugin-content-pages': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/theme-translations': 3.9.1
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-classic@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/module-type-aliases': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-content-docs': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/plugin-content-pages': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-translations': 3.9.2
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0)
clsx: 2.1.1
infima: 0.2.0-alpha.45
@@ -12782,13 +13179,13 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/theme-common@3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/mdx-loader': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/module-type-aliases': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/mdx-loader': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/module-type-aliases': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/plugin-content-docs': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@types/history': 4.7.11
'@types/react': 19.2.2
'@types/react-router-config': 5.0.11
@@ -12806,16 +13203,48 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/theme-search-algolia@3.9.1(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)':
+ '@docusaurus/theme-mermaid@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
+ dependencies:
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/module-type-aliases': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ mermaid: 11.12.1
+ react: 19.2.0
+ react-dom: 19.2.0(react@19.2.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@mermaid-js/layout-elk': 0.1.9(mermaid@11.12.1)
+ transitivePeerDependencies:
+ - '@docusaurus/faster'
+ - '@docusaurus/plugin-content-docs'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - webpack-cli
+
+ '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)':
dependencies:
'@docsearch/react': 4.2.0(@algolia/client-search@5.42.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)
- '@docusaurus/core': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/logger': 3.9.1
- '@docusaurus/plugin-content-docs': 3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/theme-common': 3.9.1(@docusaurus/plugin-content-docs@3.9.1(@docusaurus/faster@3.9.1(@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/theme-translations': 3.9.1
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/plugin-content-docs': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
+ '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/theme-translations': 3.9.2
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
algoliasearch: 5.42.0
algoliasearch-helper: 3.26.0(algoliasearch@5.42.0)
clsx: 2.1.1
@@ -12847,14 +13276,14 @@ snapshots:
- utf-8-validate
- webpack-cli
- '@docusaurus/theme-translations@3.9.1':
+ '@docusaurus/theme-translations@3.9.2':
dependencies:
fs-extra: 11.3.2
tslib: 2.8.1
- '@docusaurus/tsconfig@3.9.1': {}
+ '@docusaurus/tsconfig@3.9.2': {}
- '@docusaurus/types@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
'@mdx-js/mdx': 3.1.1
'@types/history': 4.7.11
@@ -12875,9 +13304,9 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils-common@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/utils-common@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
tslib: 2.8.1
transitivePeerDependencies:
- '@swc/core'
@@ -12888,11 +13317,11 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils-validation@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/utils-validation@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/logger': 3.9.1
- '@docusaurus/utils': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/utils': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
fs-extra: 11.3.2
joi: 17.13.3
js-yaml: 4.1.0
@@ -12907,11 +13336,11 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils@3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
+ '@docusaurus/utils@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
- '@docusaurus/logger': 3.9.1
- '@docusaurus/types': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-common': 3.9.1(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/logger': 3.9.2
+ '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ '@docusaurus/utils-common': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
escape-string-regexp: 4.0.0
execa: 5.1.1
file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.15.0))
@@ -13167,6 +13596,21 @@ snapshots:
'@standard-schema/utils': 0.3.0
react-hook-form: 7.66.0(react@19.2.0)
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@3.0.2':
+ dependencies:
+ '@antfu/install-pkg': 1.1.0
+ '@antfu/utils': 9.3.0
+ '@iconify/types': 2.0.0
+ debug: 4.4.3
+ globals: 15.15.0
+ kolorist: 1.8.0
+ local-pkg: 1.1.2
+ mlly: 1.8.0
+ transitivePeerDependencies:
+ - supports-color
+
'@inquirer/external-editor@1.0.2(@types/node@24.10.0)':
dependencies:
chardet: 2.1.1
@@ -13397,6 +13841,16 @@ snapshots:
'@types/react': 19.2.2
react: 19.2.0
+ '@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1)':
+ dependencies:
+ d3: 7.9.0
+ elkjs: 0.9.3
+ mermaid: 11.12.1
+
+ '@mermaid-js/parser@0.6.3':
+ dependencies:
+ langium: 3.3.1
+
'@mjackson/node-fetch-server@0.2.0': {}
'@module-federation/error-codes@0.21.2': {}
@@ -16732,30 +17186,123 @@ snapshots:
'@types/d3-array@3.2.2': {}
+ '@types/d3-axis@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-brush@3.0.6':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-chord@3.0.6': {}
+
'@types/d3-color@3.1.3': {}
+ '@types/d3-contour@3.0.6':
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-delaunay@6.0.4': {}
+
+ '@types/d3-dispatch@3.0.7': {}
+
+ '@types/d3-drag@3.0.7':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3-dsv@3.0.7': {}
+
'@types/d3-ease@3.0.2': {}
+ '@types/d3-fetch@3.0.7':
+ dependencies:
+ '@types/d3-dsv': 3.0.7
+
+ '@types/d3-force@3.0.10': {}
+
+ '@types/d3-format@3.0.4': {}
+
+ '@types/d3-geo@3.1.0':
+ dependencies:
+ '@types/geojson': 7946.0.16
+
+ '@types/d3-hierarchy@3.1.7': {}
+
'@types/d3-interpolate@3.0.4':
dependencies:
'@types/d3-color': 3.1.3
'@types/d3-path@3.1.1': {}
+ '@types/d3-polygon@3.0.2': {}
+
+ '@types/d3-quadtree@3.0.6': {}
+
+ '@types/d3-random@3.0.3': {}
+
+ '@types/d3-scale-chromatic@3.1.0': {}
+
'@types/d3-scale@4.0.9':
dependencies:
'@types/d3-time': 3.0.4
+ '@types/d3-selection@3.0.11': {}
+
'@types/d3-shape@3.1.7':
dependencies:
'@types/d3-path': 3.1.1
+ '@types/d3-time-format@4.0.3': {}
+
'@types/d3-time@3.0.4': {}
'@types/d3-timer@3.0.2': {}
+ '@types/d3-transition@3.0.9':
+ dependencies:
+ '@types/d3-selection': 3.0.11
+
'@types/d3-voronoi@1.1.12': {}
+ '@types/d3-zoom@3.0.8':
+ dependencies:
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-selection': 3.0.11
+
+ '@types/d3@7.4.3':
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/d3-axis': 3.0.6
+ '@types/d3-brush': 3.0.6
+ '@types/d3-chord': 3.0.6
+ '@types/d3-color': 3.1.3
+ '@types/d3-contour': 3.0.6
+ '@types/d3-delaunay': 6.0.4
+ '@types/d3-dispatch': 3.0.7
+ '@types/d3-drag': 3.0.7
+ '@types/d3-dsv': 3.0.7
+ '@types/d3-ease': 3.0.2
+ '@types/d3-fetch': 3.0.7
+ '@types/d3-force': 3.0.10
+ '@types/d3-format': 3.0.4
+ '@types/d3-geo': 3.1.0
+ '@types/d3-hierarchy': 3.1.7
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-path': 3.1.1
+ '@types/d3-polygon': 3.0.2
+ '@types/d3-quadtree': 3.0.6
+ '@types/d3-random': 3.0.3
+ '@types/d3-scale': 4.0.9
+ '@types/d3-scale-chromatic': 3.1.0
+ '@types/d3-selection': 3.0.11
+ '@types/d3-shape': 3.1.7
+ '@types/d3-time': 3.0.4
+ '@types/d3-time-format': 4.0.3
+ '@types/d3-timer': 3.0.2
+ '@types/d3-transition': 3.0.9
+ '@types/d3-zoom': 3.0.8
+
'@types/debug@4.1.12':
dependencies:
'@types/ms': 2.1.0
@@ -16946,7 +17493,7 @@ snapshots:
'@types/sax@1.2.7':
dependencies:
- '@types/node': 17.0.45
+ '@types/node': 24.10.0
'@types/send@0.17.6':
dependencies:
@@ -16981,6 +17528,9 @@ snapshots:
dependencies:
'@types/node': 24.10.0
+ '@types/trusted-types@2.0.7':
+ optional: true
+
'@types/unist@2.0.11': {}
'@types/unist@3.0.3': {}
@@ -17652,6 +18202,20 @@ snapshots:
parse5: 7.3.0
parse5-htmlparser2-tree-adapter: 7.1.0
+ chevrotain-allstar@0.3.1(chevrotain@11.0.3):
+ dependencies:
+ chevrotain: 11.0.3
+ lodash-es: 4.17.21
+
+ chevrotain@11.0.3:
+ dependencies:
+ '@chevrotain/cst-dts-gen': 11.0.3
+ '@chevrotain/gast': 11.0.3
+ '@chevrotain/regexp-to-ast': 11.0.3
+ '@chevrotain/types': 11.0.3
+ '@chevrotain/utils': 11.0.3
+ lodash-es: 4.17.21
+
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -17779,6 +18343,10 @@ snapshots:
robust-predicates: 2.0.4
tinyqueue: 2.0.3
+ confbox@0.1.8: {}
+
+ confbox@0.2.2: {}
+
config-chain@1.1.13:
dependencies:
ini: 1.3.8
@@ -17832,6 +18400,14 @@ snapshots:
core-util-is@1.0.3: {}
+ cose-base@1.0.3:
+ dependencies:
+ layout-base: 1.0.2
+
+ cose-base@2.2.0:
+ dependencies:
+ layout-base: 2.0.1
+
cosmiconfig@8.3.6(typescript@5.9.3):
dependencies:
import-fresh: 3.3.1
@@ -17992,28 +18568,109 @@ snapshots:
csstype@3.1.3: {}
+ cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1):
+ dependencies:
+ cose-base: 1.0.3
+ cytoscape: 3.33.1
+
+ cytoscape-fcose@2.2.0(cytoscape@3.33.1):
+ dependencies:
+ cose-base: 2.2.0
+ cytoscape: 3.33.1
+
+ cytoscape@3.33.1: {}
+
d3-array@1.2.4: {}
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
+ d3-axis@3.0.0: {}
+
+ d3-brush@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ d3-chord@3.0.1:
+ dependencies:
+ d3-path: 3.1.0
+
d3-color@3.1.0: {}
+ d3-contour@4.0.2:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-delaunay@6.0.4:
+ dependencies:
+ delaunator: 5.0.1
+
+ d3-dispatch@3.0.1: {}
+
+ d3-drag@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+
+ d3-dsv@3.0.1:
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+
d3-ease@3.0.1: {}
+ d3-fetch@3.0.1:
+ dependencies:
+ d3-dsv: 3.0.1
+
+ d3-force@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+
d3-format@3.1.0: {}
d3-geo@1.7.1:
dependencies:
d3-array: 1.2.4
+ d3-geo@3.1.1:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-hierarchy@3.1.2: {}
+
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
+ d3-path@1.0.9: {}
+
d3-path@3.1.0: {}
+ d3-polygon@3.0.1: {}
+
+ d3-quadtree@3.0.1: {}
+
+ d3-random@3.0.1: {}
+
+ d3-sankey@0.12.3:
+ dependencies:
+ d3-array: 1.2.4
+ d3-shape: 1.3.7
+
+ d3-scale-chromatic@3.1.0:
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
@@ -18022,6 +18679,12 @@ snapshots:
d3-time: 3.1.0
d3-time-format: 4.1.0
+ d3-selection@3.0.0: {}
+
+ d3-shape@1.3.7:
+ dependencies:
+ d3-path: 1.0.9
+
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
@@ -18036,8 +18699,63 @@ snapshots:
d3-timer@3.0.1: {}
+ d3-transition@3.0.1(d3-selection@3.0.0):
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+
d3-voronoi@1.1.2: {}
+ d3-zoom@3.0.0:
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+
+ d3@7.9.0:
+ dependencies:
+ d3-array: 3.2.4
+ d3-axis: 3.0.0
+ d3-brush: 3.0.0
+ d3-chord: 3.0.1
+ d3-color: 3.1.0
+ d3-contour: 4.0.2
+ d3-delaunay: 6.0.4
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-format: 3.1.0
+ d3-geo: 3.1.1
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-polygon: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.1.0
+ d3-selection: 3.0.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ d3-timer: 3.0.1
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ d3-zoom: 3.0.0
+
+ dagre-d3-es@7.0.13:
+ dependencies:
+ d3: 7.9.0
+ lodash-es: 4.17.21
+
data-view-buffer@1.0.2:
dependencies:
call-bound: 1.0.4
@@ -18060,6 +18778,8 @@ snapshots:
date-fns@4.1.0: {}
+ dayjs@1.11.19: {}
+
debounce@1.2.1: {}
debug@2.6.9:
@@ -18122,6 +18842,10 @@ snapshots:
defu@6.1.4: {}
+ delaunator@5.0.1:
+ dependencies:
+ robust-predicates: 3.0.2
+
delayed-stream@1.0.0: {}
depd@1.1.2: {}
@@ -18195,6 +18919,10 @@ snapshots:
dependencies:
domelementtype: 2.3.0
+ dompurify@3.3.0:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
domutils@2.8.0:
dependencies:
dom-serializer: 1.4.1
@@ -18262,6 +18990,8 @@ snapshots:
electron-to-chromium@1.5.244: {}
+ elkjs@0.9.3: {}
+
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
@@ -18594,6 +19324,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ exsolve@1.0.8: {}
+
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
@@ -18920,6 +19652,8 @@ snapshots:
dependencies:
ini: 2.0.0
+ globals@15.15.0: {}
+
globals@16.5.0: {}
globalthis@1.0.4:
@@ -18993,6 +19727,8 @@ snapshots:
dependencies:
duplexer: 0.1.2
+ hachure-fill@0.5.2: {}
+
handle-thing@2.0.1: {}
hard-rejection@2.1.0: {}
@@ -19276,6 +20012,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
iconv-lite@0.7.0:
dependencies:
safer-buffer: 2.1.2
@@ -19660,18 +20400,34 @@ snapshots:
jsts@2.7.1: {}
+ katex@0.16.25:
+ dependencies:
+ commander: 8.3.0
+
kdbush@4.0.2: {}
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
+ khroma@2.1.0: {}
+
kind-of@6.0.3: {}
kleur@3.0.3: {}
+ kolorist@1.8.0: {}
+
kysely@0.28.8: {}
+ langium@3.3.1:
+ dependencies:
+ chevrotain: 11.0.3
+ chevrotain-allstar: 0.3.1(chevrotain@11.0.3)
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+
latest-version@7.0.0:
dependencies:
package-json: 8.1.1
@@ -19681,6 +20437,10 @@ snapshots:
picocolors: 1.1.1
shell-quote: 1.8.3
+ layout-base@1.0.2: {}
+
+ layout-base@2.0.1: {}
+
leac@0.6.0: {}
lerc@3.0.0: {}
@@ -19752,6 +20512,12 @@ snapshots:
emojis-list: 3.0.0
json5: 2.2.3
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.0
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
@@ -19764,6 +20530,8 @@ snapshots:
dependencies:
p-locate: 6.0.0
+ lodash-es@4.17.21: {}
+
lodash.debounce@4.0.8: {}
lodash.memoize@4.1.2: {}
@@ -20119,6 +20887,31 @@ snapshots:
merge2@1.4.1: {}
+ mermaid@11.12.1:
+ dependencies:
+ '@braintree/sanitize-url': 7.1.1
+ '@iconify/utils': 3.0.2
+ '@mermaid-js/parser': 0.6.3
+ '@types/d3': 7.4.3
+ cytoscape: 3.33.1
+ cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1)
+ cytoscape-fcose: 2.2.0(cytoscape@3.33.1)
+ d3: 7.9.0
+ d3-sankey: 0.12.3
+ dagre-d3-es: 7.0.13
+ dayjs: 1.11.19
+ dompurify: 3.3.0
+ katex: 0.16.25
+ khroma: 2.1.0
+ lodash-es: 4.17.21
+ marked: 16.4.1
+ roughjs: 4.6.6
+ stylis: 4.3.6
+ ts-dedent: 2.2.0
+ uuid: 11.1.0
+ transitivePeerDependencies:
+ - supports-color
+
methods@1.1.2: {}
mgrs@1.0.0: {}
@@ -20489,6 +21282,13 @@ snapshots:
minipass@7.1.2: {}
+ mlly@1.8.0:
+ dependencies:
+ acorn: 8.15.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.1
+
module-details-from-path@1.0.4: {}
morgan@1.10.1:
@@ -20769,6 +21569,8 @@ snapshots:
dependencies:
quansync: 0.2.11
+ package-manager-detector@1.5.0: {}
+
pako@2.1.0: {}
param-case@3.0.4:
@@ -20824,6 +21626,8 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
+ path-data-parser@0.1.0: {}
+
path-exists@4.0.0: {}
path-exists@5.0.0: {}
@@ -20888,12 +21692,31 @@ snapshots:
dependencies:
find-up: 6.3.0
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.0
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.2
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
point-in-polygon-hao@1.2.4:
dependencies:
robust-predicates: 3.0.2
point-in-polygon@1.1.0: {}
+ points-on-curve@0.2.0: {}
+
+ points-on-path@0.2.1:
+ dependencies:
+ path-data-parser: 0.1.0
+ points-on-curve: 0.2.0
+
polyclip-ts@0.16.8:
dependencies:
bignumber.js: 9.3.1
@@ -22071,6 +22894,13 @@ snapshots:
rou3@0.5.1: {}
+ roughjs@4.6.6:
+ dependencies:
+ hachure-fill: 0.5.2
+ path-data-parser: 0.1.0
+ points-on-curve: 0.2.0
+ points-on-path: 0.2.1
+
rtlcss@4.3.0:
dependencies:
escalade: 3.2.0
@@ -22540,6 +23370,8 @@ snapshots:
postcss: 8.5.6
postcss-selector-parser: 6.1.2
+ stylis@4.3.6: {}
+
subtag@0.5.0: {}
suggestions@1.7.1:
@@ -22635,6 +23467,8 @@ snapshots:
tinyexec@0.3.2: {}
+ tinyexec@1.0.2: {}
+
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
@@ -22690,6 +23524,8 @@ snapshots:
trough@2.2.0: {}
+ ts-dedent@2.2.0: {}
+
tsconfck@3.1.6(typescript@5.9.3):
optionalDependencies:
typescript: 5.9.3
@@ -22827,6 +23663,8 @@ snapshots:
uc.micro@2.1.0: {}
+ ufo@1.6.1: {}
+
uint8array-extras@1.5.0: {}
unbox-primitive@1.1.0:
@@ -22979,6 +23817,8 @@ snapshots:
utils-merge@1.0.1: {}
+ uuid@11.1.0: {}
+
uuid@8.3.2: {}
valibot@1.1.0(typescript@5.9.3):
@@ -23117,6 +23957,23 @@ snapshots:
- tsx
- yaml
+ vscode-jsonrpc@8.2.0: {}
+
+ vscode-languageserver-protocol@3.17.5:
+ dependencies:
+ vscode-jsonrpc: 8.2.0
+ vscode-languageserver-types: 3.17.5
+
+ vscode-languageserver-textdocument@1.0.12: {}
+
+ vscode-languageserver-types@3.17.5: {}
+
+ vscode-languageserver@9.0.1:
+ dependencies:
+ vscode-languageserver-protocol: 3.17.5
+
+ vscode-uri@3.0.8: {}
+
watchpack@2.4.4:
dependencies:
glob-to-regexp: 0.4.1
From fe0ae0eb33eeddebd130d397a52607500dcf562b Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 09:44:16 +0100
Subject: [PATCH 02/11] docs: add missing columns of harvestable
---
fdm-docs/docs/core-concepts/01-database-schema.md | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/fdm-docs/docs/core-concepts/01-database-schema.md b/fdm-docs/docs/core-concepts/01-database-schema.md
index 1d2f46f40..1144296f1 100644
--- a/fdm-docs/docs/core-concepts/01-database-schema.md
+++ b/fdm-docs/docs/core-concepts/01-database-schema.md
@@ -209,8 +209,15 @@ This schema holds the primary data related to farm operations.
| Column | Type | Constraints | Description |
|-----------------------------|-----------------------------|-------------|-----------------------------------------------------------------------------|
| **b_id_harvestable_analysis**| `text` | Primary Key | Unique identifier for the harvest analysis record. |
-| **b_lu_yield** | `numeric` (custom) | | Measured yield of the harvestable product (units may vary, e.g., kg/ha). |
-| **b_lu_n_harvestable** | `numeric` (custom) | | Nitrogen content in the harvested portion. |
+| **b_lu_yield** | `numeric` (custom) | | Measured dry matter yield of the harvestable product (kg DM / ha). |
+| **b_lu_yield_fresh** | `numeric` (custom) | | Measured fresh yield of the harvestable product (kg fresh / ha). |
+| **b_lu_yield_bruto** | `numeric` (custom) | | Measured gross yield (including tare) of the harvestable product (kg fresh / ha). |
+| **b_lu_tarra** | `numeric` (custom) | | Measured tarra (tare) of the harvestable product (%). |
+| **b_lu_dm** | `numeric` (custom) | | Measured dry matter content of the harvestable product (g DM / kg fresh). |
+| **b_lu_moist** | `numeric` (custom) | | Measured moisture content of the harvestable product (%). |
+| **b_lu_uww** | `numeric` (custom) | | Measured underwater weight of the harvestable product (g / 5 kg). |
+| **b_lu_cp** | `numeric` (custom) | | Measured crude protein content of the harvestable product (g RE / kg DM). |
+| **b_lu_n_harvestable** | `numeric` (custom) | | Nitrogen content in the harvested portion (g N/ kg DM). |
| **b_lu_n_residue** | `numeric` (custom) | | Nitrogen content in the crop residue. |
| **b_lu_p_harvestable** | `numeric` (custom) | | Phosphorus content in the harvested portion. |
| **b_lu_p_residue** | `numeric` (custom) | | Phosphorus content in the crop residue. |
From ce11bfae0792464f797370be6ee0508c124d7359 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 17:06:23 +0100
Subject: [PATCH 03/11] docs: more improvements
---
.../agronomic-calculations/01-nitrogen.md | 258 ------------------
.../02-norms-and-regulations.md | 26 --
.../nl/2025/01-index.md | 39 ---
fdm-docs/docs/balance/01-nitrogen.md | 258 ------------------
fdm-docs/docs/balance/_category_.json | 8 -
fdm-docs/docs/contributing/_category_.json | 2 +-
fdm-docs/docs/core-concepts/02-farms.md | 4 +-
.../docs/core-concepts/04-cultivations.md | 2 +-
fdm-docs/docs/core-concepts/08-catalogues.md | 10 -
.../docs/core-concepts/09-authentication.md | 36 ++-
.../docs/getting-started/01-what-is-fdm.md | 2 +-
.../02-the-asset-action-model.md | 71 +++--
.../01-nitrogen-balance.md | 0
.../_category_.json | 4 +-
.../fertilizer-application-norms/01-index.md | 36 +++
.../_category_.json | 4 +
.../nl/2025/01-index.md | 10 +-
.../nl/2025/_category_.json | 0
.../nl/2025/dierlijke-mest-gebruiksnorm.md | 0
.../nl/2025/fosfaatgebruiksnorm.md | 0
.../nl/2025/stikstofgebruiksnorm.md | 0
.../nl/_category_.json | 0
fdm-docs/docs/norms/_category_.json | 8 -
fdm-docs/docs/norms/nl/2025/_category_.json | 8 -
.../nl/2025/dierlijke-mest-gebruiksnorm.md | 72 -----
.../docs/norms/nl/2025/fosfaatgebruiksnorm.md | 118 --------
.../norms/nl/2025/stikstofgebruiksnorm.md | 107 --------
fdm-docs/docs/norms/nl/_category_.json | 4 -
28 files changed, 109 insertions(+), 978 deletions(-)
delete mode 100644 fdm-docs/docs/agronomic-calculations/01-nitrogen.md
delete mode 100644 fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
delete mode 100644 fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
delete mode 100644 fdm-docs/docs/balance/01-nitrogen.md
delete mode 100644 fdm-docs/docs/balance/_category_.json
rename fdm-docs/docs/{agronomic-calculations => insights}/01-nitrogen-balance.md (100%)
rename fdm-docs/docs/{agronomic-calculations => insights}/_category_.json (57%)
create mode 100644 fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
create mode 100644 fdm-docs/docs/insights/fertilizer-application-norms/_category_.json
rename fdm-docs/docs/{norms => insights/fertilizer-application-norms}/nl/2025/01-index.md (70%)
rename fdm-docs/docs/{agronomic-calculations => insights/fertilizer-application-norms}/nl/2025/_category_.json (100%)
rename fdm-docs/docs/{agronomic-calculations => insights/fertilizer-application-norms}/nl/2025/dierlijke-mest-gebruiksnorm.md (100%)
rename fdm-docs/docs/{agronomic-calculations => insights/fertilizer-application-norms}/nl/2025/fosfaatgebruiksnorm.md (100%)
rename fdm-docs/docs/{agronomic-calculations => insights/fertilizer-application-norms}/nl/2025/stikstofgebruiksnorm.md (100%)
rename fdm-docs/docs/{agronomic-calculations => insights/fertilizer-application-norms}/nl/_category_.json (100%)
delete mode 100644 fdm-docs/docs/norms/_category_.json
delete mode 100644 fdm-docs/docs/norms/nl/2025/_category_.json
delete mode 100644 fdm-docs/docs/norms/nl/2025/dierlijke-mest-gebruiksnorm.md
delete mode 100644 fdm-docs/docs/norms/nl/2025/fosfaatgebruiksnorm.md
delete mode 100644 fdm-docs/docs/norms/nl/2025/stikstofgebruiksnorm.md
delete mode 100644 fdm-docs/docs/norms/nl/_category_.json
diff --git a/fdm-docs/docs/agronomic-calculations/01-nitrogen.md b/fdm-docs/docs/agronomic-calculations/01-nitrogen.md
deleted file mode 100644
index cde60305a..000000000
--- a/fdm-docs/docs/agronomic-calculations/01-nitrogen.md
+++ /dev/null
@@ -1,258 +0,0 @@
----
-title: Nitrogen Balance Calculation
-sidebar_label: Nitrogen
----
-
-# Nitrogen Balance Calculation
-
-This document explains how the nitrogen (N) balance is calculated within the FDM Calculator. The balance provides insights into nitrogen inputs, outputs, and potential surpluses or deficits on a per-field basis, which are then aggregated to the farm level. It serves as a critical tool for agronomists and farmers to optimize nutrient management, enhance crop productivity, and minimize environmental impacts.
-
-## 1. Overview
-
-Nitrogen is a macronutrient essential for plant growth, playing a vital role in photosynthesis, protein synthesis, and overall crop development. However, nitrogen is also highly dynamic in agricultural systems, subject to various inputs, outputs, and transformations. An accurate nitrogen balance helps in understanding the nitrogen cycle on a farm, identifying potential nutrient deficiencies or surpluses, and guiding sustainable fertilization practices.
-
-The final nitrogen balance for each field is determined by the formula:
-
-```text
-N Balance (kg N / ha) = N Supply - N Removal - N-NH3 Emission
-```
-
-Where:
-* **N Supply:** Nitrogen added to the field.
-* **N Removal:** Nitrogen taken off the field.
-* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
-
-(Note: In the calculation, N Removal and N-NH3 Emission are typically treated as negative values when summing components to derive the final balance.)
-
-The calculations are performed for a user-defined **Time Frame**.
-
-## 2. Required Input Data
-
-Accurate N balance calculation relies on comprehensive input data that captures the various aspects of farm management and environmental conditions influencing nitrogen dynamics.
-
-* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
- * Unique ID, area (ha), centroid coordinates (for deposition).
- * Start and end dates defining the field's existence (if different from the balance time frame).
-* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
- * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
- * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
-* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
- * Links to the specific `b_lu` (cultivation instance).
- * `harvestable_analyses` array containing:
- * Yield of harvested product (`b_lu_yield`, kg / ha).
- * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
- * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
-* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
- * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
- * Key parameters used:
- * Agricultural soil type (`b_soiltype_agr`).
- * Total N content (`a_n_rt`, mg N / kg).
- * Organic carbon (`a_c_of`, g C / kg).
- * C / N ratio (`a_cn_fr`).
- * Bulk density (`a_density_sa`, g / cm³).
- * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
- * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
-* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
- * Application amount (`p_app_amount`, kg / ha).
- * Link to fertilizer type via `p_id_catalogue`.
-* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
- * `FertilizerCatalogue` (`FertilizerDetail`):
- * Total N content (`p_n_rt`, g N / kg).
- * Nitrate content (`p_no3_rt`, g N / kg)
- * Ammonium content (`p_nh4_rt`, g N/ kg)
- * Sulfur content (`p_s_rt`, g SO3 / kg)
- * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
- * `CultivationCatalogue` (`CultivationDetail`):
- * Default yield (`b_lu_yield`, kg / ha).
- * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
- * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
- * Harvest Index (`b_lu_hi`, fraction).
- * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
-
-## 3. Calculation Components
-
-### 3.1. Nitrogen Supply (kg N / ha)
-
-Nitrogen supply encompasses all pathways by which nitrogen becomes available to the crop and the soil system. Understanding these inputs is crucial for optimizing nutrient management and ensuring adequate nitrogen for crop growth while minimizing environmental losses.
-
-Total N supply is the sum of N from fertilizers, biological fixation, atmospheric deposition, and soil mineralization.
-
-#### 3.1.1. Fertilizers
-
-Fertilizers are a primary and often controlled source of nitrogen input in agricultural systems, applied to meet specific crop nutrient demands. Different fertilizer types have varying nitrogen forms and release characteristics.
-* **Formula per application:**
- `N_supplied (kg N / ha) = Amount_applied (kg / ha) * (Total_N_content (g N / kg) / 1000)`
-* Contributions are summed for each category:
- * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
- * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
- * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
- * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
-
-#### 3.1.2. Biological Fixation
-
-Biological nitrogen fixation is a natural process where atmospheric nitrogen (N2) is converted into plant-available forms (e.g., ammonia) by microorganisms, primarily symbiotic bacteria associated with leguminous crops (e.g., clover, beans, peas). This process significantly contributes to the nitrogen supply in agricultural ecosystems, reducing the need for mineral nitrogen fertilizers.
-* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
-* These values are summed if multiple N-fixing crops are involved.
-
-#### 3.1.3. Atmospheric Deposition
-
-Atmospheric deposition refers to the input of nitrogen compounds from the atmosphere to the Earth's surface. This occurs through both wet deposition (e.g., nitrogen dissolved in rain, snow) and dry deposition (e.g., gaseous ammonia, nitric acid vapor, particulate matter). These deposited nitrogen forms can be utilized by plants, thus contributing to the overall nitrogen supply in the field.
-* **Method:**
- 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
- 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
- * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
- 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
- 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
- `Deposition_period (kg N / ha) = Annual_Deposition (kg N / ha / year) * (Days_in_TimeFrame + 1) / 365`
-
-#### 3.1.4. Soil Mineralization
-
-Soil mineralization is a crucial biological process where organic nitrogen (N) compounds in soil organic matter (SOM) are converted by microorganisms into inorganic, plant-available forms, primarily ammonium (NH4+). This process can be a source of nitrogen for crops. The calculation of nitrogen mineralization is based on default values that depend on the soil type and land use (grassland or arable land).
-
-* **Method:**
- 1. The calculation is performed for each year within the specified `TimeFrame`.
- 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
- 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
-
-| Soil Type (`b_soiltype_agr`) | Land Use | Annual N Mineralization (kg N / ha / year) |
-| :--- | :--- | :--- |
-| `dalgrond` | Arable or Grassland | 20 |
-| `veen` | Grassland | 160 |
-| `veen` | Arable Land | 20 |
-| Other | Arable or Grassland | 0 |
-
- 4. The annual mineralization rate is then pro-rated for the number of days the field is active within the `TimeFrame` for that year:
- `Mineralization_period (kg N / ha) = Annual_N_Min (kg N / ha / year) * Days_in_TimeFrame_for_the_year / 365`
-
-### 3.2. Nitrogen Removal (kg N / ha)
-
-Nitrogen removal accounts for the nitrogen that leaves the field system, primarily through the harvest of crops and the removal of crop residues. Quantifying these outputs is essential for understanding the net nitrogen balance and assessing nutrient cycling efficiency. These are calculated as negative values in the balance equation.
-
-#### 3.2.1. Harvested Products
-
-The harvest of crops is typically the largest pathway for nitrogen removal from agricultural fields. Nitrogen is assimilated by plants during growth and stored in various plant parts, including the economically valuable harvested portion (e.g., grain, tubers, forage).
-* **Formula per harvest:**
- `N_removed (kg N / ha) = Yield (kg / ha) * N_Content_Harvestable (g N / kg) / 1000 * -1`
-* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
-* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
-
-#### 3.2.2. Crop Residues
-
-Crop residues (e.g., straw, stover, roots) contain significant amounts of nitrogen. Their management is crucial for the field's nitrogen balance. If residues are removed from the field (e.g., for animal feed, bedding, or bioenergy), the nitrogen contained within them is considered a removal from the field system. If residues are left on the field and incorporated into the soil, their nitrogen contributes to the soil organic matter pool and will be subject to mineralization.
-* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
-* **Residue Mass Estimation:**
- 1. Average yield for the cultivation is determined (from actual harvests or catalogue default).
- 2. Harvest Index (`b_lu_hi`) is from `CultivationCatalogue`. The Harvest Index is the ratio of harvested biomass to total above-ground biomass.
- 3. Residue Proportion = `1 - b_lu_hi`. This represents the fraction of total above-ground biomass that remains as residue.
- 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
-* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
-* **Formula per cultivation:**
- `N_removed_residue (kg N / ha) = Residue_Mass (kg / ha) * N_Content_Residue (g N / kg) / 1000 * -1`
-
-### 3.3. Nitrogen Emission (kg N / ha)
-
-Nitrogen emission refers to the loss of nitrogen from the agricultural system to the wider environment. This includes losses to the atmosphere, such as ammonia (NH₃) volatilization, and losses to water, such as nitrate (NO₃⁻) leaching. Accurately quantifying these emissions is crucial for improving nitrogen use efficiency and minimizing environmental impacts like air and water pollution.
-
-The total N emission is the sum of all calculated emission pathways. Currently, this includes ammonia emissions from fertilizers and crop residues. In the future, this will be expanded to include nitrate leaching.
-
-The calculations for ammonia emissions are derived from the **NEMA model (Nutrient Emission Model for Agriculture)**, a Dutch model used to estimate nutrient losses from agricultural sources.
-
-#### 3.3.1. Nitrate Leaching (Future Implementation)
-
-Nitrate leaching represents the loss of nitrogen to water bodies. In the FDM Calculator, this will be calculated as a fraction of the **Nitrogen Balance**. The balance is defined as `N Supply - N Removal - Ammonia Emission`. This approach acknowledges that leaching is primarily driven by the excess nitrogen that remains in the soil after crop uptake.
-
-*Note: This component is not yet implemented and currently returns `0`.*
-
-#### 3.3.2. Ammonia from Fertilizers
-
-Ammonia emissions from fertilizers are calculated differently depending on the fertilizer type.
-
-* **Manure, Compost, and Other Organic Fertilizers:**
- For these organic fertilizers, the emission is calculated based on the Total Ammoniacal Nitrogen (TAN) content, as this is the amount of nitrogen that is readily available for volatilization.
-
- * **Formula:**
- `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * TAN Content (g N / kg) / 1000 * Emission Factor (fraction)`
- Where:
- * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
- * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
- * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
-
- * **Emission Factors for Manure and Compost:**
-
- | Application Method | Grassland | Cropland | Bare Soil |
- | :-------------------- | :-------- | :------- | :-------- |
- | Broadcasting | 0.68 | N/A | 0.69 |
- | Narrowband | 0.264 | 0.36 | 0.36 |
- | Slotted Coulters | 0.217 | N/A | 0.30 |
- | Shallow Injection | 0.17 | 0.24 | 0.25 |
- | Incorporation | N/A | N/A | 0.22 |
- | Incorporation 2 Tracks| N/A | N/A | 0.46 |
-
- *Note: "N/A" indicates that the method is not typically used or supported for that land type in the calculation model, and will result in an error if attempted.*
-
-* **Mineral Fertilizers:**
- For mineral fertilizers, the emission is calculated based on the **total nitrogen content (`p_n_rt`)** of the fertilizer and the **emission factor**.
-
- * **Formula:**
- `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
- Where:
- * `Application Amount`: `p_app_amount` (kg / ha).
- * `Total N Content`: `p_n_rt` (fraction).
- * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
-
- `Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
-
- Where:
- * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
- * `p_no3_rt`: Nitrate content.
- * `p_nh4_rt`: Ammonium content (TAN).
- * `p_s_rt`: Sulfur content.
- * `K_1`, `K_2`, `K_3`: Empirical constants.
- * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
- * If no inhibitor: `K_1 = 7.021 * 10^-5`
- * `K_2 = -4.308 * 10^-5`
- * `K_3 = 2.498 * 10^-4`
- *Note: Currently, the presence of an inhibitor (`p_inhibitor`) is hardcoded to `false` in the calculation.*
-
-
-
-#### 3.3.3. Ammonia from Crop Residues
-
-Ammonia emissions from crop residues occur when residues are left on the field and decompose, releasing nitrogen compounds that can volatilize. The calculation of these emissions is based on the amount of nitrogen in the crop residues and a specific emission factor.
-
-* **Formula per cultivation:**
- `NH3 Emission (kg N / ha) = Residue N Content (kg N / ha) * Emission Factor (fraction)`
- Where:
- * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
- * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
-
- * **Emission Factor Formula:**
- `Emission Factor = (0.41 * b_lu_n_residue (g/kg dry matter)) - 5.42`
- Where:
- * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
-
-*Note: Ammonia emissions from crop residues are only calculated if the `m_cropresidue` flag is `false` or `null`, indicating that residues are incorporated into the soil rather than removed.*
-
-#### 3.3.4. Ammonia from Grazing
-
-Ammonia emissions from grazing are currently not calculated in the FDM Calculator and are set to `0`.
-
-## 4. Field and Farm Level Balance
-
-* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
-* **Farm Balance:**
- 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
- 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
-
-## 5. Output
-
-The final output (`NitrogenBalanceNumeric`) provides:
-* Overall farm balance, supply, removal, and total emission (kg N / ha).
-* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
- * Field ID.
- * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
- * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
- * Detailed breakdown of removal (total, harvests, residues).
- * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
-
-All values are rounded numbers.
diff --git a/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md b/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
deleted file mode 100644
index 2d55d5e38..000000000
--- a/fdm-docs/docs/agronomic-calculations/02-norms-and-regulations.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: Norms and Regulations
-sidebar_label: Norms and Regulations
----
-
-# Norms and Regulations
-
-The `fdm-calculator` is not only a tool for agronomic calculations, but also a powerful engine for ensuring compliance with legal and regional norms. This is particularly important for nutrient management, where regulations are often in place to protect the environment.
-
-## Implementation of Norms
-
-Norms and regulations are implemented in the `fdm-calculator` as a series of checks and constraints that are applied to the input data. For example, when calculating fertilizer recommendations, the calculator will take into account the legal limits for nutrient application in specific regions, such as Nitrate Vulnerable Zones (NVZs).
-
-The calculator includes a detailed implementation of the Dutch nutrient management regulations for 2025. This includes the following usage norms (`gebruiksnormen`):
-
-* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./nl/2025/stikstofgebruiksnorm.md):** This norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation takes into account the main crop, the geographical location (including `NV-gebieden`), and the soil region.
-* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./nl/2025/fosfaatgebruiksnorm.md):** This norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. The maximum is determined by the land use type (grassland or arable land) and the phosphate status of the soil.
-* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./nl/2025/dierlijke-mest-gebruiksnorm.md):** This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
-
-For more detailed information on these norms, please refer to the specific pages for each one.
-
-## Customization
-
-The `fdm-calculator` is designed to be flexible and customizable. You can define your own sets of norms and regulations to meet the specific requirements of your region or certification scheme.
-
-This is done by providing a custom configuration file that specifies the limits and constraints for different nutrients and regions.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md b/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
deleted file mode 100644
index 91653fba7..000000000
--- a/fdm-docs/docs/agronomic-calculations/nl/2025/01-index.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: 2025 Dutch Fertilizer Application Norms
-sidebar_label: "Introduction"
-position: 1
----
-
-# Calculating the 2025 Dutch Fertilizer Application Norms
-
-This guide explains how the FDM Calculator determines the official Dutch legal usage norms (`gebruiksnormen`) for nitrogen and phosphate for the year 2025. These calculations are essential for ensuring your farm management plan complies with national environmental regulations.
-
-The FDM Calculator automates these complex calculations based on your specific farm, field, and cultivation data. It calculates three key norms:
-
-1. **Nitrogen Usage Norm (`Stikstofgebruiksnorm`)**: The maximum effective nitrogen from all fertilizers.
-2. **Phosphate Usage Norm (`Fosfaatgebruiksnorm`)**: The maximum phosphate, based on your soil's phosphate status.
-3. **Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)**: The maximum nitrogen from animal manure, with specific rules for derogation farms.
-
-:::danger Official Source & Disclaimer
-The calculations in this document are based on the official 2025 norms published by the RVO (Rijksdienst voor Ondernemend Nederland). While we strive for accuracy, this document is for informational purposes only.
-
-Always consult your agricultural advisor for definitive guidance and values tailored to your specific situation. FDM is not liable for any discrepancies or decisions made based on this information.
-:::
-
-## How the Calculator Works: Required Data
-
-To calculate the norms for a specific field, the FDM Calculator requires the following information for the 2025 calendar year.
-
-* **Farm Details**:
- * **Derogation Status**: Does the farm have a derogation permit for 2025? This is a critical factor for nitrogen and animal manure norms.
-
-* **Field & Location**:
- * **Field Location**: The precise geographical coordinates of the field are used to determine if it falls within special regulatory zones, such as Nutrient-Polluted Areas (`NV-gebieden`), Groundwater Protection Areas (`GWBG-gebieden`), or specific soil regions (sand, clay, peat, loess).
-
-* **Cultivation Plan for 2025**:
- * **Main Crop (`hoofdteelt`)**: The primary crop grown on the field. The calculator identifies the main crop as the one with the longest cultivation period between May 15th and July 15th.
- * **Crop Variety**: For certain crops like potatoes and flowers, the specific variety can result in a higher or lower nitrogen norm.
- * **Cultivation Dates**: The start and end dates of cultivation are crucial for time-sensitive norms, such as those for temporary grassland.
-
-* **Latest Soil Analysis Data**:
- * **Phosphate Levels**: The P-CaCl2 (or P-PAE) and P-Al values from your most recent soil test are used to classify the soil's phosphate status, which directly determines the phosphate usage norm.
diff --git a/fdm-docs/docs/balance/01-nitrogen.md b/fdm-docs/docs/balance/01-nitrogen.md
deleted file mode 100644
index cde60305a..000000000
--- a/fdm-docs/docs/balance/01-nitrogen.md
+++ /dev/null
@@ -1,258 +0,0 @@
----
-title: Nitrogen Balance Calculation
-sidebar_label: Nitrogen
----
-
-# Nitrogen Balance Calculation
-
-This document explains how the nitrogen (N) balance is calculated within the FDM Calculator. The balance provides insights into nitrogen inputs, outputs, and potential surpluses or deficits on a per-field basis, which are then aggregated to the farm level. It serves as a critical tool for agronomists and farmers to optimize nutrient management, enhance crop productivity, and minimize environmental impacts.
-
-## 1. Overview
-
-Nitrogen is a macronutrient essential for plant growth, playing a vital role in photosynthesis, protein synthesis, and overall crop development. However, nitrogen is also highly dynamic in agricultural systems, subject to various inputs, outputs, and transformations. An accurate nitrogen balance helps in understanding the nitrogen cycle on a farm, identifying potential nutrient deficiencies or surpluses, and guiding sustainable fertilization practices.
-
-The final nitrogen balance for each field is determined by the formula:
-
-```text
-N Balance (kg N / ha) = N Supply - N Removal - N-NH3 Emission
-```
-
-Where:
-* **N Supply:** Nitrogen added to the field.
-* **N Removal:** Nitrogen taken off the field.
-* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
-
-(Note: In the calculation, N Removal and N-NH3 Emission are typically treated as negative values when summing components to derive the final balance.)
-
-The calculations are performed for a user-defined **Time Frame**.
-
-## 2. Required Input Data
-
-Accurate N balance calculation relies on comprehensive input data that captures the various aspects of farm management and environmental conditions influencing nitrogen dynamics.
-
-* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
- * Unique ID, area (ha), centroid coordinates (for deposition).
- * Start and end dates defining the field's existence (if different from the balance time frame).
-* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
- * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
- * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
-* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
- * Links to the specific `b_lu` (cultivation instance).
- * `harvestable_analyses` array containing:
- * Yield of harvested product (`b_lu_yield`, kg / ha).
- * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
- * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
-* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
- * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
- * Key parameters used:
- * Agricultural soil type (`b_soiltype_agr`).
- * Total N content (`a_n_rt`, mg N / kg).
- * Organic carbon (`a_c_of`, g C / kg).
- * C / N ratio (`a_cn_fr`).
- * Bulk density (`a_density_sa`, g / cm³).
- * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
- * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
-* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
- * Application amount (`p_app_amount`, kg / ha).
- * Link to fertilizer type via `p_id_catalogue`.
-* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
- * `FertilizerCatalogue` (`FertilizerDetail`):
- * Total N content (`p_n_rt`, g N / kg).
- * Nitrate content (`p_no3_rt`, g N / kg)
- * Ammonium content (`p_nh4_rt`, g N/ kg)
- * Sulfur content (`p_s_rt`, g SO3 / kg)
- * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
- * `CultivationCatalogue` (`CultivationDetail`):
- * Default yield (`b_lu_yield`, kg / ha).
- * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
- * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
- * Harvest Index (`b_lu_hi`, fraction).
- * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
-
-## 3. Calculation Components
-
-### 3.1. Nitrogen Supply (kg N / ha)
-
-Nitrogen supply encompasses all pathways by which nitrogen becomes available to the crop and the soil system. Understanding these inputs is crucial for optimizing nutrient management and ensuring adequate nitrogen for crop growth while minimizing environmental losses.
-
-Total N supply is the sum of N from fertilizers, biological fixation, atmospheric deposition, and soil mineralization.
-
-#### 3.1.1. Fertilizers
-
-Fertilizers are a primary and often controlled source of nitrogen input in agricultural systems, applied to meet specific crop nutrient demands. Different fertilizer types have varying nitrogen forms and release characteristics.
-* **Formula per application:**
- `N_supplied (kg N / ha) = Amount_applied (kg / ha) * (Total_N_content (g N / kg) / 1000)`
-* Contributions are summed for each category:
- * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
- * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
- * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
- * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
-
-#### 3.1.2. Biological Fixation
-
-Biological nitrogen fixation is a natural process where atmospheric nitrogen (N2) is converted into plant-available forms (e.g., ammonia) by microorganisms, primarily symbiotic bacteria associated with leguminous crops (e.g., clover, beans, peas). This process significantly contributes to the nitrogen supply in agricultural ecosystems, reducing the need for mineral nitrogen fertilizers.
-* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
-* These values are summed if multiple N-fixing crops are involved.
-
-#### 3.1.3. Atmospheric Deposition
-
-Atmospheric deposition refers to the input of nitrogen compounds from the atmosphere to the Earth's surface. This occurs through both wet deposition (e.g., nitrogen dissolved in rain, snow) and dry deposition (e.g., gaseous ammonia, nitric acid vapor, particulate matter). These deposited nitrogen forms can be utilized by plants, thus contributing to the overall nitrogen supply in the field.
-* **Method:**
- 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
- 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
- * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
- 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
- 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
- `Deposition_period (kg N / ha) = Annual_Deposition (kg N / ha / year) * (Days_in_TimeFrame + 1) / 365`
-
-#### 3.1.4. Soil Mineralization
-
-Soil mineralization is a crucial biological process where organic nitrogen (N) compounds in soil organic matter (SOM) are converted by microorganisms into inorganic, plant-available forms, primarily ammonium (NH4+). This process can be a source of nitrogen for crops. The calculation of nitrogen mineralization is based on default values that depend on the soil type and land use (grassland or arable land).
-
-* **Method:**
- 1. The calculation is performed for each year within the specified `TimeFrame`.
- 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
- 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
-
-| Soil Type (`b_soiltype_agr`) | Land Use | Annual N Mineralization (kg N / ha / year) |
-| :--- | :--- | :--- |
-| `dalgrond` | Arable or Grassland | 20 |
-| `veen` | Grassland | 160 |
-| `veen` | Arable Land | 20 |
-| Other | Arable or Grassland | 0 |
-
- 4. The annual mineralization rate is then pro-rated for the number of days the field is active within the `TimeFrame` for that year:
- `Mineralization_period (kg N / ha) = Annual_N_Min (kg N / ha / year) * Days_in_TimeFrame_for_the_year / 365`
-
-### 3.2. Nitrogen Removal (kg N / ha)
-
-Nitrogen removal accounts for the nitrogen that leaves the field system, primarily through the harvest of crops and the removal of crop residues. Quantifying these outputs is essential for understanding the net nitrogen balance and assessing nutrient cycling efficiency. These are calculated as negative values in the balance equation.
-
-#### 3.2.1. Harvested Products
-
-The harvest of crops is typically the largest pathway for nitrogen removal from agricultural fields. Nitrogen is assimilated by plants during growth and stored in various plant parts, including the economically valuable harvested portion (e.g., grain, tubers, forage).
-* **Formula per harvest:**
- `N_removed (kg N / ha) = Yield (kg / ha) * N_Content_Harvestable (g N / kg) / 1000 * -1`
-* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
-* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
-
-#### 3.2.2. Crop Residues
-
-Crop residues (e.g., straw, stover, roots) contain significant amounts of nitrogen. Their management is crucial for the field's nitrogen balance. If residues are removed from the field (e.g., for animal feed, bedding, or bioenergy), the nitrogen contained within them is considered a removal from the field system. If residues are left on the field and incorporated into the soil, their nitrogen contributes to the soil organic matter pool and will be subject to mineralization.
-* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
-* **Residue Mass Estimation:**
- 1. Average yield for the cultivation is determined (from actual harvests or catalogue default).
- 2. Harvest Index (`b_lu_hi`) is from `CultivationCatalogue`. The Harvest Index is the ratio of harvested biomass to total above-ground biomass.
- 3. Residue Proportion = `1 - b_lu_hi`. This represents the fraction of total above-ground biomass that remains as residue.
- 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
-* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
-* **Formula per cultivation:**
- `N_removed_residue (kg N / ha) = Residue_Mass (kg / ha) * N_Content_Residue (g N / kg) / 1000 * -1`
-
-### 3.3. Nitrogen Emission (kg N / ha)
-
-Nitrogen emission refers to the loss of nitrogen from the agricultural system to the wider environment. This includes losses to the atmosphere, such as ammonia (NH₃) volatilization, and losses to water, such as nitrate (NO₃⁻) leaching. Accurately quantifying these emissions is crucial for improving nitrogen use efficiency and minimizing environmental impacts like air and water pollution.
-
-The total N emission is the sum of all calculated emission pathways. Currently, this includes ammonia emissions from fertilizers and crop residues. In the future, this will be expanded to include nitrate leaching.
-
-The calculations for ammonia emissions are derived from the **NEMA model (Nutrient Emission Model for Agriculture)**, a Dutch model used to estimate nutrient losses from agricultural sources.
-
-#### 3.3.1. Nitrate Leaching (Future Implementation)
-
-Nitrate leaching represents the loss of nitrogen to water bodies. In the FDM Calculator, this will be calculated as a fraction of the **Nitrogen Balance**. The balance is defined as `N Supply - N Removal - Ammonia Emission`. This approach acknowledges that leaching is primarily driven by the excess nitrogen that remains in the soil after crop uptake.
-
-*Note: This component is not yet implemented and currently returns `0`.*
-
-#### 3.3.2. Ammonia from Fertilizers
-
-Ammonia emissions from fertilizers are calculated differently depending on the fertilizer type.
-
-* **Manure, Compost, and Other Organic Fertilizers:**
- For these organic fertilizers, the emission is calculated based on the Total Ammoniacal Nitrogen (TAN) content, as this is the amount of nitrogen that is readily available for volatilization.
-
- * **Formula:**
- `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * TAN Content (g N / kg) / 1000 * Emission Factor (fraction)`
- Where:
- * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
- * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
- * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
-
- * **Emission Factors for Manure and Compost:**
-
- | Application Method | Grassland | Cropland | Bare Soil |
- | :-------------------- | :-------- | :------- | :-------- |
- | Broadcasting | 0.68 | N/A | 0.69 |
- | Narrowband | 0.264 | 0.36 | 0.36 |
- | Slotted Coulters | 0.217 | N/A | 0.30 |
- | Shallow Injection | 0.17 | 0.24 | 0.25 |
- | Incorporation | N/A | N/A | 0.22 |
- | Incorporation 2 Tracks| N/A | N/A | 0.46 |
-
- *Note: "N/A" indicates that the method is not typically used or supported for that land type in the calculation model, and will result in an error if attempted.*
-
-* **Mineral Fertilizers:**
- For mineral fertilizers, the emission is calculated based on the **total nitrogen content (`p_n_rt`)** of the fertilizer and the **emission factor**.
-
- * **Formula:**
- `NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
- Where:
- * `Application Amount`: `p_app_amount` (kg / ha).
- * `Total N Content`: `p_n_rt` (fraction).
- * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
-
- `Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
-
- Where:
- * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
- * `p_no3_rt`: Nitrate content.
- * `p_nh4_rt`: Ammonium content (TAN).
- * `p_s_rt`: Sulfur content.
- * `K_1`, `K_2`, `K_3`: Empirical constants.
- * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
- * If no inhibitor: `K_1 = 7.021 * 10^-5`
- * `K_2 = -4.308 * 10^-5`
- * `K_3 = 2.498 * 10^-4`
- *Note: Currently, the presence of an inhibitor (`p_inhibitor`) is hardcoded to `false` in the calculation.*
-
-
-
-#### 3.3.3. Ammonia from Crop Residues
-
-Ammonia emissions from crop residues occur when residues are left on the field and decompose, releasing nitrogen compounds that can volatilize. The calculation of these emissions is based on the amount of nitrogen in the crop residues and a specific emission factor.
-
-* **Formula per cultivation:**
- `NH3 Emission (kg N / ha) = Residue N Content (kg N / ha) * Emission Factor (fraction)`
- Where:
- * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
- * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
-
- * **Emission Factor Formula:**
- `Emission Factor = (0.41 * b_lu_n_residue (g/kg dry matter)) - 5.42`
- Where:
- * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
-
-*Note: Ammonia emissions from crop residues are only calculated if the `m_cropresidue` flag is `false` or `null`, indicating that residues are incorporated into the soil rather than removed.*
-
-#### 3.3.4. Ammonia from Grazing
-
-Ammonia emissions from grazing are currently not calculated in the FDM Calculator and are set to `0`.
-
-## 4. Field and Farm Level Balance
-
-* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
-* **Farm Balance:**
- 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
- 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
-
-## 5. Output
-
-The final output (`NitrogenBalanceNumeric`) provides:
-* Overall farm balance, supply, removal, and total emission (kg N / ha).
-* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
- * Field ID.
- * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
- * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
- * Detailed breakdown of removal (total, harvests, residues).
- * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
-
-All values are rounded numbers.
diff --git a/fdm-docs/docs/balance/_category_.json b/fdm-docs/docs/balance/_category_.json
deleted file mode 100644
index 9498ac145..000000000
--- a/fdm-docs/docs/balance/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "label": "Nutrient Balance",
- "position": 5,
- "link": {
- "type": "generated-index",
- "description": "Learn about how nutrient balances are calculated with `fdm-calculator`."
- }
-}
diff --git a/fdm-docs/docs/contributing/_category_.json b/fdm-docs/docs/contributing/_category_.json
index 9b4b65284..1efa06740 100644
--- a/fdm-docs/docs/contributing/_category_.json
+++ b/fdm-docs/docs/contributing/_category_.json
@@ -1,6 +1,6 @@
{
"label": "Contributing to FDM",
- "position": 4,
+ "position": 6,
"link": {
"type": "generated-index",
"description": "This section is for developers who want to contribute to the FDM project itself."
diff --git a/fdm-docs/docs/core-concepts/02-farms.md b/fdm-docs/docs/core-concepts/02-farms.md
index beb28ea5d..9b8df5e63 100644
--- a/fdm-docs/docs/core-concepts/02-farms.md
+++ b/fdm-docs/docs/core-concepts/02-farms.md
@@ -4,7 +4,7 @@ title: Farms
# Farms
-The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming operation and is the primary organizational unit within the system.
+The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming operation and is the primary unit within the system.
## Properties
@@ -27,6 +27,6 @@ For a detailed explanation of the authorization system, please see the [Authoriz
In addition to the basic properties, a `Farm` can have several other types of data associated with it:
* **Organic Certifications:** You can store information about a farm's organic certifications in the `organicCertifications` and `organicCertificationsHolding` tables. This includes details like the certification body, certification numbers (e.g., TRACES, Skal), and the dates the certification was issued and expires.
-* **Derogations:** The `derogations` and `derogationApplying` tables are used to track any special permissions (derogations) that a farm has been granted for a specific year. These are often related to legal norms for fertilizer application.
+* **Derogations:** The `derogations` and `derogationApplying` tables are used to track any special permissions (derogations) that a farm has been granted for a specific year. These are related to legal norms for fertilizer application.
* **Grazing Intentions:** The `intendingGrazing` table allows you to record a farm's intention to graze animals for a specific year. This is a boolean flag associated with the farm and the year.
* **Catalogue Preferences:** The `fertilizerCatalogueEnabling` and `cultivationCatalogueSelecting` tables allow you to specify which data sources a farm uses for its fertilizer and cultivation catalogues. This provides flexibility in managing standardized data.
diff --git a/fdm-docs/docs/core-concepts/04-cultivations.md b/fdm-docs/docs/core-concepts/04-cultivations.md
index ee8bc4a44..642031890 100644
--- a/fdm-docs/docs/core-concepts/04-cultivations.md
+++ b/fdm-docs/docs/core-concepts/04-cultivations.md
@@ -17,7 +17,7 @@ A `Cultivation` is defined by a sequence of actions that are stored in separate
2. **`cultivationHarvesting`**: This action represents the gathering of the crop. It links a `cultivation` to a `harvestable` and records the `b_lu_harvest_date`. A single cultivation can have multiple harvesting events.
3. **`cultivationEnding`**: This action marks the end of a cultivation. It records the `b_lu_end` date and whether the crop residue was left on the field (`m_cropresidue`).
-This sequence of actions defines a single cultivation period. A `Field` can have multiple cultivations over time, but only one active cultivation at any given time.
+This sequence of actions defines a single cultivation period. A `Field` can have multiple cultivations over time, be fallow or have multiple cultivations on the same time.
## Linking to Catalogues
diff --git a/fdm-docs/docs/core-concepts/08-catalogues.md b/fdm-docs/docs/core-concepts/08-catalogues.md
index e81c7d3e7..77aa92e99 100644
--- a/fdm-docs/docs/core-concepts/08-catalogues.md
+++ b/fdm-docs/docs/core-concepts/08-catalogues.md
@@ -24,13 +24,3 @@ The `fdm-data` package includes the following catalogues, which are stored in th
## Farm-Specific Catalogue Selection
FDM provides a flexible system for managing which catalogues a farm uses. The `cultivationCatalogueSelecting` and `fertilizerCatalogueEnabling` tables allow each farm to specify which catalogue sources (`b_lu_source` and `p_source`) they want to use. This allows for customization and localization of the standardized data.
-
-## Benefits of Data Consistency
-
-The data consistency provided by the catalogues is essential for a wide range of applications, including:
-
-* **Benchmarking:** Comparing the performance of different farms or fields.
-* **Agronomic Modeling:** Building accurate models to predict crop growth and nutrient dynamics.
-* **Supply Chain Management:** Tracking the flow of agricultural products from farm to fork.
-
-By providing a common language for describing agricultural data, the catalogues in `fdm-data` play a crucial role in enabling a more connected and data-driven agricultural industry.
diff --git a/fdm-docs/docs/core-concepts/09-authentication.md b/fdm-docs/docs/core-concepts/09-authentication.md
index a8d8e2174..5231fa13c 100644
--- a/fdm-docs/docs/core-concepts/09-authentication.md
+++ b/fdm-docs/docs/core-concepts/09-authentication.md
@@ -4,23 +4,35 @@ title: Authentication
# Authentication
-Authentication is the process of verifying the identity of a user. The Farm Data Model (FDM) provides a standard authentication system that supports a variety of authentication strategies.
+Authentication is the process of verifying the identity of a user. The Farm Data Model (FDM) utilizes the [Better Auth](https://better-auth.com/) library to provide a standard authentication system. This implementation supports multiple authentication strategies and handles session management through a database-backed approach.
-## How Users are Verified
+## Supported Strategies
-FDM uses a combination of JSON Web Tokens (JWTs) and sessions to authenticate users.
+FDM is configured to support several authentication methods. The availability of these methods can depend on the specific configuration of the FDM instance.
-> **What is a JWT?**
->
-> A JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.
+### Magic Links
+FDM supports passwordless authentication via Magic Links.
+* Users provide their email address.
+* The system sends a secure, time-limited link to that email.
+* Clicking the link authenticates the user without requiring a password.
-When a user logs in, they are issued a JWT that contains their user ID and other relevant information. This JWT is then sent with each subsequent request to the server, where it is used to verify the user's identity.
+### OAuth Providers
+FDM includes integration with **Google** and **Microsoft** OAuth providers.
+* **Account Linking:** Users can log in using their existing Google or Microsoft accounts.
+* **Profile Mapping:** Upon login, FDM maps profile information from the provider (First Name, Last Name, and Profile Picture) to the FDM user profile.
+* **User Creation:** New users authenticating via OAuth are automatically provisioned with a unique username and default settings (e.g., language preference set to `nl-NL`).
-## Supported Strategies
+## Session Management
+
+FDM uses a database-backed session system managed by Better Auth.
+
+* **Session Storage:** Sessions are stored in the database using the Drizzle ORM adapter. This allows for server-side session control and revocation.
+* **Expiration:** By default, sessions are configured to expire after 30 days.
+* **Renewal:** Active sessions are automatically updated every 24 hours to extend their validity.
-FDM supports a variety of authentication strategies, including:
+## Implementation Details
-* **Username and Password:** The traditional method of authentication, where users provide a username and password to log in.
-* **OAuth Providers:** FDM can be integrated with popular OAuth providers, such as Google and Microsoft, to allow users to log in with their existing accounts.
+The core authentication logic resides in `fdm-core/src/authentication.ts`.
-The authentication mechanisms are handled by the `fdm-core/src/authentication.ts` file, which is built on top of the `better-auth` library.
+* **Schema Extensions:** The user schema is extended to include FDM-specific fields such as `firstname`, `surname`, `lang`, and `farm_active`.
+* **Organizations:** The system utilizes the Better Auth organization plugin, which supports the creation and management of organizations within the authentication flow.
diff --git a/fdm-docs/docs/getting-started/01-what-is-fdm.md b/fdm-docs/docs/getting-started/01-what-is-fdm.md
index 1d9c20fdd..e105526ee 100644
--- a/fdm-docs/docs/getting-started/01-what-is-fdm.md
+++ b/fdm-docs/docs/getting-started/01-what-is-fdm.md
@@ -4,7 +4,7 @@ title: What is FDM?
# What is FDM?
-The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions.
+The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions that lowers the barries to deliver latest agronomic insights to farmers.
## What Problem Does FDM Solve?
diff --git a/fdm-docs/docs/getting-started/02-the-asset-action-model.md b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
index 7fbebef58..1cad6347f 100644
--- a/fdm-docs/docs/getting-started/02-the-asset-action-model.md
+++ b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
@@ -4,11 +4,14 @@ title: The Asset-Action Model
# The Asset-Action Model
-The core architectural concept of the Farm Data Model (FDM) is the **Asset-Action Model**. This model provides a simple yet powerful way to represent the complex and dynamic nature of farm operations.
+The Asset-Action model serves as the architectural foundation for the Farm Data Model (FDM). It provides a framework for organizing agricultural data by separating physical or conceptual entities from the events that affect them. This structure is designed to bring clarity to farm data and enable detailed analysis.
-## Assets
+## Core Concepts
-**Assets** are the fundamental building blocks of the FDM. They represent the physical and logical entities that make up a farm, such as:
+The model is built around two fundamental concepts:
+
+### Assets
+**Assets** represent the entities within a farm operation. They are the objects that have value or play a significant role in the system. In FDM, key assets include:
* **Farms:** The top-level container for all other assets.
* **Fields:** The primary spatial asset, representing a specific area of land.
@@ -16,16 +19,34 @@ The core architectural concept of the Farm Data Model (FDM) is the **Asset-Actio
* **Fertilizers:** A specific batch or acquisition of a fertilizer product.
* **Soil Samples:** A physical sample of soil taken from a field.
-## Actions
+### Actions
+**Actions** represent the operations or events that affect assets. These capture the dynamic processes that shape the state of farm assets. Common actions include:
+
+* **Sowing:** Planting a crop, which creates a new `cultivation` asset.
+* **Fertilizing:** Applying fertilizer to a field, which modifies the `field` or `cultivation` state.
+* **Harvesting:** Gathering a crop, which modifies the `cultivation` asset.
+* **Soil Sampling:** Taking a soil sample, which creates a new `soil sample` asset.
+
+## Design Philosophy
+
+The Asset-Action model aligns with agricultural operations by distinguishing between the object being managed and the activity performed upon it.
+
+For example, rather than recording a single abstract metric like "effective nitrogen dose," the model records the specific components:
+1. The **Asset** (the field).
+2. The **Action** (the application of fertilizer), including the specific type, amount, and date.
+
+This separation allows for more nuanced analysis. An agronomist can calculate nitrogen use efficiency by aggregating all application actions for a specific field asset over a growing season, rather than relying on pre-aggregated or simplified data points.
+
+## Key Characteristics
-**Actions** are the events that create or modify assets over time. They represent the various activities that take place on a farm, such as:
+The structure of the Asset-Action model supports various data requirements:
-* **Sowing:** The action of planting a crop, which creates a new `cultivation` asset.
-* **Fertilizing:** The action of applying fertilizer to a field, which modifies the `field` asset.
-* **Harvesting:** The action of gathering a crop, which modifies the `cultivation` asset.
-* **Soil Sampling:** The action of taking a soil sample, which creates a new `soil sample` asset.
+* **Granularity:** Actions can be defined with varying levels of detail, from broad categories (e.g., "planting") to specific instances containing detailed parameters (e.g., specific hybrid variety and seeding rate).
+* **Relationships:** The model captures relationships between entities and events. A single asset can be the subject of multiple actions over time (e.g., a field undergoes plowing, sowing, and harvesting). Conversely, a single action can involve multiple assets.
+* **Temporal Tracking:** Actions are associated with timestamps. This allows the system to track changes in assets over time, providing a historical view of farm operations.
+* **Extensibility:** Both assets and actions can include custom attributes to capture specific data relevant to the operation, such as geometry for fields or application methods for fertilizer actions.
-## How it Works
+## Practical Implementation
The Asset-Action Model creates a traceable history of all farm activities. Each action is linked to a specific asset, and the sequence of actions on an asset tells the story of that asset over time.
@@ -36,32 +57,4 @@ For example, the history of a `field` asset might look like this:
3. **Apply Fertilizer:** A `fertilizing` action is performed on the `field`, adding nutrients to the soil.
4. **Harvest Crop:** A `harvesting` action is performed on the `field`, gathering the crop and ending the `cultivation`.
-This creates a complete and auditable record of everything that has happened on the farm, which is essential for traceability, compliance, and decision-making.
-
-## Diagram
-
-The following diagram illustrates the relationship between assets and actions:
-
-```mermaid
-graph TD
- subgraph "Assets"
- A[Farm]
- B[Field]
- C[Cultivation]
- D[Fertilizer]
- E[Soil Sample]
- end
-
- subgraph "Actions"
- F[Sowing]
- G[Fertilizing]
- H[Harvesting]
- I[Soil Sampling]
- end
-
- A --> B
- F --> C
- G --> B
- H --> C
- I --> E
-```
+This creates a complete and auditable record of activities on the farm, which is essential for traceability and compliance.
diff --git a/fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md b/fdm-docs/docs/insights/01-nitrogen-balance.md
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/01-nitrogen-balance.md
rename to fdm-docs/docs/insights/01-nitrogen-balance.md
diff --git a/fdm-docs/docs/agronomic-calculations/_category_.json b/fdm-docs/docs/insights/_category_.json
similarity index 57%
rename from fdm-docs/docs/agronomic-calculations/_category_.json
rename to fdm-docs/docs/insights/_category_.json
index 9e0ed94e5..8b24e1bac 100644
--- a/fdm-docs/docs/agronomic-calculations/_category_.json
+++ b/fdm-docs/docs/insights/_category_.json
@@ -1,8 +1,8 @@
{
- "label": "Agronomic Calculations (`fdm-calculator`)",
+ "label": "Insights",
"position": 3,
"link": {
"type": "generated-index",
- "description": "This section is dedicated to explaining the powerful calculation engine within FDM."
+ "description": "This section is dedicated to explaining the calculation engine within FDM."
}
}
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md b/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
new file mode 100644
index 000000000..89684d5c0
--- /dev/null
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
@@ -0,0 +1,36 @@
+---
+title: Overview
+---
+
+# Norms and Regulations
+
+The `fdm-calculator` includes functionality to validate agronomic data against regional norms for fertilizer application. This capability supports nutrient management by comparing planned or actual applications against specific regulatory limits.
+
+## Relevance and Data Usage
+
+Calculating norms within FDM utilizes data that is already recorded for other insights, such as field details, crop types, and fertilizer applications. This approach avoids the need for double data entry and allows farmers to view compliance status alongside other agronomic indicators.
+
+Providing these insights is relevant for farmers who need to adhere to environmental regulations to ensure sustainable practices and meet legal requirements.
+
+## System Structure and Extensibility
+
+The norm calculation system in `fdm-calculator` is designed to be extensible across different regions and timeframes. The internal architecture organizes logic by:
+
+* **Region:** Supporting different countries or regulatory zones (e.g., `NL` for Netherlands).
+* **Year:** Allowing for annual updates to regulations (e.g., `2025`).
+
+This structure enables the addition of new regional rule sets or the updating of existing ones as regulations evolve, without disrupting previous implementations.
+
+## Current Implementation: Netherlands 2025
+
+The current implementation in `fdm-calculator` covers the Dutch nutrient management regulations for the year 2025. This includes the following usage norms (`gebruiksnormen`):
+
+* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./nl/2025/stikstofgebruiksnorm.md):** Calculates the maximum total effective nitrogen (in kg N/ha) allowed. The calculation considers factors such as the main crop, geographical location (including `NV-gebieden`), and soil region.
+* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./nl/2025/fosfaatgebruiksnorm.md):** Determines the maximum amount of phosphate (in kg P₂O₅ per hectare) allowed. This limit is based on the land use type (grassland or arable land) and the phosphate status of the soil.
+* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./nl/2025/dierlijke-mest-gebruiksnorm.md):** Specifies the maximum nitrogen from animal manure (in kg N/ha) permitted. The limit depends on the farm's derogation status and the field's location.
+
+For detailed logic and specific parameters of these norms, refer to their respective pages.
+
+## Customization
+
+The `fdm-calculator` can be extended to support additional norms. The system's modular design allows for the integration of custom configuration files or new logic modules to meet specific regional requirements or certification schemes.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/_category_.json b/fdm-docs/docs/insights/fertilizer-application-norms/_category_.json
new file mode 100644
index 000000000..f9c819773
--- /dev/null
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Fertilizer Application Norms",
+ "position": 1
+}
diff --git a/fdm-docs/docs/norms/nl/2025/01-index.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
similarity index 70%
rename from fdm-docs/docs/norms/nl/2025/01-index.md
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
index 91653fba7..9357608b3 100644
--- a/fdm-docs/docs/norms/nl/2025/01-index.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
@@ -1,6 +1,6 @@
---
title: 2025 Dutch Fertilizer Application Norms
-sidebar_label: "Introduction"
+sidebar_label: "Overview"
position: 1
---
@@ -10,9 +10,11 @@ This guide explains how the FDM Calculator determines the official Dutch legal u
The FDM Calculator automates these complex calculations based on your specific farm, field, and cultivation data. It calculates three key norms:
-1. **Nitrogen Usage Norm (`Stikstofgebruiksnorm`)**: The maximum effective nitrogen from all fertilizers.
-2. **Phosphate Usage Norm (`Fosfaatgebruiksnorm`)**: The maximum phosphate, based on your soil's phosphate status.
-3. **Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)**: The maximum nitrogen from animal manure, with specific rules for derogation farms.
+* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./stikstofgebruiksnorm.md):** This norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation takes into account the main crop, the geographical location (including `NV-gebieden`), and the soil region.
+* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./fosfaatgebruiksnorm.md):** This norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. The maximum is determined by the land use type (grassland or arable land) and the phosphate status of the soil.
+* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./dierlijke-mest-gebruiksnorm.md):** This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
+
+For more detailed information on these norms, please refer to the specific pages for each one.
:::danger Official Source & Disclaimer
The calculations in this document are based on the official 2025 norms published by the RVO (Rijksdienst voor Ondernemend Nederland). While we strive for accuracy, this document is for informational purposes only.
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/_category_.json
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/nl/2025/_category_.json
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/_category_.json
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/nl/2025/dierlijke-mest-gebruiksnorm.md
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/nl/2025/fosfaatgebruiksnorm.md
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md
diff --git a/fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/nl/2025/stikstofgebruiksnorm.md
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md
diff --git a/fdm-docs/docs/agronomic-calculations/nl/_category_.json b/fdm-docs/docs/insights/fertilizer-application-norms/nl/_category_.json
similarity index 100%
rename from fdm-docs/docs/agronomic-calculations/nl/_category_.json
rename to fdm-docs/docs/insights/fertilizer-application-norms/nl/_category_.json
diff --git a/fdm-docs/docs/norms/_category_.json b/fdm-docs/docs/norms/_category_.json
deleted file mode 100644
index 7b42a50ea..000000000
--- a/fdm-docs/docs/norms/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "label": "Fertilizer Application Norms",
- "position": 5,
- "link": {
- "type": "generated-index",
- "description": "Guides to understand calculations of legal norms for fertilizer application per region and year."
- }
-}
diff --git a/fdm-docs/docs/norms/nl/2025/_category_.json b/fdm-docs/docs/norms/nl/2025/_category_.json
deleted file mode 100644
index a24f609d3..000000000
--- a/fdm-docs/docs/norms/nl/2025/_category_.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "label": "2025",
- "position": 1,
- "link": {
- "type": "generated-index",
- "description": "Learn more about the 2025 Dutch Fertilizer Application Norms."
- }
-}
diff --git a/fdm-docs/docs/norms/nl/2025/dierlijke-mest-gebruiksnorm.md b/fdm-docs/docs/norms/nl/2025/dierlijke-mest-gebruiksnorm.md
deleted file mode 100644
index 0d89a01fa..000000000
--- a/fdm-docs/docs/norms/nl/2025/dierlijke-mest-gebruiksnorm.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-title: Dierlijke Mest Gebruiksnorm 2025
-sidebar_label: "Dierlijke Mest Gebruiksnorm"
----
-
-# Dierlijke Mest Gebruiksnorm 2025
-
-This document explains how the FDM Calculator determines the official Dutch legal usage norm (`gebruiksnorm`) for nitrogen from animal manure and how the applied animal manure counts towards this norm (the `filling`). It also covers the derogation regulations for 2025.
-
----
-
-## Calculating the Gebruiksnorm (Usage Norm)
-
-### How the Norm Works
-
-This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
-
-#### Standard Norm (No Derogation):
-
-If the farm does **not** have a derogation permit, the standard norm is **170 kg N/ha**.
-
-#### Derogation Norms for 2025:
-
-Derogation is a temporary exception that allows farms with at least 80% grassland to use more nitrogen from grazing animal manure. However, derogation is being phased out, and the norms for 2025 are as follows:
-
-1. **Derogation-Free Zones**:
- * If a field is in a **derogation-free zone** (`derogatievrije zone`) around a Natura 2000 area, the standard norm of **170 kg N/ha** applies, even with a derogation permit.
-
-2. **Nutrient-Polluted and Groundwater Protection Areas**:
- * If a field is in a **Nutrient-Polluted Area (`NV-gebied`)** or a **Groundwater Protection Area (`GWBG-gebied`)**, the derogation norm is **190 kg N/ha**.
-
-3. **Other Areas**:
- * For all other fields, the derogation norm is **200 kg N/ha**.
-
-### How the FDM Calculator Determines the Norm
-
-The `fdm-calculator` uses the `calculateAnimalManureUsageNorm` function in `fdm-calculator/src/norms/nl/2025/value/dierlijke-mest-gebruiksnorm.ts`. This function takes the farm's derogation status and the field's geographical context as input to apply the correct norm.
-
----
-
-## Calculating the Opvulling (Filling)
-
-### How the Filling Works
-
-The filling for the animal manure usage norm is based on the **total nitrogen** from all applied animal manures. Unlike the nitrogen usage norm, no efficiency coefficients are applied here; the total nitrogen content of the manure counts.
-
-#### Calculation Formula:
-
-`Total Nitrogen (kg N) = Applied Amount (ton) × Total Nitrogen Content (kg N/ton)`
-
-#### Forfaitair Nitrogen Content (`Forfaitaire Stikstofgehalten`):
-
-The forfaitair nitrogen content per ton of manure is determined by the animal species, category, and manure type, as specified in RVO Tabel 11. This table provides standard values for various manure codes (`mestcodes`).
-
-**Example from RVO Tabel 11**:
-
-| Diersoort (Animal Species) | Omschrijving (Description) | Mestcode | Kg stikstof per ton | Kg fosfaat per ton |
-| :------------------------ | :------------------------- | :------- | :------------------ | :----------------- |
-| Rundvee (Cattle) | Vaste mest (Solid manure) | 10 | 6.4 | 3.2 |
-| Rundvee | Drijfmest (Slurry) | 17 | 4.0 | 1.3 |
-| Varkens (Pigs) | Drijfmest vleesvarkens | 46 | 6.4 | 2.4 |
-| Kippen (Chickens) | Mestband (Belt manure) | 32 | 26.0 | 3.8 |
-
-### How the FDM Calculator Determines the Filling
-
-The `fdm-calculator` uses the `calculateAnimalManureFilling` function in `fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts`. This function relies on:
-
-* The applied amount of animal manure.
-* The manure code (`mestcode`) of the applied manure.
-* The forfaitair nitrogen values from `fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts`, which implements RVO Tabel 11.
-
-If a specific analysis value for the nitrogen content is known, it will be used; otherwise, the forfaitair content is applied.
diff --git a/fdm-docs/docs/norms/nl/2025/fosfaatgebruiksnorm.md b/fdm-docs/docs/norms/nl/2025/fosfaatgebruiksnorm.md
deleted file mode 100644
index d788334f0..000000000
--- a/fdm-docs/docs/norms/nl/2025/fosfaatgebruiksnorm.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-title: Fosfaatgebruiksnorm 2025
-sidebar_label: "Fosfaatgebruiksnorm"
----
-
-# Fosfaatgebruiksnorm 2025
-
-This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for phosphate in 2025. It covers how the norm is calculated and how the amount of applied phosphate counts towards this norm (`opvulling`), with a special focus on the regulations for organic-rich fertilizers as introduced in the 7th Action Programme Nitraatrichtlijn.
-
----
-
-## Calculating the Gebruiksnorm (Usage Norm)
-
-### How the Norm Works
-
-The phosphate usage norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. This maximum is determined by two key factors: the **land use type** and the **phosphate status of the soil**.
-
-The process involves three steps:
-
-1. **Determine Land Type**: First, the land is classified as either **`grasland`** (grassland) or **`bouwland`** (arable land) based on the main crop.
-2. **Determine Phosphate Class**: Based on a recent soil analysis (using P-CaCl₂ and P-Al values), the soil is assigned a phosphate class. The classes range from `Arm` (Poor) to `Hoog` (High). The specific thresholds for each class differ for grassland and arable land.
-3. **Look Up the Final Norm**: The combination of land type and phosphate class determines the final usage norm, as shown in the official table below.
-
-| Klasse | Grasland (kg P₂O₅/ha) | Bouwland (kg P₂O₅/ha) |
-| :------- | :-------------------- | :-------------------- |
-| Arm | 120 | 120 |
-| Laag | 105 | 80 |
-| Neutraal | 95 | 70 |
-| Ruim | 90 | 60 |
-| Hoog | 75 | 40 |
-
-The result of this calculation is the maximum allowable phosphate application for the parcel.
-
-### How the FDM Calculator Determines the Norm
-
-The `fdm-calculator` uses the `calculatePhosphateUsageNorm` function, located in `fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.ts`.
-
-This function requires the following inputs, defined in `input.ts`:
-* **Main Crop**: To determine if the land is `grasland` or `bouwland`.
-* **Soil Analysis Data**: The latest P-CaCl₂ and P-Al values.
-
-The core logic uses `fosfaatgebruiksnorm-data.ts`, which contains the official thresholds for phosphate classes and the corresponding norm values for both grassland and arable land.
-
----
-
-## Calculating the Opvulling (Filling)
-
-### How the Filling Works
-
-The "filling" (`opvulling`) refers to how much of the applied phosphate counts towards the usage norm. While most fertilizers count for 100% of their phosphate content, the Dutch government encourages the use of **organic-rich fertilizers** (`Organische Stofrijke meststoffen`) to improve soil quality. To stimulate their use, these fertilizers count for a lower percentage of their phosphate content.
-
-#### Differentiated Percentages for Organic-Rich Fertilizers:
-
-The phosphate in qualifying organic-rich fertilizers counts towards the usage norm according to the following differentiated percentages:
-
-* **25% of phosphate counts for:**
- * GFT-compost
- * Groencompost (Green compost)
-
-* **75% of phosphate counts for:**
- * Vaste strorijke mest van rundvee (Straw-rich solid manure from cattle)
- * Vaste strorijke mest van varkens (only for organic farms) (Straw-rich solid manure)
- * Vaste strorijke mest van schapen (Straw-rich solid manure from sheep)
- * Vaste strorijke mest van geiten (Straw-rich solid manure from goats)
- * Vaste strorijke mest van paarden (Straw-rich solid manure from horses)
- * Champost
-
-* **100% of phosphate counts for:**
- * All other fertilizers, including mineral fertilizers and other organic fertilizers not listed above.
-
-#### Conditions for Differentiated Percentages:
-
-To use these lower percentages, two important conditions must be met:
-
-1. **Minimum Application**: At least **20 kg P₂O₅ per hectare** of a specific organic-rich fertilizer must be applied. This ensures the application is substantial enough to contribute to soil improvement.
-2. **Maximum for Differentiated Calculation**: The differentiated percentage (25% or 75%) applies only to the amount of phosphate **up to the parcel's maximum usage norm**. If you apply more phosphate from an organic-rich source than the norm allows, the excess amount counts for **100%**.
-
-#### Calculation Examples:
-
-**Example 1: Standard Application**
-* **Parcel**: Arable land, phosphate status `Ruim`.
-* **Norm**: 60 kg P₂O₅/ha.
-* **Application**: 10 tons/ha of straw-rich cattle manure (forfaitair: 3.2 kg P₂O₅/ton).
-
-1. **Total Phosphate Applied**: `10 ton/ha × 3.2 kg P₂O₅/ton = 32 kg P₂O₅/ha`.
-2. **Check Conditions**:
- * The applied amount (32 kg) is > 20 kg (minimum met).
- * The applied amount (32 kg) is < 60 kg (norm).
- * The 75% rule applies.
-3. **Calculate Filling**: `32 kg P₂O₅/ha × 75% = 24 kg P₂O₅/ha`.
- * **Result**: Only **24 kg** counts towards the 60 kg norm, leaving **36 kg** of usage room.
-
-**Example 2: High Application of Compost**
-* **Parcel**: Grassland, phosphate status `Arm`.
-* **Norm**: 120 kg P₂O₅/ha.
-* **Application**: 210 kg P₂O₅/ha from green compost.
-
-1. **Check Conditions**:
- * The applied amount (210 kg) is > 20 kg (minimum met).
- * The differentiated percentage of 25% applies up to the norm of 120 kg.
-2. **Calculate Filling**:
- * **Part 1 (up to the norm)**: `120 kg P₂O₅/ha × 25% = 30 kg P₂O₅/ha`.
- * **Part 2 (above the norm)**: The remaining phosphate is `210 kg - 120 kg = 90 kg`. This amount counts for 100%.
- * **Total Filling**: `30 kg + 90 kg = 120 kg P₂O₅/ha`.
- * **Result**: The total filling is **120 kg**, which meets the 120 kg norm exactly.
-
-### How the FDM Calculator Determines the Filling
-
-The `fdm-calculator` uses the `calculatePhosphateFilling` function, located in `fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts`.
-
-This function processes a list of fertilizer applications and implements the following logic:
-1. It identifies which fertilizers are classified as organic-rich and determines their applicable percentage (25% or 75%).
-2. For each application of an organic-rich fertilizer, it checks if the **20 kg P₂O₅/ha minimum** is met.
-3. It calculates the filling by applying the differentiated percentage to the phosphate amount that falls **within the usage norm**.
-4. Any phosphate from an organic-rich fertilizer applied **above the usage norm** is counted at 100%.
-5. All other fertilizers are always counted at 100%.
-
-The function sums the calculated filling from all applications to provide the total phosphate filling for the parcel.
diff --git a/fdm-docs/docs/norms/nl/2025/stikstofgebruiksnorm.md b/fdm-docs/docs/norms/nl/2025/stikstofgebruiksnorm.md
deleted file mode 100644
index db7112dab..000000000
--- a/fdm-docs/docs/norms/nl/2025/stikstofgebruiksnorm.md
+++ /dev/null
@@ -1,107 +0,0 @@
----
-title: Stikstofgebruiksnorm 2025
-sidebar_label: "Stikstofgebruiksnorm"
----
-
-# Stikstofgebruiksnorm 2025
-
-This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for nitrogen in 2025. It covers how the norm is calculated, the rules for catch crops and winter crops, and how the applied nitrogen counts towards this norm (`opvulling`).
-
----
-
-## Calculating the Gebruiksnorm (Usage Norm)
-
-### How the Norm Works
-
-The nitrogen usage norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation follows a step-by-step process to find the most precise norm based on various factors.
-
-#### Calculation Steps:
-
-1. **Identify Main Crop**: The main crop for 2025 is determined from your cultivation plan.
-2. **Determine Geographical Context**: The field's location is used to check:
- * If it is in a **Nutrient-Polluted Area (`NV-gebied`)**, which results in a stricter (lower) norm.
- * The dominant **soil region** (`zand_nwc`, `zand_zuid`, `klei`, `veen`, or `loess`).
-3. **Find the Standard Norm**: The main crop is looked up in the official RVO Table 2 (or Tabel 2g for NV-gebieden).
-4. **Apply Specific Rules**: The standard norm is refined with additional rules for certain crops:
- * **Temporary Grassland (`Tijdelijk grasland`)**: The norm is adjusted based on the cultivation end date.
- * **Potatoes (`Aardappelen`)**: The norm is adjusted based on the potato variety. See [RVO Tabel 2c](https://www.rvo.nl/sites/default/files/2024-12/Tabel-2c-Consumptieaardappelen%20hoge%20of%20lage%20norm-2025.pdf).
- * **Maize (`Maïs`)**: The norm depends on the farm's derogation status.
- * **Outdoor Flowers (`Buitenbloemen`)**: A higher norm is applied for specific varieties.
-5. **Select the Final Norm**: The final value is selected based on the field's soil region and `NV-gebied` status.
-6. **Apply Nitrogen Usage Norm Reduction (`Korting Stikstofgebruiksnorm`)**: The norm can be reduced (`korting`) if catch crop (`vanggewas`) or winter crop (`winterteelt`) requirements were not met in the previous year on sand and loess soils.
-
-### How the FDM Calculator Determines the Norm
-
-The `fdm-calculator` uses the `calculateNitrogenUsageNorm` function in `fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts`, which relies on:
-* **`stikstofgebruiksnorm-data.ts`**: Contains the data from RVO Tabel 2 and Tabel 2g.
-* **`input.ts`**: Defines the required inputs, such as derogation status, location, and crop data.
-
----
-
-## Vanggewassen en Winterteelten (Catch Crops and Winter Crops)
-
-### How the Rules Work
-
-On sand and loess soils, the land must be covered during the winter to prevent nitrogen leaching. This can be achieved with a catch crop or a designated winter crop. Failure to comply results in a reduction of the nitrogen usage norm for the following year.
-
-#### 1. Winter Crop Exception
-
-No reduction is applied if the main crop of the current year is a designated **winter crop (`winterteelt`)**. These crops provide sufficient ground cover and nitrogen uptake.
-**Official Source**: [RVO Tabel 2F Vanggewassen en winterteelten](https://www.rvo.nl/sites/default/files/2023-11/Tabel-2F-Vanggewassen-en-winterteelten-op-zand-en-l%C3%B6ssgrond-2024.pdf)
-
-#### 2. Catch Crop Rules
-
-If there is no winter crop, a **catch crop (`vanggewas`)** must be sown. The sowing date determines the reduction:
-
-* **No Reduction**: Sown by **October 1st**.
-* **5 kg N/ha Reduction**: Sown between **October 2nd and October 14th**.
-* **10 kg N/ha Reduction**: Sown between **October 15th and October 31st**.
-* **20 kg N/ha Reduction**: No valid catch crop, sown on or after **November 1st**, or destroyed before **February 1st**.
-
-### How the FDM Calculator Implements These Rules
-
-This logic is part of the `calculateNitrogenUsageNorm` function:
-
-1. **Check for Winter Crop**: The calculator checks if the current year's main crop is a winter crop.
-2. **Check for Catch Crop**: If not, it checks the previous year's cultivation data for a catch crop.
-3. **Apply Reduction**: The sowing date determines the reduction, which is applied to the current year's norm.
-
----
-
-## Calculating the Opvulling (Filling)
-
-### How the Filling Works
-
-The filling is based on the **effective nitrogen** (`werkzame stikstof`) applied, which is calculated using an efficiency coefficient (`werkingscoëfficiënt`).
-
-**Official Source**: [RVO Tabel 9 Werkzame stikstof landbouwgrond 2025](https://www.rvo.nl/sites/default/files/2024-12/Tabel-9-Werkzame-stikstof-landbouwgrond-2025.pdf)
-
-#### Calculation Formula
-
-`Effective Nitrogen (kg N) = Applied Amount (kg or ton) × Total Nitrogen Content (%) × Efficiency Coefficient (%)`
-
-#### Efficiency Coefficients (`Werkingscoëfficiënten`)
-
-| Mestsoort (Manure Type) & Herkomst (Origin) | Toepassing (Application) | Werkingscoëfficiënt (%) |
-| :--- | :--- | :--- |
-| **Drijfmest en dunne fractie** | | |
-| Drijfmest van graasdieren (eigen bedrijf) | Met beweiding | 45 |
-| | Zonder beweiding | 60 |
-| Drijfmest van graasdieren (aangevoerd) | | 60 |
-| Drijfmest van varkens | Klei en veen | 60 |
-| | Zand en löss | 80 |
-| Overige drijfmest en dunne fractie | | 80 |
-| **Vaste mest** | | |
-| Vaste mest van graasdieren (eigen bedrijf) | Bouwland (sep-jan) | 30 |
-| | Overig met beweiding | 45 |
-| | Overig zonder beweiding | 60 |
-| Vaste mest van graasdieren (aangevoerd) | Bouwland (sep-jan) | 30 |
-| | Overige | 40 |
-| Vaste mest van varkens, pluimvee, nertsen | | 55 |
-| **Overig** | | |
-| Compost / Champost | | 10 / 25 |
-| Kunstmest (Mineral fertilizer) | | 100 |
-
-### How the FDM Calculator Determines the Filling
-
-The `calculateNitrogenFilling` function in `fdm-calculator/src/norms/nl/2025/filling/stikstofgebruiksnorm.ts` uses the fertilizer type, application method, and the coefficients from `table-9.ts` to calculate the effective nitrogen.
diff --git a/fdm-docs/docs/norms/nl/_category_.json b/fdm-docs/docs/norms/nl/_category_.json
deleted file mode 100644
index 617b87028..000000000
--- a/fdm-docs/docs/norms/nl/_category_.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "label": "The Netherlands",
- "position": 1
-}
From ca65c9fb24f9bc055df7b161bf2b5810e15f77bf Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 17:08:39 +0100
Subject: [PATCH 04/11] refactor: remove mermaid
---
fdm-docs/docusaurus.config.ts | 4 -
fdm-docs/package.json | 2 -
pnpm-lock.yaml | 857 ----------------------------------
3 files changed, 863 deletions(-)
diff --git a/fdm-docs/docusaurus.config.ts b/fdm-docs/docusaurus.config.ts
index 7bfa0476d..a598c1c68 100644
--- a/fdm-docs/docusaurus.config.ts
+++ b/fdm-docs/docusaurus.config.ts
@@ -21,10 +21,6 @@ const config: Config = {
defaultLocale: "en",
locales: ["en"],
},
- markdown: {
- mermaid: true,
- },
- themes: ["@docusaurus/theme-mermaid"],
presets: [
[
diff --git a/fdm-docs/package.json b/fdm-docs/package.json
index 2f9727008..f1c51fe07 100644
--- a/fdm-docs/package.json
+++ b/fdm-docs/package.json
@@ -22,8 +22,6 @@
"@docusaurus/core": "3.9.2",
"@docusaurus/faster": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
- "@docusaurus/theme-mermaid": "3.9.2",
- "@mermaid-js/layout-elk": "^0.1.9",
"@mdx-js/react": "^3.1.1",
"clsx": "^2.1.1",
"lucide-react": "^0.552.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ad6bbef0b..503444099 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -539,15 +539,9 @@ importers:
'@docusaurus/preset-classic':
specifier: 3.9.2
version: 3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)
- '@docusaurus/theme-mermaid':
- specifier: 3.9.2
- version: 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
'@mdx-js/react':
specifier: ^3.1.1
version: 3.1.1(@types/react@19.2.2)(react@19.2.0)
- '@mermaid-js/layout-elk':
- specifier: ^0.1.9
- version: 0.1.9(mermaid@11.12.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -691,12 +685,6 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
- '@antfu/install-pkg@1.1.0':
- resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
-
- '@antfu/utils@9.3.0':
- resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==}
-
'@apm-js-collab/code-transformer@0.8.2':
resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==}
@@ -1352,9 +1340,6 @@ packages:
'@borewit/text-codec@0.1.1':
resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==}
- '@braintree/sanitize-url@7.1.1':
- resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==}
-
'@changesets/apply-release-plan@7.0.13':
resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==}
@@ -1410,21 +1395,6 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
- '@chevrotain/cst-dts-gen@11.0.3':
- resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
-
- '@chevrotain/gast@11.0.3':
- resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==}
-
- '@chevrotain/regexp-to-ast@11.0.3':
- resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==}
-
- '@chevrotain/types@11.0.3':
- resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==}
-
- '@chevrotain/utils@11.0.3':
- resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
-
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -1876,17 +1846,6 @@ packages:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- '@docusaurus/theme-mermaid@3.9.2':
- resolution: {integrity: sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==}
- engines: {node: '>=20.0'}
- peerDependencies:
- '@mermaid-js/layout-elk': ^0.1.9
- react: ^18.0.0 || ^19.0.0
- react-dom: ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@mermaid-js/layout-elk':
- optional: true
-
'@docusaurus/theme-search-algolia@3.9.2':
resolution: {integrity: sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==}
engines: {node: '>=20.0'}
@@ -2272,12 +2231,6 @@ packages:
peerDependencies:
react-hook-form: ^7.55.0
- '@iconify/types@2.0.0':
- resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
-
- '@iconify/utils@3.0.2':
- resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==}
-
'@inquirer/external-editor@1.0.2':
resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
engines: {node: '>=18'}
@@ -2445,14 +2398,6 @@ packages:
'@types/react': '>=16'
react: '>=16'
- '@mermaid-js/layout-elk@0.1.9':
- resolution: {integrity: sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw==}
- peerDependencies:
- mermaid: ^11.0.2
-
- '@mermaid-js/parser@0.6.3':
- resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==}
-
'@mjackson/node-fetch-server@0.2.0':
resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==}
@@ -4835,99 +4780,33 @@ packages:
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
- '@types/d3-axis@3.0.6':
- resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
-
- '@types/d3-brush@3.0.6':
- resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
-
- '@types/d3-chord@3.0.6':
- resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
-
'@types/d3-color@3.1.3':
resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
- '@types/d3-contour@3.0.6':
- resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
-
- '@types/d3-delaunay@6.0.4':
- resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
-
- '@types/d3-dispatch@3.0.7':
- resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
-
- '@types/d3-drag@3.0.7':
- resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
-
- '@types/d3-dsv@3.0.7':
- resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
-
'@types/d3-ease@3.0.2':
resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
- '@types/d3-fetch@3.0.7':
- resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
-
- '@types/d3-force@3.0.10':
- resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
-
- '@types/d3-format@3.0.4':
- resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
-
- '@types/d3-geo@3.1.0':
- resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
-
- '@types/d3-hierarchy@3.1.7':
- resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
-
'@types/d3-interpolate@3.0.4':
resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
'@types/d3-path@3.1.1':
resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
- '@types/d3-polygon@3.0.2':
- resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
-
- '@types/d3-quadtree@3.0.6':
- resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
-
- '@types/d3-random@3.0.3':
- resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
-
- '@types/d3-scale-chromatic@3.1.0':
- resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
-
'@types/d3-scale@4.0.9':
resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
- '@types/d3-selection@3.0.11':
- resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
-
'@types/d3-shape@3.1.7':
resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
- '@types/d3-time-format@4.0.3':
- resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
-
'@types/d3-time@3.0.4':
resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
'@types/d3-timer@3.0.2':
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
- '@types/d3-transition@3.0.9':
- resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
-
'@types/d3-voronoi@1.1.12':
resolution: {integrity: sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==}
- '@types/d3-zoom@3.0.8':
- resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
-
- '@types/d3@7.4.3':
- resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
-
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
@@ -5122,9 +5001,6 @@ packages:
'@types/tedious@4.0.14':
resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==}
- '@types/trusted-types@2.0.7':
- resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-
'@types/unist@2.0.11':
resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
@@ -5710,14 +5586,6 @@ packages:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
engines: {node: '>= 6'}
- chevrotain-allstar@0.3.1:
- resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==}
- peerDependencies:
- chevrotain: ^11.0.0
-
- chevrotain@11.0.3:
- resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==}
-
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -5847,12 +5715,6 @@ packages:
concaveman@1.2.1:
resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==}
- confbox@0.1.8:
- resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
-
- confbox@0.2.2:
- resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
-
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -5912,12 +5774,6 @@ packages:
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
- cose-base@1.0.3:
- resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
-
- cose-base@2.2.0:
- resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
-
cosmiconfig@8.3.6:
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
@@ -6056,20 +5912,6 @@ packages:
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
- cytoscape-cose-bilkent@4.1.0:
- resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
- peerDependencies:
- cytoscape: ^3.2.0
-
- cytoscape-fcose@2.2.0:
- resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
- peerDependencies:
- cytoscape: ^3.2.0
-
- cytoscape@3.33.1:
- resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==}
- engines: {node: '>=0.10'}
-
d3-array@1.2.4:
resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
@@ -6077,55 +5919,14 @@ packages:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
- d3-axis@3.0.0:
- resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
- engines: {node: '>=12'}
-
- d3-brush@3.0.0:
- resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
- engines: {node: '>=12'}
-
- d3-chord@3.0.1:
- resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
- engines: {node: '>=12'}
-
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
- d3-contour@4.0.2:
- resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
- engines: {node: '>=12'}
-
- d3-delaunay@6.0.4:
- resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
- engines: {node: '>=12'}
-
- d3-dispatch@3.0.1:
- resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
- engines: {node: '>=12'}
-
- d3-drag@3.0.0:
- resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
- engines: {node: '>=12'}
-
- d3-dsv@3.0.1:
- resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
- engines: {node: '>=12'}
- hasBin: true
-
d3-ease@3.0.1:
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
- d3-fetch@3.0.1:
- resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
- engines: {node: '>=12'}
-
- d3-force@3.0.0:
- resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
- engines: {node: '>=12'}
-
d3-format@3.1.0:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
@@ -6133,55 +5934,18 @@ packages:
d3-geo@1.7.1:
resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==}
- d3-geo@3.1.1:
- resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
- engines: {node: '>=12'}
-
- d3-hierarchy@3.1.2:
- resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
- engines: {node: '>=12'}
-
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
- d3-path@1.0.9:
- resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
-
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
- d3-polygon@3.0.1:
- resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
- engines: {node: '>=12'}
-
- d3-quadtree@3.0.1:
- resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
- engines: {node: '>=12'}
-
- d3-random@3.0.1:
- resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
- engines: {node: '>=12'}
-
- d3-sankey@0.12.3:
- resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
-
- d3-scale-chromatic@3.1.0:
- resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
- engines: {node: '>=12'}
-
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
- d3-selection@3.0.0:
- resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
- engines: {node: '>=12'}
-
- d3-shape@1.3.7:
- resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
-
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
@@ -6198,26 +5962,9 @@ packages:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
- d3-transition@3.0.1:
- resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
- engines: {node: '>=12'}
- peerDependencies:
- d3-selection: 2 - 3
-
d3-voronoi@1.1.2:
resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==}
- d3-zoom@3.0.0:
- resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
- engines: {node: '>=12'}
-
- d3@7.9.0:
- resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
- engines: {node: '>=12'}
-
- dagre-d3-es@7.0.13:
- resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==}
-
data-view-buffer@1.0.2:
resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
engines: {node: '>= 0.4'}
@@ -6236,9 +5983,6 @@ packages:
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
- dayjs@1.11.19:
- resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
-
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -6327,9 +6071,6 @@ packages:
defu@6.1.4:
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
- delaunator@5.0.1:
- resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
-
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
@@ -6408,9 +6149,6 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
- dompurify@3.3.0:
- resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
-
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
@@ -6554,9 +6292,6 @@ packages:
electron-to-chromium@1.5.244:
resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==}
- elkjs@0.9.3:
- resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
-
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -6774,9 +6509,6 @@ packages:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
- exsolve@1.0.8:
- resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
-
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
@@ -7088,10 +6820,6 @@ packages:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
- globals@15.15.0:
- resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
- engines: {node: '>=18'}
-
globals@16.5.0:
resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'}
@@ -7140,9 +6868,6 @@ packages:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
- hachure-fill@0.5.2:
- resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
-
handle-thing@2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
@@ -7332,10 +7057,6 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
- iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
-
iconv-lite@0.7.0:
resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
engines: {node: '>=0.10.0'}
@@ -7777,19 +7498,12 @@ packages:
resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==}
engines: {node: '>= 12'}
- katex@0.16.25:
- resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==}
- hasBin: true
-
kdbush@4.0.2:
resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
- khroma@2.1.0:
- resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
-
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
@@ -7798,17 +7512,10 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
- kolorist@1.8.0:
- resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
-
kysely@0.28.8:
resolution: {integrity: sha512-QUOgl5ZrS9IRuhq5FvOKFSsD/3+IA6MLE81/bOOTRA/YQpKDza2sFdN5g6JCB9BOpqMJDGefLCQ9F12hRS13TA==}
engines: {node: '>=20.0.0'}
- langium@3.3.1:
- resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
- engines: {node: '>=16.0.0'}
-
latest-version@7.0.0:
resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
engines: {node: '>=14.16'}
@@ -7816,12 +7523,6 @@ packages:
launch-editor@2.12.0:
resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==}
- layout-base@1.0.2:
- resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
-
- layout-base@2.0.1:
- resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
-
leac@0.6.0:
resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==}
@@ -7920,10 +7621,6 @@ packages:
resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
engines: {node: '>=8.9.0'}
- local-pkg@1.1.2:
- resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
- engines: {node: '>=14'}
-
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
@@ -7936,9 +7633,6 @@ packages:
resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- lodash-es@4.17.21:
- resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
-
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -8144,9 +7838,6 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- mermaid@11.12.1:
- resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==}
-
methods@1.1.2:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
@@ -8369,9 +8060,6 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- mlly@1.8.0:
- resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
-
module-details-from-path@1.0.4:
resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
@@ -8665,9 +8353,6 @@ packages:
package-manager-detector@0.2.11:
resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
- package-manager-detector@1.5.0:
- resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==}
-
pako@2.1.0:
resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
@@ -8710,9 +8395,6 @@ packages:
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
- path-data-parser@0.1.0:
- resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
-
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -8795,24 +8477,12 @@ packages:
resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
engines: {node: '>=14.16'}
- pkg-types@1.3.1:
- resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
-
- pkg-types@2.3.0:
- resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
-
point-in-polygon-hao@1.2.4:
resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==}
point-in-polygon@1.1.0:
resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
- points-on-curve@0.2.0:
- resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
-
- points-on-path@0.2.1:
- resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
-
polyclip-ts@0.16.8:
resolution: {integrity: sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==}
@@ -9823,9 +9493,6 @@ packages:
rou3@0.5.1:
resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==}
- roughjs@4.6.6:
- resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
-
rtlcss@4.3.0:
resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==}
engines: {node: '>=12.0.0'}
@@ -10235,9 +9902,6 @@ packages:
peerDependencies:
postcss: ^8.4.31
- stylis@4.3.6:
- resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
-
subtag@0.5.0:
resolution: {integrity: sha512-CaIBcTSb/nyk4xiiSOtZYz1B+F12ZxW8NEp54CdT+84vmh/h4sUnHGC6+KQXUfED8u22PQjCYWfZny8d2ELXwg==}
@@ -10346,10 +10010,6 @@ packages:
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
- tinyexec@1.0.2:
- resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
- engines: {node: '>=18'}
-
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
@@ -10418,10 +10078,6 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- ts-dedent@2.2.0:
- resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
- engines: {node: '>=6.10'}
-
tsconfck@3.1.6:
resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
engines: {node: ^18 || >=20}
@@ -10568,9 +10224,6 @@ packages:
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
- ufo@1.6.1:
- resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
-
uint8array-extras@1.5.0:
resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
engines: {node: '>=18'}
@@ -10715,10 +10368,6 @@ packages:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
- uuid@11.1.0:
- resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
- hasBin: true
-
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -10848,26 +10497,6 @@ packages:
jsdom:
optional: true
- vscode-jsonrpc@8.2.0:
- resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
- engines: {node: '>=14.0.0'}
-
- vscode-languageserver-protocol@3.17.5:
- resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
-
- vscode-languageserver-textdocument@1.0.12:
- resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
-
- vscode-languageserver-types@3.17.5:
- resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
-
- vscode-languageserver@9.0.1:
- resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
- hasBin: true
-
- vscode-uri@3.0.8:
- resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
-
watchpack@2.4.4:
resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==}
engines: {node: '>=10.13.0'}
@@ -11255,13 +10884,6 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
- '@antfu/install-pkg@1.1.0':
- dependencies:
- package-manager-detector: 1.5.0
- tinyexec: 1.0.2
-
- '@antfu/utils@9.3.0': {}
-
'@apm-js-collab/code-transformer@0.8.2': {}
'@apm-js-collab/tracing-hooks@0.3.1':
@@ -12089,8 +11711,6 @@ snapshots:
'@borewit/text-codec@0.1.1': {}
- '@braintree/sanitize-url@7.1.1': {}
-
'@changesets/apply-release-plan@7.0.13':
dependencies:
'@changesets/config': 3.1.1
@@ -12235,23 +11855,6 @@ snapshots:
human-id: 4.1.2
prettier: 2.8.8
- '@chevrotain/cst-dts-gen@11.0.3':
- dependencies:
- '@chevrotain/gast': 11.0.3
- '@chevrotain/types': 11.0.3
- lodash-es: 4.17.21
-
- '@chevrotain/gast@11.0.3':
- dependencies:
- '@chevrotain/types': 11.0.3
- lodash-es: 4.17.21
-
- '@chevrotain/regexp-to-ast@11.0.3': {}
-
- '@chevrotain/types@11.0.3': {}
-
- '@chevrotain/utils@11.0.3': {}
-
'@colors/colors@1.5.0':
optional: true
@@ -13203,38 +12806,6 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/theme-mermaid@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)':
- dependencies:
- '@docusaurus/core': 3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3)
- '@docusaurus/module-type-aliases': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3))(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/types': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- '@docusaurus/utils-validation': 3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
- mermaid: 11.12.1
- react: 19.2.0
- react-dom: 19.2.0(react@19.2.0)
- tslib: 2.8.1
- optionalDependencies:
- '@mermaid-js/layout-elk': 0.1.9(mermaid@11.12.1)
- transitivePeerDependencies:
- - '@docusaurus/faster'
- - '@docusaurus/plugin-content-docs'
- - '@mdx-js/react'
- - '@parcel/css'
- - '@rspack/core'
- - '@swc/core'
- - '@swc/css'
- - bufferutil
- - csso
- - debug
- - esbuild
- - lightningcss
- - supports-color
- - typescript
- - uglify-js
- - utf-8-validate
- - webpack-cli
-
'@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.42.0)(@docusaurus/faster@3.9.2(@docusaurus/types@3.9.2(@swc/core@1.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@rspack/core@1.6.0)(@swc/core@1.15.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)':
dependencies:
'@docsearch/react': 4.2.0(@algolia/client-search@5.42.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)
@@ -13596,21 +13167,6 @@ snapshots:
'@standard-schema/utils': 0.3.0
react-hook-form: 7.66.0(react@19.2.0)
- '@iconify/types@2.0.0': {}
-
- '@iconify/utils@3.0.2':
- dependencies:
- '@antfu/install-pkg': 1.1.0
- '@antfu/utils': 9.3.0
- '@iconify/types': 2.0.0
- debug: 4.4.3
- globals: 15.15.0
- kolorist: 1.8.0
- local-pkg: 1.1.2
- mlly: 1.8.0
- transitivePeerDependencies:
- - supports-color
-
'@inquirer/external-editor@1.0.2(@types/node@24.10.0)':
dependencies:
chardet: 2.1.1
@@ -13841,16 +13397,6 @@ snapshots:
'@types/react': 19.2.2
react: 19.2.0
- '@mermaid-js/layout-elk@0.1.9(mermaid@11.12.1)':
- dependencies:
- d3: 7.9.0
- elkjs: 0.9.3
- mermaid: 11.12.1
-
- '@mermaid-js/parser@0.6.3':
- dependencies:
- langium: 3.3.1
-
'@mjackson/node-fetch-server@0.2.0': {}
'@module-federation/error-codes@0.21.2': {}
@@ -17186,123 +16732,30 @@ snapshots:
'@types/d3-array@3.2.2': {}
- '@types/d3-axis@3.0.6':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-brush@3.0.6':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-chord@3.0.6': {}
-
'@types/d3-color@3.1.3': {}
- '@types/d3-contour@3.0.6':
- dependencies:
- '@types/d3-array': 3.2.2
- '@types/geojson': 7946.0.16
-
- '@types/d3-delaunay@6.0.4': {}
-
- '@types/d3-dispatch@3.0.7': {}
-
- '@types/d3-drag@3.0.7':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-dsv@3.0.7': {}
-
'@types/d3-ease@3.0.2': {}
- '@types/d3-fetch@3.0.7':
- dependencies:
- '@types/d3-dsv': 3.0.7
-
- '@types/d3-force@3.0.10': {}
-
- '@types/d3-format@3.0.4': {}
-
- '@types/d3-geo@3.1.0':
- dependencies:
- '@types/geojson': 7946.0.16
-
- '@types/d3-hierarchy@3.1.7': {}
-
'@types/d3-interpolate@3.0.4':
dependencies:
'@types/d3-color': 3.1.3
'@types/d3-path@3.1.1': {}
- '@types/d3-polygon@3.0.2': {}
-
- '@types/d3-quadtree@3.0.6': {}
-
- '@types/d3-random@3.0.3': {}
-
- '@types/d3-scale-chromatic@3.1.0': {}
-
'@types/d3-scale@4.0.9':
dependencies:
'@types/d3-time': 3.0.4
- '@types/d3-selection@3.0.11': {}
-
'@types/d3-shape@3.1.7':
dependencies:
'@types/d3-path': 3.1.1
- '@types/d3-time-format@4.0.3': {}
-
'@types/d3-time@3.0.4': {}
'@types/d3-timer@3.0.2': {}
- '@types/d3-transition@3.0.9':
- dependencies:
- '@types/d3-selection': 3.0.11
-
'@types/d3-voronoi@1.1.12': {}
- '@types/d3-zoom@3.0.8':
- dependencies:
- '@types/d3-interpolate': 3.0.4
- '@types/d3-selection': 3.0.11
-
- '@types/d3@7.4.3':
- dependencies:
- '@types/d3-array': 3.2.2
- '@types/d3-axis': 3.0.6
- '@types/d3-brush': 3.0.6
- '@types/d3-chord': 3.0.6
- '@types/d3-color': 3.1.3
- '@types/d3-contour': 3.0.6
- '@types/d3-delaunay': 6.0.4
- '@types/d3-dispatch': 3.0.7
- '@types/d3-drag': 3.0.7
- '@types/d3-dsv': 3.0.7
- '@types/d3-ease': 3.0.2
- '@types/d3-fetch': 3.0.7
- '@types/d3-force': 3.0.10
- '@types/d3-format': 3.0.4
- '@types/d3-geo': 3.1.0
- '@types/d3-hierarchy': 3.1.7
- '@types/d3-interpolate': 3.0.4
- '@types/d3-path': 3.1.1
- '@types/d3-polygon': 3.0.2
- '@types/d3-quadtree': 3.0.6
- '@types/d3-random': 3.0.3
- '@types/d3-scale': 4.0.9
- '@types/d3-scale-chromatic': 3.1.0
- '@types/d3-selection': 3.0.11
- '@types/d3-shape': 3.1.7
- '@types/d3-time': 3.0.4
- '@types/d3-time-format': 4.0.3
- '@types/d3-timer': 3.0.2
- '@types/d3-transition': 3.0.9
- '@types/d3-zoom': 3.0.8
-
'@types/debug@4.1.12':
dependencies:
'@types/ms': 2.1.0
@@ -17528,9 +16981,6 @@ snapshots:
dependencies:
'@types/node': 24.10.0
- '@types/trusted-types@2.0.7':
- optional: true
-
'@types/unist@2.0.11': {}
'@types/unist@3.0.3': {}
@@ -18202,20 +17652,6 @@ snapshots:
parse5: 7.3.0
parse5-htmlparser2-tree-adapter: 7.1.0
- chevrotain-allstar@0.3.1(chevrotain@11.0.3):
- dependencies:
- chevrotain: 11.0.3
- lodash-es: 4.17.21
-
- chevrotain@11.0.3:
- dependencies:
- '@chevrotain/cst-dts-gen': 11.0.3
- '@chevrotain/gast': 11.0.3
- '@chevrotain/regexp-to-ast': 11.0.3
- '@chevrotain/types': 11.0.3
- '@chevrotain/utils': 11.0.3
- lodash-es: 4.17.21
-
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -18343,10 +17779,6 @@ snapshots:
robust-predicates: 2.0.4
tinyqueue: 2.0.3
- confbox@0.1.8: {}
-
- confbox@0.2.2: {}
-
config-chain@1.1.13:
dependencies:
ini: 1.3.8
@@ -18400,14 +17832,6 @@ snapshots:
core-util-is@1.0.3: {}
- cose-base@1.0.3:
- dependencies:
- layout-base: 1.0.2
-
- cose-base@2.2.0:
- dependencies:
- layout-base: 2.0.1
-
cosmiconfig@8.3.6(typescript@5.9.3):
dependencies:
import-fresh: 3.3.1
@@ -18568,109 +17992,28 @@ snapshots:
csstype@3.1.3: {}
- cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1):
- dependencies:
- cose-base: 1.0.3
- cytoscape: 3.33.1
-
- cytoscape-fcose@2.2.0(cytoscape@3.33.1):
- dependencies:
- cose-base: 2.2.0
- cytoscape: 3.33.1
-
- cytoscape@3.33.1: {}
-
d3-array@1.2.4: {}
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
- d3-axis@3.0.0: {}
-
- d3-brush@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-drag: 3.0.0
- d3-interpolate: 3.0.1
- d3-selection: 3.0.0
- d3-transition: 3.0.1(d3-selection@3.0.0)
-
- d3-chord@3.0.1:
- dependencies:
- d3-path: 3.1.0
-
d3-color@3.1.0: {}
- d3-contour@4.0.2:
- dependencies:
- d3-array: 3.2.4
-
- d3-delaunay@6.0.4:
- dependencies:
- delaunator: 5.0.1
-
- d3-dispatch@3.0.1: {}
-
- d3-drag@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-selection: 3.0.0
-
- d3-dsv@3.0.1:
- dependencies:
- commander: 7.2.0
- iconv-lite: 0.6.3
- rw: 1.3.3
-
d3-ease@3.0.1: {}
- d3-fetch@3.0.1:
- dependencies:
- d3-dsv: 3.0.1
-
- d3-force@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-quadtree: 3.0.1
- d3-timer: 3.0.1
-
d3-format@3.1.0: {}
d3-geo@1.7.1:
dependencies:
d3-array: 1.2.4
- d3-geo@3.1.1:
- dependencies:
- d3-array: 3.2.4
-
- d3-hierarchy@3.1.2: {}
-
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
- d3-path@1.0.9: {}
-
d3-path@3.1.0: {}
- d3-polygon@3.0.1: {}
-
- d3-quadtree@3.0.1: {}
-
- d3-random@3.0.1: {}
-
- d3-sankey@0.12.3:
- dependencies:
- d3-array: 1.2.4
- d3-shape: 1.3.7
-
- d3-scale-chromatic@3.1.0:
- dependencies:
- d3-color: 3.1.0
- d3-interpolate: 3.0.1
-
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
@@ -18679,12 +18022,6 @@ snapshots:
d3-time: 3.1.0
d3-time-format: 4.1.0
- d3-selection@3.0.0: {}
-
- d3-shape@1.3.7:
- dependencies:
- d3-path: 1.0.9
-
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
@@ -18699,63 +18036,8 @@ snapshots:
d3-timer@3.0.1: {}
- d3-transition@3.0.1(d3-selection@3.0.0):
- dependencies:
- d3-color: 3.1.0
- d3-dispatch: 3.0.1
- d3-ease: 3.0.1
- d3-interpolate: 3.0.1
- d3-selection: 3.0.0
- d3-timer: 3.0.1
-
d3-voronoi@1.1.2: {}
- d3-zoom@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-drag: 3.0.0
- d3-interpolate: 3.0.1
- d3-selection: 3.0.0
- d3-transition: 3.0.1(d3-selection@3.0.0)
-
- d3@7.9.0:
- dependencies:
- d3-array: 3.2.4
- d3-axis: 3.0.0
- d3-brush: 3.0.0
- d3-chord: 3.0.1
- d3-color: 3.1.0
- d3-contour: 4.0.2
- d3-delaunay: 6.0.4
- d3-dispatch: 3.0.1
- d3-drag: 3.0.0
- d3-dsv: 3.0.1
- d3-ease: 3.0.1
- d3-fetch: 3.0.1
- d3-force: 3.0.0
- d3-format: 3.1.0
- d3-geo: 3.1.1
- d3-hierarchy: 3.1.2
- d3-interpolate: 3.0.1
- d3-path: 3.1.0
- d3-polygon: 3.0.1
- d3-quadtree: 3.0.1
- d3-random: 3.0.1
- d3-scale: 4.0.2
- d3-scale-chromatic: 3.1.0
- d3-selection: 3.0.0
- d3-shape: 3.2.0
- d3-time: 3.1.0
- d3-time-format: 4.1.0
- d3-timer: 3.0.1
- d3-transition: 3.0.1(d3-selection@3.0.0)
- d3-zoom: 3.0.0
-
- dagre-d3-es@7.0.13:
- dependencies:
- d3: 7.9.0
- lodash-es: 4.17.21
-
data-view-buffer@1.0.2:
dependencies:
call-bound: 1.0.4
@@ -18778,8 +18060,6 @@ snapshots:
date-fns@4.1.0: {}
- dayjs@1.11.19: {}
-
debounce@1.2.1: {}
debug@2.6.9:
@@ -18842,10 +18122,6 @@ snapshots:
defu@6.1.4: {}
- delaunator@5.0.1:
- dependencies:
- robust-predicates: 3.0.2
-
delayed-stream@1.0.0: {}
depd@1.1.2: {}
@@ -18919,10 +18195,6 @@ snapshots:
dependencies:
domelementtype: 2.3.0
- dompurify@3.3.0:
- optionalDependencies:
- '@types/trusted-types': 2.0.7
-
domutils@2.8.0:
dependencies:
dom-serializer: 1.4.1
@@ -18990,8 +18262,6 @@ snapshots:
electron-to-chromium@1.5.244: {}
- elkjs@0.9.3: {}
-
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
@@ -19324,8 +18594,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- exsolve@1.0.8: {}
-
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
@@ -19652,8 +18920,6 @@ snapshots:
dependencies:
ini: 2.0.0
- globals@15.15.0: {}
-
globals@16.5.0: {}
globalthis@1.0.4:
@@ -19727,8 +18993,6 @@ snapshots:
dependencies:
duplexer: 0.1.2
- hachure-fill@0.5.2: {}
-
handle-thing@2.0.1: {}
hard-rejection@2.1.0: {}
@@ -20012,10 +19276,6 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
- iconv-lite@0.6.3:
- dependencies:
- safer-buffer: 2.1.2
-
iconv-lite@0.7.0:
dependencies:
safer-buffer: 2.1.2
@@ -20400,34 +19660,18 @@ snapshots:
jsts@2.7.1: {}
- katex@0.16.25:
- dependencies:
- commander: 8.3.0
-
kdbush@4.0.2: {}
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
- khroma@2.1.0: {}
-
kind-of@6.0.3: {}
kleur@3.0.3: {}
- kolorist@1.8.0: {}
-
kysely@0.28.8: {}
- langium@3.3.1:
- dependencies:
- chevrotain: 11.0.3
- chevrotain-allstar: 0.3.1(chevrotain@11.0.3)
- vscode-languageserver: 9.0.1
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.0.8
-
latest-version@7.0.0:
dependencies:
package-json: 8.1.1
@@ -20437,10 +19681,6 @@ snapshots:
picocolors: 1.1.1
shell-quote: 1.8.3
- layout-base@1.0.2: {}
-
- layout-base@2.0.1: {}
-
leac@0.6.0: {}
lerc@3.0.0: {}
@@ -20512,12 +19752,6 @@ snapshots:
emojis-list: 3.0.0
json5: 2.2.3
- local-pkg@1.1.2:
- dependencies:
- mlly: 1.8.0
- pkg-types: 2.3.0
- quansync: 0.2.11
-
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
@@ -20530,8 +19764,6 @@ snapshots:
dependencies:
p-locate: 6.0.0
- lodash-es@4.17.21: {}
-
lodash.debounce@4.0.8: {}
lodash.memoize@4.1.2: {}
@@ -20887,31 +20119,6 @@ snapshots:
merge2@1.4.1: {}
- mermaid@11.12.1:
- dependencies:
- '@braintree/sanitize-url': 7.1.1
- '@iconify/utils': 3.0.2
- '@mermaid-js/parser': 0.6.3
- '@types/d3': 7.4.3
- cytoscape: 3.33.1
- cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1)
- cytoscape-fcose: 2.2.0(cytoscape@3.33.1)
- d3: 7.9.0
- d3-sankey: 0.12.3
- dagre-d3-es: 7.0.13
- dayjs: 1.11.19
- dompurify: 3.3.0
- katex: 0.16.25
- khroma: 2.1.0
- lodash-es: 4.17.21
- marked: 16.4.1
- roughjs: 4.6.6
- stylis: 4.3.6
- ts-dedent: 2.2.0
- uuid: 11.1.0
- transitivePeerDependencies:
- - supports-color
-
methods@1.1.2: {}
mgrs@1.0.0: {}
@@ -21282,13 +20489,6 @@ snapshots:
minipass@7.1.2: {}
- mlly@1.8.0:
- dependencies:
- acorn: 8.15.0
- pathe: 2.0.3
- pkg-types: 1.3.1
- ufo: 1.6.1
-
module-details-from-path@1.0.4: {}
morgan@1.10.1:
@@ -21569,8 +20769,6 @@ snapshots:
dependencies:
quansync: 0.2.11
- package-manager-detector@1.5.0: {}
-
pako@2.1.0: {}
param-case@3.0.4:
@@ -21626,8 +20824,6 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
- path-data-parser@0.1.0: {}
-
path-exists@4.0.0: {}
path-exists@5.0.0: {}
@@ -21692,31 +20888,12 @@ snapshots:
dependencies:
find-up: 6.3.0
- pkg-types@1.3.1:
- dependencies:
- confbox: 0.1.8
- mlly: 1.8.0
- pathe: 2.0.3
-
- pkg-types@2.3.0:
- dependencies:
- confbox: 0.2.2
- exsolve: 1.0.8
- pathe: 2.0.3
-
point-in-polygon-hao@1.2.4:
dependencies:
robust-predicates: 3.0.2
point-in-polygon@1.1.0: {}
- points-on-curve@0.2.0: {}
-
- points-on-path@0.2.1:
- dependencies:
- path-data-parser: 0.1.0
- points-on-curve: 0.2.0
-
polyclip-ts@0.16.8:
dependencies:
bignumber.js: 9.3.1
@@ -22894,13 +22071,6 @@ snapshots:
rou3@0.5.1: {}
- roughjs@4.6.6:
- dependencies:
- hachure-fill: 0.5.2
- path-data-parser: 0.1.0
- points-on-curve: 0.2.0
- points-on-path: 0.2.1
-
rtlcss@4.3.0:
dependencies:
escalade: 3.2.0
@@ -23370,8 +22540,6 @@ snapshots:
postcss: 8.5.6
postcss-selector-parser: 6.1.2
- stylis@4.3.6: {}
-
subtag@0.5.0: {}
suggestions@1.7.1:
@@ -23467,8 +22635,6 @@ snapshots:
tinyexec@0.3.2: {}
- tinyexec@1.0.2: {}
-
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
@@ -23524,8 +22690,6 @@ snapshots:
trough@2.2.0: {}
- ts-dedent@2.2.0: {}
-
tsconfck@3.1.6(typescript@5.9.3):
optionalDependencies:
typescript: 5.9.3
@@ -23663,8 +22827,6 @@ snapshots:
uc.micro@2.1.0: {}
- ufo@1.6.1: {}
-
uint8array-extras@1.5.0: {}
unbox-primitive@1.1.0:
@@ -23817,8 +22979,6 @@ snapshots:
utils-merge@1.0.1: {}
- uuid@11.1.0: {}
-
uuid@8.3.2: {}
valibot@1.1.0(typescript@5.9.3):
@@ -23957,23 +23117,6 @@ snapshots:
- tsx
- yaml
- vscode-jsonrpc@8.2.0: {}
-
- vscode-languageserver-protocol@3.17.5:
- dependencies:
- vscode-jsonrpc: 8.2.0
- vscode-languageserver-types: 3.17.5
-
- vscode-languageserver-textdocument@1.0.12: {}
-
- vscode-languageserver-types@3.17.5: {}
-
- vscode-languageserver@9.0.1:
- dependencies:
- vscode-languageserver-protocol: 3.17.5
-
- vscode-uri@3.0.8: {}
-
watchpack@2.4.4:
dependencies:
glob-to-regexp: 0.4.1
From 1da93600ba51a53f12dcff7c49c4c02c4284be47 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 17:10:12 +0100
Subject: [PATCH 05/11] chore: add changeset
---
.changeset/slick-bees-post.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/slick-bees-post.md
diff --git a/.changeset/slick-bees-post.md b/.changeset/slick-bees-post.md
new file mode 100644
index 000000000..40b9fcd2c
--- /dev/null
+++ b/.changeset/slick-bees-post.md
@@ -0,0 +1,5 @@
+---
+"@svenvw/fdm-docs": minor
+---
+
+Extend the pages about core-concepts of FDM, update schema description and reorganize the docs
From 20224048fabaefb5dca4397c0512957d44b9006f Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 18:02:14 +0100
Subject: [PATCH 06/11] chore: fix format
---
.vscode/settings.json | 3 +
fdm-docs/docs/README.md | 2 -
.../contributing/01-project-architecture.md | 12 +-
.../02-setting-up-local-environment.md | 10 +-
.../docs/contributing/03-releasing-fdm.md | 58 +++--
.../docs/core-concepts/01-database-schema.md | 168 +++++++++-----
fdm-docs/docs/core-concepts/02-farms.md | 20 +-
fdm-docs/docs/core-concepts/03-fields.md | 14 +-
.../docs/core-concepts/04-cultivations.md | 24 +-
fdm-docs/docs/core-concepts/05-harvests.md | 64 +++--
fdm-docs/docs/core-concepts/06-fertilizers.md | 24 +-
.../docs/core-concepts/07-soil-analyses.md | 30 ++-
fdm-docs/docs/core-concepts/08-catalogues.md | 12 +-
.../docs/core-concepts/09-authentication.md | 28 +--
.../docs/core-concepts/10-authorization.md | 26 +--
.../docs/core-concepts/11-organizations.md | 18 +-
.../fdm-app/01-introduction-to-fdm-app.md | 73 +++---
.../docs/getting-started/01-what-is-fdm.md | 30 ++-
.../02-the-asset-action-model.md | 43 ++--
.../getting-started/03-quick-start-guide.md | 2 -
fdm-docs/docs/insights/01-nitrogen-balance.md | 218 +++++++++---------
.../fertilizer-application-norms/01-index.md | 12 +-
.../nl/2025/01-index.md | 28 ++-
.../nl/2025/dierlijke-mest-gebruiksnorm.md | 28 ++-
.../nl/2025/fosfaatgebruiksnorm.md | 106 ++++-----
.../nl/2025/stikstofgebruiksnorm.md | 49 ++--
fdm-docs/package.json | 2 +
pnpm-lock.yaml | 141 +++++++++++
28 files changed, 712 insertions(+), 533 deletions(-)
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 678ce4ee7..1a5c646ba 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -12,5 +12,8 @@
"editor.formatOnSave": true,
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
+ },
+ "[markdown]": {
+ "editor.defaultFormatter": "DavidAnson.vscode-markdownlint"
}
}
diff --git a/fdm-docs/docs/README.md b/fdm-docs/docs/README.md
index 000a2d95b..eee5c6589 100644
--- a/fdm-docs/docs/README.md
+++ b/fdm-docs/docs/README.md
@@ -3,8 +3,6 @@ title: Introduction
sidebar_position: 0
---
-# Welcome to the FDM Documentation
-
This documentation provides a comprehensive overview of the Farm Data Model (FDM). It is designed to help you understand the core concepts of the FDM, learn how to use it in your own applications, and contribute to its development.
## Getting Started
diff --git a/fdm-docs/docs/contributing/01-project-architecture.md b/fdm-docs/docs/contributing/01-project-architecture.md
index d4bc89f16..f6bc641b8 100644
--- a/fdm-docs/docs/contributing/01-project-architecture.md
+++ b/fdm-docs/docs/contributing/01-project-architecture.md
@@ -3,19 +3,17 @@ title: Project Architecture
sidebar_label: Project Architecture
---
-# Project Architecture
-
The Farm Data Model (FDM) is a monorepo that is managed with `pnpm` workspaces and `turbo`. This structure allows us to manage multiple packages within a single repository, which simplifies dependency management and improves code sharing.
## Monorepo Structure
The FDM monorepo is organized into the following packages:
-* **`fdm-core`**: This package contains the core data model, including the database schema, TypeScript types, and JSON schemas.
-* **`fdm-data`**: This package contains the standardized catalogues for crops, fertilizers, and other agricultural inputs.
-* **`fdm-calculator`**: This package contains the agronomic calculation engine, which is used to perform calculations such as nitrogen balance and fertilizer recommendations.
-* **`fdm-app`**: This package is a reference implementation of a farm management application that is built on top of the FDM.
-* **`fdm-docs`**: This package contains the documentation for the FDM project, which is built with Docusaurus.
+* **`fdm-core`**: This package contains the core data model, including the database schema, TypeScript types, and JSON schemas.
+* **`fdm-data`**: This package contains the standardized catalogues for crops, fertilizers, and other agricultural inputs.
+* **`fdm-calculator`**: This package contains the agronomic calculation engine, which is used to perform calculations such as nitrogen balance and fertilizer recommendations.
+* **`fdm-app`**: This package is a reference implementation of a farm management application that is built on top of the FDM.
+* **`fdm-docs`**: This package contains the documentation for the FDM project, which is built with Docusaurus.
## `pnpm` Workspaces
diff --git a/fdm-docs/docs/contributing/02-setting-up-local-environment.md b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
index f876ad84a..cdca41f48 100644
--- a/fdm-docs/docs/contributing/02-setting-up-local-environment.md
+++ b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
@@ -3,18 +3,16 @@ title: Setting up Local Environment
sidebar_label: Setting up Local Environment
---
-# Setting up Local Environment
-
This guide will walk you through the process of setting up a local development environment for the Farm Data Model (FDM) project.
## Prerequisites
Before you begin, you will need to have the following software installed on your machine:
-* **Node.js:** FDM is a TypeScript and JavaScript project, so you will need to have Node.js installed.
-* **`pnpm`**: FDM uses `pnpm` for package management, so you will need to have it installed.
-* **Git:** FDM is hosted on GitHub, so you will need to have Git installed to clone the repository.
-* **Docker:** FDM uses Docker to run the necessary services, such as the PostgreSQL database.
+* **Node.js:** FDM is a TypeScript and JavaScript project, so you will need to have Node.js installed.
+* **`pnpm`**: FDM uses `pnpm` for package management, so you will need to have it installed.
+* **Git:** FDM is hosted on GitHub, so you will need to have Git installed to clone the repository.
+* **Docker:** FDM uses Docker to run the necessary services, such as the PostgreSQL database.
## Cloning the Repository
diff --git a/fdm-docs/docs/contributing/03-releasing-fdm.md b/fdm-docs/docs/contributing/03-releasing-fdm.md
index d7e630fb8..256595b4f 100644
--- a/fdm-docs/docs/contributing/03-releasing-fdm.md
+++ b/fdm-docs/docs/contributing/03-releasing-fdm.md
@@ -3,29 +3,27 @@ title: Releasing FDM
sidebar_label: Releasing FDM
---
-# Release Process
-
This document outlines the release process for the `fdm` monorepo. Our process is built on a `development` -> `release` -> `main` branching strategy and is automated using GitHub Actions and [Changesets](https://github.com/changesets/changesets).
## Overview
The core idea is to separate the development of features from the release of new versions.
-- **`development` branch**: This is the primary integration branch where all new features and bug fixes are merged. Pushing to this branch automatically publishes a `development` snapshot version for testing.
-- **`release/*` branches**: These branches are created from `development` to prepare for a new stable release. This is where final release chores (like updating documentation, blog posts, etc.) are performed.
-- **`main` branch**: This branch represents the latest stable production code. Merging a `release/*` branch into `main` triggers the publication of stable packages to the registry and the creation of official GitHub Releases.
+- **`development` branch**: This is the primary integration branch where all new features and bug fixes are merged. Pushing to this branch automatically publishes a `development` snapshot version for testing.
+- **`release/*` branches**: These branches are created from `development` to prepare for a new stable release. This is where final release chores (like updating documentation, blog posts, etc.) are performed.
+- **`main` branch**: This branch represents the latest stable production code. Merging a `release/*` branch into `main` triggers the publication of stable packages to the registry and the creation of official GitHub Releases.
## For Developers: Making a Change
When you contribute code that should result in a new version of one or more packages, you must include a "changeset".
-1. **Make your code changes** on a feature branch as usual.
-2. **Run `pnpm changeset`**. This will launch an interactive CLI.
-3. **Select the packages** you have changed using the arrow keys and spacebar.
-4. **Choose the version bump type** (Major, Minor, or Patch) for each selected package.
-5. **Write a clear summary** of the change. This summary will be used to generate the `CHANGELOG.md` for the packages.
-6. **Commit the new changeset file** (e.g., `.changeset/unique-name.md`) along with your code changes.
-7. **Open a pull request** to the `development` branch.
+1. **Make your code changes** on a feature branch as usual.
+2. **Run `pnpm changeset`**. This will launch an interactive CLI.
+3. **Select the packages** you have changed using the arrow keys and spacebar.
+4. **Choose the version bump type** (Major, Minor, or Patch) for each selected package.
+5. **Write a clear summary** of the change. This summary will be used to generate the `CHANGELOG.md` for the packages.
+6. **Commit the new changeset file** (e.g., `.changeset/unique-name.md`) along with your code changes.
+7. **Open a pull request** to the `development` branch.
Once your PR is merged into `development`, the automation will take over and publish a snapshot release.
@@ -47,10 +45,10 @@ git checkout -b release/[YYYY-MM]
On this `release/*` branch, you can perform any final tasks before the release. This is the time to:
-- Add or update blog posts.
-- Update a "What's New" section in the application.
-- Run code formatters or linters.
-- Perform any other final checks or documentation updates.
+- Add or update blog posts.
+- Update a "What's New" section in the application.
+- Run code formatters or linters.
+- Perform any other final checks or documentation updates.
You can make and push as many commits as you need for these chores. The automation will not interfere.
@@ -58,20 +56,20 @@ You can make and push as many commits as you need for these chores. The automati
When you are **100% certain** the release branch is complete and ready, you must manually trigger the versioning process.
-1. Go to the **Actions** tab in the GitHub repository.
-2. Select the **Release** workflow from the list on the left.
-3. Click the **Run workflow** dropdown.
-4. Select your `release/[YYYY-MM]` branch from the "Branch" dropdown.
-5. Click the green **Run workflow** button.
+1. Go to the **Actions** tab in the GitHub repository.
+2. Select the **Release** workflow from the list on the left.
+3. Click the **Run workflow** dropdown.
+4. Select your `release/[YYYY-MM]` branch from the "Branch" dropdown.
+5. Click the green **Run workflow** button.
This will trigger the `Version Packages` job, which adds a final commit to your branch containing all the version bumps, changelog updates, and Git tags.
### Step 4: Merge to Main
-1. Open a pull request from your `release/[YYYY-MM]` branch to the `main` branch.
-2. The PR will have a **`Verify Versioning`** status check. This check must pass before you can merge. It fails if the versioning commit from the previous step is not present.
-3. A bot will also add a comment to the PR reminding you of the process.
-4. Once all checks pass, **merge the pull request**.
+1. Open a pull request from your `release/[YYYY-MM]` branch to the `main` branch.
+2. The PR will have a **`Verify Versioning`** status check. This check must pass before you can merge. It fails if the versioning commit from the previous step is not present.
+3. A bot will also add a comment to the PR reminding you of the process.
+4. Once all checks pass, **merge the pull request**.
Merging into `main` will trigger the final step of the automation, which publishes the stable packages and creates the GitHub Releases.
@@ -90,7 +88,7 @@ git push origin development
A hotfix is used to patch a critical bug in production. The process is similar to a regular release, but it starts from the `main` branch.
-1. **Create the Hotfix Branch**: Create a `hotfix/*` branch from the `main` branch.
+1. **Create the Hotfix Branch**: Create a `hotfix/*` branch from the `main` branch.
```bash
git checkout main
@@ -98,13 +96,13 @@ A hotfix is used to patch a critical bug in production. The process is similar t
git checkout -b hotfix/fix-critical-bug
```
-2. **Make and Commit Changes**: Apply the necessary code changes to fix the bug. Remember to add a changeset for the patch by running `pnpm changeset`.
+2. **Make and Commit Changes**: Apply the necessary code changes to fix the bug. Remember to add a changeset for the patch by running `pnpm changeset`.
-3. **Finalize and Version the Hotfix**: Just like a release branch, when the hotfix is ready, you must manually trigger the versioning process from the **Actions** tab on your `hotfix/*` branch.
+3. **Finalize and Version the Hotfix**: Just like a release branch, when the hotfix is ready, you must manually trigger the versioning process from the **Actions** tab on your `hotfix/*` branch.
-4. **Merge to Main**: Open a pull request from your `hotfix/*` branch to `main`. The same status checks and comments will apply. Merging this will publish the patched version.
+4. **Merge to Main**: Open a pull request from your `hotfix/*` branch to `main`. The same status checks and comments will apply. Merging this will publish the patched version.
-5. **Merge back to Development**: **This is a critical step.** To ensure the fix is not lost, you must also merge the `main` branch back into the `development` branch.
+5. **Merge back to Development**: **This is a critical step.** To ensure the fix is not lost, you must also merge the `main` branch back into the `development` branch.
```bash
git checkout development
diff --git a/fdm-docs/docs/core-concepts/01-database-schema.md b/fdm-docs/docs/core-concepts/01-database-schema.md
index 1144296f1..a9f9238df 100644
--- a/fdm-docs/docs/core-concepts/01-database-schema.md
+++ b/fdm-docs/docs/core-concepts/01-database-schema.md
@@ -2,8 +2,6 @@
title: Database Schema
---
-# Database Schema
-
This document provides a comprehensive overview of the Farm Data Model (FDM) database schema. It details each schema and table, their properties, and columns, explaining their purpose and how they relate to the overall data structure.
FDM uses a relational database to store its data. The schema is defined using TypeScript and then translated into a physical database schema using a tool called an **Object-Relational Mapper (ORM)**.
@@ -18,10 +16,10 @@ FDM uses a relational database to store its data. The schema is defined using Ty
The FDM database is organized into four distinct PostgreSQL schemas:
-1. **`fdm`**: Contains the core tables related to farm management, fields, cultivations, fertilizers, soil data, etc.
-2. **`fdm-authn`**: Handles authentication, storing user accounts, sessions, organizations, and related information.
-3. **`fdm-authz`**: Manages authorization, defining roles, permissions, and maintaining an audit trail.
-4. **`fdm-calculator`**: Caches calculation results and stores calculation errors to improve performance and provide better debugging capabilities.
+1. **`fdm`**: Contains the core tables related to farm management, fields, cultivations, fertilizers, soil data, etc.
+2. **`fdm-authn`**: Handles authentication, storing user accounts, sessions, organizations, and related information.
+3. **`fdm-authz`**: Manages authorization, defining roles, permissions, and maintaining an audit trail.
+4. **`fdm-calculator`**: Caches calculation results and stores calculation errors to improve performance and provide better debugging capabilities.
---
@@ -32,6 +30,7 @@ This schema holds the primary data related to farm operations.
### Farms & Fields
#### **`farms`**
+
**Purpose**: Stores basic information about each farm entity in the system.
| Column | Type | Constraints | Description |
@@ -45,9 +44,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_id_farm`.
+
+* Unique index on `b_id_farm`.
#### **`fields`**
+
**Purpose**: Stores information about each agricultural field, including its geometry and identifiers.
| Column | Type | Constraints | Description |
@@ -60,10 +61,12 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_id`.
-* GIST index on `b_geometry` for spatial queries.
+
+* Unique index on `b_id`.
+* GIST index on `b_geometry` for spatial queries.
#### **`fieldAcquiring`**
+
**Purpose**: Tracks the relationship between a farm and a field it manages, including the method and timeframe of acquisition.
| Column | Type | Constraints | Description |
@@ -76,13 +79,16 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id`, `b_id_farm`).
+
+* Primary Key on (`b_id`, `b_id_farm`).
##### `acquiringMethodEnum`
-* **Name**: `b_acquiring_method`
-* **Possible values**: `nl_01`, `nl_02`, `nl_03`, `nl_04`, `nl_07`, `nl_09`, `nl_10`, `nl_11`, `nl_12`, `nl_13`, `nl_61`, `nl_63`, `unknown`
+
+* **Name**: `b_acquiring_method`
+* **Possible values**: `nl_01`, `nl_02`, `nl_03`, `nl_04`, `nl_07`, `nl_09`, `nl_10`, `nl_11`, `nl_12`, `nl_13`, `nl_61`, `nl_63`, `unknown`
#### **`fieldDiscarding`**
+
**Purpose**: Marks when a field is no longer actively managed or used within the system.
| Column | Type | Constraints | Description |
@@ -97,6 +103,7 @@ This schema holds the primary data related to farm operations.
### Cultivations
#### **`cultivationsCatalogue`**
+
**Purpose**: A standardized catalogue of possible cultivation types (crops, cover crops, etc.).
| Column | Type | Constraints | Description |
@@ -115,7 +122,7 @@ This schema holds the primary data related to farm operations.
| **b_lu_n_residue** | `numeric` (custom) | | Nitrogen content in the crop residue. |
| **b_n_fixation** | `numeric` (custom) | | Nitrogen fixation rate (for legumes). |
| **b_lu_rest_oravib**| `boolean` | | Is the cultivation a 'rustgewas' with regards to Dutch manure legislation |
-| **b_lu_variety_options**| `text[]` | | A set of varieties (cultivars) that a cultivation may be |
+| **b_lu_variety_options**| `text[]` | | A set of varieties (cultivars) that a cultivation may be |
| **b_lu_start_default**| `text` | | Default start date of the cultivation (MM-DD). |
| **b_date_harvest_default**| `text` | | Default harvest date of the cultivation (MM-DD). |
| **hash** | `text` | | A hash value representing the content of the catalogue entry, for change tracking. |
@@ -123,17 +130,21 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_lu_catalogue`.
+
+* Unique index on `b_lu_catalogue`.
##### `harvestableEnum`
-* **Name**: `b_lu_harvestable`
-* **Possible values**: `none`, `once`, `multiple`
+
+* **Name**: `b_lu_harvestable`
+* **Possible values**: `none`, `once`, `multiple`
##### `rotationEnum`
-* **Name**: `b_lu_croprotation`
-* **Possible values**: `other`, `clover`, `nature`, `potato`, `grass`, `rapeseed`, `starch`, `maize`, `cereal`, `sugarbeet`, `alfalfa`, `catchcrop`
+
+* **Name**: `b_lu_croprotation`
+* **Possible values**: `other`, `clover`, `nature`, `potato`, `grass`, `rapeseed`, `starch`, `maize`, `cereal`, `sugarbeet`, `alfalfa`, `catchcrop`
#### **`cultivations`**
+
**Purpose**: Represents an instance of a cultivation being grown, linking it to its catalogue definition.
| Column | Type | Constraints | Description |
@@ -145,9 +156,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_lu`.
+
+* Unique index on `b_lu`.
#### **`cultivationStarting`**
+
**Purpose**: Records the event of starting a specific cultivation instance on a particular field.
| Column | Type | Constraints | Description |
@@ -161,9 +174,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id`, `b_lu`).
+
+* Primary Key on (`b_id`, `b_lu`).
#### **`cultivationEnding`**
+
**Purpose**: Marks the end date for a specific cultivation instance.
| Column | Type | Constraints | Description |
@@ -175,6 +190,7 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
#### **`cultivationCatalogueSelecting`**
+
**Purpose**: Indicates which cultivation catalogues are actively selected or used by a specific farm.
| Column | Type | Constraints | Description |
@@ -185,13 +201,15 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_farm`, `b_lu_source`).
+
+* Primary Key on (`b_id_farm`, `b_lu_source`).
---
### Harvestables
#### **`harvestables`**
+
**Purpose**: Represents a potential or actual harvestable product derived from a cultivation.
| Column | Type | Constraints | Description |
@@ -201,9 +219,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_id_harvestable`.
+
+* Unique index on `b_id_harvestable`.
#### **`harvestableAnalyses`**
+
**Purpose**: Stores the results of analyses performed on harvested products.
| Column | Type | Constraints | Description |
@@ -227,9 +247,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_id_harvestable_analysis`.
+
+* Unique index on `b_id_harvestable_analysis`.
#### **`harvestableSampling`**
+
**Purpose**: Links a harvestable product instance to its analysis results, recording the sampling date.
| Column | Type | Constraints | Description |
@@ -241,9 +263,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_harvestable`, `b_id_harvestable_analysis`).
+
+* Primary Key on (`b_id_harvestable`, `b_id_harvestable_analysis`).
#### **`cultivationHarvesting`**
+
**Purpose**: Records a specific harvesting event, linking the cultivation instance to the resulting harvestable product.
| Column | Type | Constraints | Description |
@@ -260,6 +284,7 @@ This schema holds the primary data related to farm operations.
### Fertilizers
#### **`fertilizersCatalogue`**
+
**Purpose**: A standardized catalogue of fertilizer products, detailing their composition and properties.
| Column | Type | Constraints | Description |
@@ -322,9 +347,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `p_id_catalogue`.
+
+* Unique index on `p_id_catalogue`.
#### **`fertilizers`**
+
**Purpose**: Represents an instance of a fertilizer product (e.g., a specific batch or acquisition).
| Column | Type | Constraints | Description |
@@ -334,9 +361,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `p_id`.
+
+* Unique index on `p_id`.
#### **`fertilizerAcquiring`**
+
**Purpose**: Tracks the acquisition of a specific fertilizer instance by a farm.
| Column | Type | Constraints | Description |
@@ -349,6 +378,7 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
#### **`fertilizerPicking`**
+
**Purpose**: Links a specific fertilizer instance to its corresponding entry in the `fertilizersCatalogue`.
| Column | Type | Constraints | Description |
@@ -360,6 +390,7 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
#### **`fertilizerApplication`**
+
**Purpose**: Logs the event of applying a specific fertilizer instance to a field.
| Column | Type | Constraints | Description |
@@ -374,13 +405,16 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `p_app_id`.
+
+* Unique index on `p_app_id`.
##### `applicationMethodEnum`
-* **Name**: `p_app_method`
-* **Possible values**: `slotted coulter`, `incorporation`, `incorporation 2 tracks`, `injection`, `shallow injection`, `spraying`, `broadcasting`, `spoke wheel`, `pocket placement`, `narrowband`
+
+* **Name**: `p_app_method`
+* **Possible values**: `slotted coulter`, `incorporation`, `incorporation 2 tracks`, `injection`, `shallow injection`, `spraying`, `broadcasting`, `spoke wheel`, `pocket placement`, `narrowband`
#### **`fertilizerCatalogueEnabling`**
+
**Purpose**: Indicates which fertilizer catalogue sources are actively enabled or used by a specific farm.
| Column | Type | Constraints | Description |
@@ -391,13 +425,15 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_farm`, `p_source`).
+
+* Primary Key on (`b_id_farm`, `p_source`).
---
### Soil
#### **`soilAnalysis`**
+
**Purpose**: Stores the results of a soil analysis.
| Column | Type | Constraints | Description |
@@ -446,18 +482,22 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
##### `soiltypeEnum`
-* **Name**: `b_soiltype_agr`
-* **Possible values**: `moerige_klei`, `rivierklei`, `dekzand`, `zeeklei`, `dalgrond`, `veen`, `loess`, `duinzand`, `maasklei`
+
+* **Name**: `b_soiltype_agr`
+* **Possible values**: `moerige_klei`, `rivierklei`, `dekzand`, `zeeklei`, `dalgrond`, `veen`, `loess`, `duinzand`, `maasklei`
##### `gwlClassEnum`
-* **Name**: `b_gwl_class`
-* **Possible values**: `I`, `Ia`, `Ic`, `II`, `IIa`, `IIb`, `IIc`, `III`, `IIIa`, `IIIb`, `IV`, `IVu`, `IVc`, `V`, `Va`, `Vao`, `Vad`, `Vb`, `Vbo`, `Vbd`, `sV`, `sVb`, `VI`, `VIo`, `VId`, `VII`, `VIIo`, `VIId`, `VIII`, `VIIIo`, `VIIId`
+
+* **Name**: `b_gwl_class`
+* **Possible values**: `I`, `Ia`, `Ic`, `II`, `IIa`, `IIb`, `IIc`, `III`, `IIIa`, `IIIb`, `IV`, `IVu`, `IVc`, `V`, `Va`, `Vao`, `Vad`, `Vb`, `Vbo`, `Vbd`, `sV`, `sVb`, `VI`, `VIo`, `VId`, `VII`, `VIIo`, `VIId`, `VIII`, `VIIIo`, `VIIId`
##### `soilAnalysisSourceEnum`
-* **Name**: `a_source`
-* **Possible values**: `nl-rva-l122` (Eurofins Agro Testing Wageningen B.V.), `nl-rva-l136` (Nutrilab B.V.), `nl-rva-l264` (Normec Robalab B.V.), `nl-rva-l320` (Agrarisch Laboratorium Noord-Nederland/Alnn B.V.), `nl-rva-l335` (Normec Groen Agro Control), `nl-rva-l610` (Normec Dumea B.V.), `nl-rva-l648` (Fertilab B.V.), `nl-rva-l697` (Care4Agro B.V.), `nl-other-nmi` (NMI BodemSchat), `other` (Ander laboratorium)
+
+* **Name**: `a_source`
+* **Possible values**: `nl-rva-l122` (Eurofins Agro Testing Wageningen B.V.), `nl-rva-l136` (Nutrilab B.V.), `nl-rva-l264` (Normec Robalab B.V.), `nl-rva-l320` (Agrarisch Laboratorium Noord-Nederland/Alnn B.V.), `nl-rva-l335` (Normec Groen Agro Control), `nl-rva-l610` (Normec Dumea B.V.), `nl-rva-l648` (Fertilab B.V.), `nl-rva-l697` (Care4Agro B.V.), `nl-other-nmi` (NMI BodemSchat), `other` (Ander laboratorium)
#### **`soilSampling`**
+
**Purpose**: Records the details of a soil sampling event, linking a field location to a soil analysis.
| Column | Type | Constraints | Description |
@@ -477,6 +517,7 @@ This schema holds the primary data related to farm operations.
### Derogations & Certifications
#### **`derogations`**
+
**Purpose**: Stores information about derogations, which is special permissions by year related to legal norms for fertilizer application.
| Column | Type | Constraints | Description |
@@ -487,9 +528,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Indexes:**
-* Unique index on `b_id_derogation`.
+
+* Unique index on `b_id_derogation`.
#### **`derogationApplying`**
+
**Purpose**: Links a farm to a specific derogation, indicating that the farm is applying or making use of that derogation.
| Column | Type | Constraints | Description |
@@ -500,9 +543,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_farm`, `b_id_derogation`).
+
+* Primary Key on (`b_id_farm`, `b_id_derogation`).
#### **`organicCertifications`**
+
**Purpose**: Stores information about organic certifications for a farm.
| Column | Type | Constraints | Description |
@@ -516,6 +561,7 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
#### **`organicCertificationsHolding`**
+
**Purpose**: Links a farm to a specific organic certification.
| Column | Type | Constraints | Description |
@@ -526,9 +572,11 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_farm`, `b_id_organic`).
+
+* Primary Key on (`b_id_farm`, `b_id_organic`).
#### **`intendingGrazing`**
+
**Purpose**: Stores the grazing intention for a farm for a specific year.
| Column | Type | Constraints | Description |
@@ -540,7 +588,8 @@ This schema holds the primary data related to farm operations.
| **updated** | `timestamp with time zone` | | Timestamp when this record was last updated. |
**Constraints:**
-* Primary Key on (`b_id_farm`, `b_grazing_intention_year`).
+
+* Primary Key on (`b_id_farm`, `b_grazing_intention_year`).
---
@@ -551,6 +600,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
**Note:** This schema is largely defined and managed by the [`better-auth`](https://github.com/BetterStackHQ/better-auth) library. While the specific table structures are documented here for completeness, refer to the `better-auth` documentation for the most detailed information on its implementation and usage.
#### **`user`**
+
**Purpose**: Stores user account information.
| Column | Type | Constraints | Description |
@@ -570,6 +620,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **farm_active** | `text` | | Identifier of the user's currently active farm. |
#### **`session`**
+
**Purpose**: Stores active user sessions.
| Column | Type | Constraints | Description |
@@ -585,6 +636,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **activeOrganizationId**| `text`| | Identifier of the user's currently active organization. |
#### **`account`**
+
**Purpose**: Links user accounts to external authentication providers (e.g., OAuth providers) or stores credentials for password-based login.
| Column | Type | Constraints | Description |
@@ -604,6 +656,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **updatedAt** | `timestamp` | Not Null | Timestamp when the account link was last updated. |
#### **`verification`**
+
**Purpose**: Stores tokens used for verification purposes (e.g., email verification, password reset).
| Column | Type | Constraints | Description |
@@ -616,6 +669,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **updatedAt**| `timestamp` | | Timestamp when the verification record was last updated. |
#### **`organization`**
+
**Purpose**: Stores information about organizations in a multi-tenant setup.
| Column | Type | Constraints | Description |
@@ -628,6 +682,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **metadata** | `text` | | JSON string for additional organization metadata. |
#### **`member`**
+
**Purpose**: Links users to organizations and defines their role within that organization.
| Column | Type | Constraints | Description |
@@ -639,6 +694,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **createdAt** | `timestamp` | Not Null | Timestamp when the membership was created. |
#### **`invitation`**
+
**Purpose**: Stores invitations for users to join an organization.
| Column | Type | Constraints | Description |
@@ -652,6 +708,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
| **inviterId**| `text` | Not Null, Foreign Key (references `user.id`, onDelete: cascade) | Identifier of the user who sent the invitation. |
#### **`rateLimit`**
+
**Purpose**: Used for tracking and enforcing rate limits on certain actions.
| Column | Type | Constraints | Description |
@@ -668,6 +725,7 @@ This schema handles user authentication, sessions, accounts, organizations, and
This schema manages roles, permissions, and auditing for authorization purposes.
#### **`role`**
+
**Purpose**: Defines roles assigned to principals (users) for specific resources.
| Column | Type | Constraints | Description |
@@ -681,9 +739,11 @@ This schema manages roles, permissions, and auditing for authorization purposes.
| **deleted** | `timestamp with time zone` | | Timestamp when the role assignment was revoked (soft delete). |
**Indexes:**
-* Composite index on (`resource`, `resource_id`, `principal_id`, `role`, `deleted`).
+
+* Composite index on (`resource`, `resource_id`, `principal_id`, `role`, `deleted`).
#### **`audit`**
+
**Purpose**: Logs authorization checks (audit trail) to record who attempted what action on which resource.
| Column | Type | Constraints | Description |
@@ -707,6 +767,7 @@ This schema manages roles, permissions, and auditing for authorization purposes.
This schema is used to cache calculation results and store errors that occur during calculations.
#### **`calculationCache`**
+
**Purpose**: Caches the results of calculations to improve performance.
| Column | Type | Constraints | Description |
@@ -719,6 +780,7 @@ This schema is used to cache calculation results and store errors that occur dur
| **created_at** | `timestamp with time zone` | Not Null | Timestamp when the calculation was cached (default: now()). |
#### **`calculationErrors`**
+
**Purpose**: Logs errors that occur during calculations.
| Column | Type | Constraints | Description |
@@ -738,16 +800,18 @@ This schema is used to cache calculation results and store errors that occur dur
These custom types are defined in `schema-custom-types.ts` to handle specific data representations.
#### **`numericCasted`**
-* **Purpose**: A workaround for Drizzle ORM potentially returning `numeric` SQL types as strings. This custom type ensures that numeric values are correctly parsed as numbers (`float`) in the application layer.
-* **SQL Type**: `numeric` or `numeric(precision, scale)`
-* **Application Type**: `number`
-* **Note**: Maps SQL `numeric` to TypeScript `number`. Be aware of potential precision loss for values exceeding JavaScript's `Number.MAX_SAFE_INTEGER` range, though this is rare for agricultural data.
+
+* **Purpose**: A workaround for Drizzle ORM potentially returning `numeric` SQL types as strings. This custom type ensures that numeric values are correctly parsed as numbers (`float`) in the application layer.
+* **SQL Type**: `numeric` or `numeric(precision, scale)`
+* **Application Type**: `number`
+* **Note**: Maps SQL `numeric` to TypeScript `number`. Be aware of potential precision loss for values exceeding JavaScript's `Number.MAX_SAFE_INTEGER` range, though this is rare for agricultural data.
#### **`geometry`**
-* **Purpose**: Handles PostGIS `geometry` types, allowing storage and retrieval of GeoJSON-like data.
-* **SQL Type**: `geometry` (optionally constrained, e.g., `geometry(Polygon, 4326)`)
-* **Application Type**: GeoJSON `Geometry` object (e.g., `Polygon`, `MultiPoint`).
-* **Dependencies**: Requires the PostGIS extension enabled in the PostgreSQL database.
-* **Current Implementation**: The provided code in `schema-custom-types.ts` includes parsing logic primarily for `Polygon` and `MultiPoint` types when reading from the database (especially from hexewkb format). Writing uses `ST_GeomFromGeoJSON`. Support for other geometry types might be limited or require additional parsing logic.
-* **SRID**: Assumes SRID 4326 (WGS 84).
-* **Note**: Stored as SRID 4326 (WGS 84). Area and distance calculations should cast to `geography` to account for earth curvature.
+
+* **Purpose**: Handles PostGIS `geometry` types, allowing storage and retrieval of GeoJSON-like data.
+* **SQL Type**: `geometry` (optionally constrained, e.g., `geometry(Polygon, 4326)`)
+* **Application Type**: GeoJSON `Geometry` object (e.g., `Polygon`, `MultiPoint`).
+* **Dependencies**: Requires the PostGIS extension enabled in the PostgreSQL database.
+* **Current Implementation**: The provided code in `schema-custom-types.ts` includes parsing logic primarily for `Polygon` and `MultiPoint` types when reading from the database (especially from hexewkb format). Writing uses `ST_GeomFromGeoJSON`. Support for other geometry types might be limited or require additional parsing logic.
+* **SRID**: Assumes SRID 4326 (WGS 84).
+* **Note**: Stored as SRID 4326 (WGS 84). Area and distance calculations should cast to `geography` to account for earth curvature.
diff --git a/fdm-docs/docs/core-concepts/02-farms.md b/fdm-docs/docs/core-concepts/02-farms.md
index 9b8df5e63..e8f44baf2 100644
--- a/fdm-docs/docs/core-concepts/02-farms.md
+++ b/fdm-docs/docs/core-concepts/02-farms.md
@@ -2,19 +2,17 @@
title: Farms
---
-# Farms
-
The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming operation and is the primary unit within the system.
## Properties
A `Farm` has the following properties, which are stored in the `farms` table:
-* **`b_id_farm`**: A unique identifier for the farm. This is the primary key for the `farms` table.
-* **`b_name_farm`**: The name of the farm.
-* **`b_businessid_farm`**: The business ID associated with the farm (e.g., a Chamber of Commerce number).
-* **`b_address_farm`**: The physical address of the farm.
-* **`b_postalcode_farm`**: The postal code of the farm address.
+* **`b_id_farm`**: A unique identifier for the farm. This is the primary key for the `farms` table.
+* **`b_name_farm`**: The name of the farm.
+* **`b_businessid_farm`**: The business ID associated with the farm (e.g., a Chamber of Commerce number).
+* **`b_address_farm`**: The physical address of the farm.
+* **`b_postalcode_farm`**: The postal code of the farm address.
## Users and Roles
@@ -26,7 +24,7 @@ For a detailed explanation of the authorization system, please see the [Authoriz
In addition to the basic properties, a `Farm` can have several other types of data associated with it:
-* **Organic Certifications:** You can store information about a farm's organic certifications in the `organicCertifications` and `organicCertificationsHolding` tables. This includes details like the certification body, certification numbers (e.g., TRACES, Skal), and the dates the certification was issued and expires.
-* **Derogations:** The `derogations` and `derogationApplying` tables are used to track any special permissions (derogations) that a farm has been granted for a specific year. These are related to legal norms for fertilizer application.
-* **Grazing Intentions:** The `intendingGrazing` table allows you to record a farm's intention to graze animals for a specific year. This is a boolean flag associated with the farm and the year.
-* **Catalogue Preferences:** The `fertilizerCatalogueEnabling` and `cultivationCatalogueSelecting` tables allow you to specify which data sources a farm uses for its fertilizer and cultivation catalogues. This provides flexibility in managing standardized data.
+* **Organic Certifications:** You can store information about a farm's organic certifications in the `organicCertifications` and `organicCertificationsHolding` tables. This includes details like the certification body, certification numbers (e.g., TRACES, Skal), and the dates the certification was issued and expires.
+* **Derogations:** The `derogations` and `derogationApplying` tables are used to track any special permissions (derogations) that a farm has been granted for a specific year. These are related to legal norms for fertilizer application.
+* **Grazing Intentions:** The `intendingGrazing` table allows you to record a farm's intention to graze animals for a specific year. This is a boolean flag associated with the farm and the year.
+* **Catalogue Preferences:** The `fertilizerCatalogueEnabling` and `cultivationCatalogueSelecting` tables allow you to specify which data sources a farm uses for its fertilizer and cultivation catalogues. This provides flexibility in managing standardized data.
diff --git a/fdm-docs/docs/core-concepts/03-fields.md b/fdm-docs/docs/core-concepts/03-fields.md
index 169ab84e3..404068d00 100644
--- a/fdm-docs/docs/core-concepts/03-fields.md
+++ b/fdm-docs/docs/core-concepts/03-fields.md
@@ -2,8 +2,6 @@
title: Fields
---
-# Fields
-
The `Field` asset is the primary spatial asset in the Farm Data Model (FDM). It represents a specific area of land where agricultural activities take place.
## Geometric Properties
@@ -16,17 +14,17 @@ The geometry is stored in the [WGS 84](https://en.wikipedia.org/wiki/World_Geode
A `Field` has the following properties, which are stored in the `fields` table:
-* **`b_id`**: A unique identifier for the field. This is the primary key for the `fields` table.
-* **`b_name`**: The name of the field.
-* **`b_geometry`**: The geometry of the field, as a GeoJSON polygon.
-* **`b_id_source`**: An optional identifier from an external data source.
+* **`b_id`**: A unique identifier for the field. This is the primary key for the `fields` table.
+* **`b_name`**: The name of the field.
+* **`b_geometry`**: The geometry of the field, as a GeoJSON polygon.
+* **`b_id_source`**: An optional identifier from an external data source.
## Relationship to a Farm
A `Field` is always associated with a `Farm`. This relationship is established through the `fieldAcquiring` table, which links a `field` (`b_id`) to a `farm` (`b_id_farm`). This table also records:
-* **`b_start`**: The date when the farm's management of the field began.
-* **`b_acquiring_method`**: The method by which the farm acquired the field (e.g., ownership, lease).
+* **`b_start`**: The date when the farm's management of the field began.
+* **`b_acquiring_method`**: The method by which the farm acquired the field (e.g., ownership, lease).
The `fieldDiscarding` table is used to mark when a field is no longer actively managed by the farm.
diff --git a/fdm-docs/docs/core-concepts/04-cultivations.md b/fdm-docs/docs/core-concepts/04-cultivations.md
index 642031890..02eae8c2d 100644
--- a/fdm-docs/docs/core-concepts/04-cultivations.md
+++ b/fdm-docs/docs/core-concepts/04-cultivations.md
@@ -2,20 +2,18 @@
title: Cultivations
---
-# Cultivations
-
A `Cultivation` represents the lifecycle of a crop on a `Field`. It is a central concept in the Farm Data Model (FDM) that allows you to track the entire process of growing a crop, from planting to harvest.
## The Cultivation Lifecycle
A `Cultivation` is defined by a sequence of actions that are stored in separate tables:
-1. **`cultivationStarting`**: This action marks the beginning of a cultivation. It links a `cultivation` to a `field` and records the following information:
- * `b_lu_start`: The date when the crop was planted.
- * `b_sowing_amount`: The amount of seed that was used.
- * `b_sowing_method`: The method used for sowing.
-2. **`cultivationHarvesting`**: This action represents the gathering of the crop. It links a `cultivation` to a `harvestable` and records the `b_lu_harvest_date`. A single cultivation can have multiple harvesting events.
-3. **`cultivationEnding`**: This action marks the end of a cultivation. It records the `b_lu_end` date and whether the crop residue was left on the field (`m_cropresidue`).
+1. **`cultivationStarting`**: This action marks the beginning of a cultivation. It links a `cultivation` to a `field` and records the following information:
+ * `b_lu_start`: The date when the crop was planted.
+ * `b_sowing_amount`: The amount of seed that was used.
+ * `b_sowing_method`: The method used for sowing.
+2. **`cultivationHarvesting`**: This action represents the gathering of the crop. It links a `cultivation` to a `harvestable` and records the `b_lu_harvest_date`. A single cultivation can have multiple harvesting events.
+3. **`cultivationEnding`**: This action marks the end of a cultivation. It records the `b_lu_end` date and whether the crop residue was left on the field (`m_cropresidue`).
This sequence of actions defines a single cultivation period. A `Field` can have multiple cultivations over time, be fallow or have multiple cultivations on the same time.
@@ -25,10 +23,10 @@ Each `Cultivation` is linked to the `cultivationsCatalogue` via the `b_lu_catalo
The `cultivationsCatalogue` provides a wealth of information about each crop, including:
-* `b_lu_name`: The name of the crop.
-* `b_lu_variety_options`: A list of possible varieties for the crop.
-* `b_lu_harvestable`: Indicates whether the crop is harvested `none`, `once`, or `multiple` times.
-* `b_lu_yield`: The typical yield of the crop.
-* `b_lu_n_harvestable` and `b_lu_n_residue`: The nitrogen content of the harvestable part of the crop and the residue, respectively.
+* `b_lu_name`: The name of the crop.
+* `b_lu_variety_options`: A list of possible varieties for the crop.
+* `b_lu_harvestable`: Indicates whether the crop is harvested `none`, `once`, or `multiple` times.
+* `b_lu_yield`: The typical yield of the crop.
+* `b_lu_n_harvestable` and `b_lu_n_residue`: The nitrogen content of the harvestable part of the crop and the residue, respectively.
A farm can select which cultivation catalogues it wants to use by creating an entry in the `cultivationCatalogueSelecting` table.
diff --git a/fdm-docs/docs/core-concepts/05-harvests.md b/fdm-docs/docs/core-concepts/05-harvests.md
index 0429a1b4a..c560df1c0 100644
--- a/fdm-docs/docs/core-concepts/05-harvests.md
+++ b/fdm-docs/docs/core-concepts/05-harvests.md
@@ -2,17 +2,15 @@
title: Harvests
---
-# Harvests
-
Harvesting is a critical event in the cultivation cycle. In the Farm Data Model (FDM), the harvest is not just a single data point but a detailed data structure that captures the nuances of different crops and their specific measurements. This detailed approach allows for accurate agronomic calculations, such as nutrient balances and yield comparisons.
## The Harvest Data Model
In FDM, a harvest is intrinsically linked to a **cultivation**. A single cultivation can have multiple harvest events, especially for crops like grass that are cut multiple times a season. The core data structure for a harvest involves several related entities:
-- `cultivation_harvesting`: This table links a harvest event to a specific cultivation (`b_lu`) and records the `b_lu_harvest_date`.
-- `harvestables`: Each harvest event can produce one or more "harvestables", and "harvestable" can be linked to multiple harvest events. For example, a potato harvestable might be linked to multiple fields, but collected in the same batch. Note that while the database schema supports it, due to the complexity fdm-core functions currently only support 1:1 relations between harvests and harvestables.
-- `harvestable_analyses`: For each harvestable, one or more analyses can be recorded. This is where the specific measurements for the harvest are stored.
+- `cultivation_harvesting`: This table links a harvest event to a specific cultivation (`b_lu`) and records the `b_lu_harvest_date`.
+- `harvestables`: Each harvest event can produce one or more "harvestables", and "harvestable" can be linked to multiple harvest events. For example, a potato harvestable might be linked to multiple fields, but collected in the same batch. Note that while the database schema supports it, due to the complexity fdm-core functions currently only support 1:1 relations between harvests and harvestables.
+- `harvestable_analyses`: For each harvestable, one or more analyses can be recorded. This is where the specific measurements for the harvest are stored.
This structure provides a flexible and detailed representation of harvest events, accommodating a wide range of crops and harvesting practices.
@@ -20,9 +18,9 @@ This structure provides a flexible and detailed representation of harvest events
A key challenge in modeling harvests is the diversity of parameters measured for different crops. What is relevant for a silage maize grower is different from what a potato farmer measures. For example:
-- For **silage maize**, a farmer might record the fresh weight yield (`b_lu_yield_fresh`) and the dry matter percentage (`b_lu_dm`).
-- For **potatoes**, the gross yield (`b_lu_yield_bruto`), tare percentage (`b_lu_tarra`), and underwater weight (`b_lu_uww`) are common parameters.
-- For **cereals**, fresh weight yield (`b_lu_yield_fresh`), moisture content (`b_lu_moist`), and crude protein (`b_lu_cp`) are often measured.
+- For **silage maize**, a farmer might record the fresh weight yield (`b_lu_yield_fresh`) and the dry matter percentage (`b_lu_dm`).
+- For **potatoes**, the gross yield (`b_lu_yield_bruto`), tare percentage (`b_lu_tarra`), and underwater weight (`b_lu_uww`) are common parameters.
+- For **cereals**, fresh weight yield (`b_lu_yield_fresh`), moisture content (`b_lu_moist`), and crude protein (`b_lu_cp`) are often measured.
FDM is designed to store these crop-specific parameters as they are measured in the field, ensuring that the raw data is preserved.
@@ -30,8 +28,8 @@ FDM is designed to store these crop-specific parameters as they are measured in
While storing crop-specific parameters is essential for data fidelity, many agronomic calculations require standardized values. The two most important standardized parameters in FDM are:
-- `b_lu_yield`: The dry matter yield in kilograms per hectare (kg DM/ha).
-- `b_lu_n_harvestable`: The nitrogen content of the harvested product in grams of nitrogen per kilogram of dry matter (g N/kg DM).
+- `b_lu_yield`: The dry matter yield in kilograms per hectare (kg DM/ha).
+- `b_lu_n_harvestable`: The nitrogen content of the harvested product in grams of nitrogen per kilogram of dry matter (g N/kg DM).
To bridge the gap between the various measured parameters and these standardized values, FDM uses a system of **Harvest Categories** (`b_lu_harvestcat`). Each cultivation in the FDM catalogue is assigned to a harvest category. This category determines which parameters are expected at harvest and, crucially, defines the formulas used to calculate the standardized `b_lu_yield` and `b_lu_n_harvestable`.
@@ -39,31 +37,31 @@ To bridge the gap between the various measured parameters and these standardized
Here are a few examples of how harvest categories are used to standardize harvest data:
-- **HC020 (Grassland)**:
- - **Measured parameters**: `b_lu_yield` (already in kg DM/ha) and `b_lu_cp` (crude protein in g/kg DM).
- - **Formulas**:
- - `b_lu_yield` is used directly.
- - `b_lu_n_harvestable` is calculated from crude protein: `b_lu_n_harvestable = b_lu_cp / 6.25`.
-
-- **HC042 (Potatoes)**:
- - **Measured parameters**: `b_lu_yield_bruto` (kg/ha), `b_lu_tarra` (%), and `b_lu_uww` (g/5kg). `b_lu_n_harvestable` is often a default value for the crop.
- - **Formulas**:
- - First, dry matter content (`b_lu_dm`) is calculated from underwater weight: `b_lu_dm = (b_lu_uww * 0.049 + 2.0) * 10`.
- - Then, fresh yield is calculated: `b_lu_yield_fresh = b_lu_yield_bruto * (1 - b_lu_tarra / 100)`.
- - Finally, dry matter yield is calculated: `b_lu_yield = b_lu_yield_fresh * b_lu_dm / 1000`.
-
-- **HC050 (Cereals)**:
- - **Measured parameters**: `b_lu_yield_fresh` (kg/ha), `b_lu_moist` (%), and `b_lu_cp` (g/kg DM).
- - **Formulas**:
- - Dry matter content is calculated from moisture: `b_lu_dm = (100 - b_lu_moist) * 10`.
- - Dry matter yield is calculated: `b_lu_yield = b_lu_yield_fresh * b_lu_dm / 1000`.
- - Nitrogen content is calculated from crude protein (using a specific factor for cereals): `b_lu_n_harvestable = b_lu_cp / 5.7`.
+- **HC020 (Grassland)**:
+ - **Measured parameters**: `b_lu_yield` (already in kg DM/ha) and `b_lu_cp` (crude protein in g/kg DM).
+ - **Formulas**:
+ - `b_lu_yield` is used directly.
+ - `b_lu_n_harvestable` is calculated from crude protein: `b_lu_n_harvestable = b_lu_cp / 6.25`.
+
+- **HC042 (Potatoes)**:
+ - **Measured parameters**: `b_lu_yield_bruto` (kg/ha), `b_lu_tarra` (%), and `b_lu_uww` (g/5kg). `b_lu_n_harvestable` is often a default value for the crop.
+ - **Formulas**:
+ - First, dry matter content (`b_lu_dm`) is calculated from underwater weight: `b_lu_dm = (b_lu_uww * 0.049 + 2.0) * 10`.
+ - Then, fresh yield is calculated: `b_lu_yield_fresh = b_lu_yield_bruto * (1 - b_lu_tarra / 100)`.
+ - Finally, dry matter yield is calculated: `b_lu_yield = b_lu_yield_fresh * b_lu_dm / 1000`.
+
+- **HC050 (Cereals)**:
+ - **Measured parameters**: `b_lu_yield_fresh` (kg/ha), `b_lu_moist` (%), and `b_lu_cp` (g/kg DM).
+ - **Formulas**:
+ - Dry matter content is calculated from moisture: `b_lu_dm = (100 - b_lu_moist) * 10`.
+ - Dry matter yield is calculated: `b_lu_yield = b_lu_yield_fresh * b_lu_dm / 1000`.
+ - Nitrogen content is calculated from crude protein (using a specific factor for cereals): `b_lu_n_harvestable = b_lu_cp / 5.7`.
### Practical Implications
This two-step approach of storing raw data and standardizing it through harvest categories offers several advantages:
-- **Data Integrity**: The original, measured data is never lost.
-- **Flexibility**: The system can easily be extended to support new crops or measurement techniques by adding new harvest categories.
-- **Comparability**: By converting all harvest data to a standardized format, it becomes possible to compare yields and nutrient removal across different crops and farms.
-- **Agronomic Accuracy**: Standardized data is essential for accurate nutrient management, as it allows for precise calculation of nutrient offtake in the harvested biomass.
+- **Data Integrity**: The original, measured data is never lost.
+- **Flexibility**: The system can easily be extended to support new crops or measurement techniques by adding new harvest categories.
+- **Comparability**: By converting all harvest data to a standardized format, it becomes possible to compare yields and nutrient removal across different crops and farms.
+- **Agronomic Accuracy**: Standardized data is essential for accurate nutrient management, as it allows for precise calculation of nutrient offtake in the harvested biomass.
diff --git a/fdm-docs/docs/core-concepts/06-fertilizers.md b/fdm-docs/docs/core-concepts/06-fertilizers.md
index b371bc6b0..82d949781 100644
--- a/fdm-docs/docs/core-concepts/06-fertilizers.md
+++ b/fdm-docs/docs/core-concepts/06-fertilizers.md
@@ -2,30 +2,28 @@
title: Fertilizers
---
-# Fertilizers
-
Fertilizer management is a critical aspect of modern agriculture, and the Farm Data Model (FDM) provides a comprehensive way to track and manage fertilizer applications.
## Defining and Applying Fertilizers
In FDM, there are two main ways to work with fertilizers:
-1. **Using Pre-defined Fertilizers from a Catalogue:** FDM includes a `fertilizersCatalogue` that contains a standardized list of common fertilizers. This catalogue provides information about each fertilizer, including its nutrient content, density, and application methods. When you use a fertilizer from the catalogue, you create a `fertilizerPicking` record to link your specific fertilizer instance to the catalogue entry.
-2. **Defining Custom Fertilizers:** If a fertilizer is not in the catalogue, you can define a custom one by creating a new entry in the `fertilizers` table. Storing specific nutrient analysis for custom fertilizers is a planned feature and not yet implemented. This is particularly useful for manure and other organic fertilizers, which can have highly variable nutrient content.
+1. **Using Pre-defined Fertilizers from a Catalogue:** FDM includes a `fertilizersCatalogue` that contains a standardized list of common fertilizers. This catalogue provides information about each fertilizer, including its nutrient content, density, and application methods. When you use a fertilizer from the catalogue, you create a `fertilizerPicking` record to link your specific fertilizer instance to the catalogue entry.
+2. **Defining Custom Fertilizers:** If a fertilizer is not in the catalogue, you can define a custom one by creating a new entry in the `fertilizers` table. Storing specific nutrient analysis for custom fertilizers is a planned feature and not yet implemented. This is particularly useful for manure and other organic fertilizers, which can have highly variable nutrient content.
When you apply a fertilizer to a `Field`, you create a `fertilizer_applying` action. This action is stored in the `fertilizerApplication` table and records:
-* **`p_app_id`**: A unique identifier for the application event.
-* **`b_id`**: The ID of the `Field` where the fertilizer was applied.
-* **`p_id`**: The ID of the specific fertilizer instance that was used.
-* **`p_app_amount`**: The amount of fertilizer that was applied (typically in kg/ha).
-* **`p_app_method`**: The method of application (e.g., broadcasting, injection).
-* **`p_app_date`**: The date of the application.
+* **`p_app_id`**: A unique identifier for the application event.
+* **`b_id`**: The ID of the `Field` where the fertilizer was applied.
+* **`p_id`**: The ID of the specific fertilizer instance that was used.
+* **`p_app_amount`**: The amount of fertilizer that was applied (typically in kg/ha).
+* **`p_app_method`**: The method of application (e.g., broadcasting, injection).
+* **`p_app_date`**: The date of the application.
## The `fertilizersCatalogue`
The `fertilizersCatalogue` is a key component of the FDM. It provides a structured way to represent fertilizers, which has several benefits:
-* **Data Consistency:** Using a standardized list of fertilizers helps ensure that data is consistent and comparable across different farms and applications.
-* **Reduced Data Entry:** By pre-defining common fertilizers, the need for manual data entry is reduced.
-* **Facilitates Calculations:** The `fertilizersCatalogue` provides data useful for agronomic calculations, such as nutrient balance and fertilizer recommendations. Each entry in the catalogue contains a detailed breakdown of the fertilizer's composition, including its content of macro and micronutrients.
+* **Data Consistency:** Using a standardized list of fertilizers helps ensure that data is consistent and comparable across different farms and applications.
+* **Reduced Data Entry:** By pre-defining common fertilizers, the need for manual data entry is reduced.
+* **Facilitates Calculations:** The `fertilizersCatalogue` provides data useful for agronomic calculations, such as nutrient balance and fertilizer recommendations. Each entry in the catalogue contains a detailed breakdown of the fertilizer's composition, including its content of macro and micronutrients.
diff --git a/fdm-docs/docs/core-concepts/07-soil-analyses.md b/fdm-docs/docs/core-concepts/07-soil-analyses.md
index dcf8da6c5..01d126d1a 100644
--- a/fdm-docs/docs/core-concepts/07-soil-analyses.md
+++ b/fdm-docs/docs/core-concepts/07-soil-analyses.md
@@ -2,31 +2,29 @@
title: Soil Analyses
---
-# Soil Analyses
-
Soil analysis is a fundamental practice in agriculture, providing valuable insights into the health and fertility of the soil. The Farm Data Model (FDM) provides a structured way to store and manage soil analysis data.
## Structure of Soil Sample Data
In FDM, soil analysis data is linked to a specific `Field`. A `soilSampling` action is created to record the details of the sampling event. This is stored in the `soilSampling` table, which includes:
-* **`b_id_sampling`**: A unique identifier for the sampling event.
-* **`b_id`**: The ID of the `Field` where the sample was taken.
-* **`a_id`**: The ID of the corresponding `soilAnalysis` record.
-* **`b_sampling_date`**: The date when the soil sample was taken.
-* **`a_depth_upper` and `a_depth_lower`**: The upper and lower depths of the soil sample.
-* **`b_sampling_geometry`**: The geographic coordinates where the sample was taken, stored as a GeoJSON `MultiPoint`.
+* **`b_id_sampling`**: A unique identifier for the sampling event.
+* **`b_id`**: The ID of the `Field` where the sample was taken.
+* **`a_id`**: The ID of the corresponding `soilAnalysis` record.
+* **`b_sampling_date`**: The date when the soil sample was taken.
+* **`a_depth_upper` and `a_depth_lower`**: The upper and lower depths of the soil sample.
+* **`b_sampling_geometry`**: The geographic coordinates where the sample was taken, stored as a GeoJSON `MultiPoint`.
The results of the soil analysis are stored in the `soilAnalysis` table. This table includes a wide range of parameters, such as:
-* **`a_id`**: A unique identifier for the analysis record.
-* **`a_date`**: The date the analysis was performed.
-* **`a_source`**: The laboratory that performed the analysis.
-* **`a_ph_cc`**: The pH of the soil.
-* **`a_som_loi`**: The organic matter content of the soil.
-* **Nutrient Levels:** A comprehensive set of columns for the levels of key nutrients, such as nitrogen (N), phosphorus (P), and potassium (K), as well as micronutrients.
-* **`b_gwl_class`**: The groundwater level classification.
-* **`b_soiltype_agr`**: The agricultural soil type.
+* **`a_id`**: A unique identifier for the analysis record.
+* **`a_date`**: The date the analysis was performed.
+* **`a_source`**: The laboratory that performed the analysis.
+* **`a_ph_cc`**: The pH of the soil.
+* **`a_som_loi`**: The organic matter content of the soil.
+* **Nutrient Levels:** A comprehensive set of columns for the levels of key nutrients, such as nitrogen (N), phosphorus (P), and potassium (K), as well as micronutrients.
+* **`b_gwl_class`**: The groundwater level classification.
+* **`b_soiltype_agr`**: The agricultural soil type.
## Linking to Fields
diff --git a/fdm-docs/docs/core-concepts/08-catalogues.md b/fdm-docs/docs/core-concepts/08-catalogues.md
index 77aa92e99..4339a89b5 100644
--- a/fdm-docs/docs/core-concepts/08-catalogues.md
+++ b/fdm-docs/docs/core-concepts/08-catalogues.md
@@ -2,24 +2,22 @@
title: Catalogues
---
-# Catalogues
-
The `fdm-data` package is a key component of the Farm Data Model (FDM) that provides pre-defined, standardized data sets for a variety of agricultural concepts. These data sets are known as **catalogues**.
## Purpose of Catalogues
The primary purpose of the catalogues is to ensure data consistency and reduce the need for manual data entry. By providing standardized lists of common agricultural inputs and products, the catalogues help to:
-* **Standardize Data:** Ensure that the same terminology is used for the same concepts across different farms and applications.
-* **Improve Data Quality:** Reduce the risk of errors and inconsistencies that can arise from manual data entry.
-* **Simplify Data Entry:** Make it easier and faster to enter data by providing pre-populated lists of options.
+* **Standardize Data:** Ensure that the same terminology is used for the same concepts across different farms and applications.
+* **Improve Data Quality:** Reduce the risk of errors and inconsistencies that can arise from manual data entry.
+* **Simplify Data Entry:** Make it easier and faster to enter data by providing pre-populated lists of options.
## Available Catalogues
The `fdm-data` package includes the following catalogues, which are stored in the `cultivations_catalogue` and `fertilizers_catalogue` tables respectively:
-* **`cultivationsCatalogue`**: A standardized list of crops, including their names, varieties, typical yields, nutrient content, and other agronomic properties. Each entry has a `b_lu_catalogue` as its primary key.
-* **`fertilizersCatalogue`**: A standardized list of common fertilizers, including their nutrient content, density, and application methods. Each entry has a `p_id_catalogue` as its primary key.
+* **`cultivationsCatalogue`**: A standardized list of crops, including their names, varieties, typical yields, nutrient content, and other agronomic properties. Each entry has a `b_lu_catalogue` as its primary key.
+* **`fertilizersCatalogue`**: A standardized list of common fertilizers, including their nutrient content, density, and application methods. Each entry has a `p_id_catalogue` as its primary key.
## Farm-Specific Catalogue Selection
diff --git a/fdm-docs/docs/core-concepts/09-authentication.md b/fdm-docs/docs/core-concepts/09-authentication.md
index 5231fa13c..67ad0ff5f 100644
--- a/fdm-docs/docs/core-concepts/09-authentication.md
+++ b/fdm-docs/docs/core-concepts/09-authentication.md
@@ -2,8 +2,6 @@
title: Authentication
---
-# Authentication
-
Authentication is the process of verifying the identity of a user. The Farm Data Model (FDM) utilizes the [Better Auth](https://better-auth.com/) library to provide a standard authentication system. This implementation supports multiple authentication strategies and handles session management through a database-backed approach.
## Supported Strategies
@@ -11,28 +9,32 @@ Authentication is the process of verifying the identity of a user. The Farm Data
FDM is configured to support several authentication methods. The availability of these methods can depend on the specific configuration of the FDM instance.
### Magic Links
+
FDM supports passwordless authentication via Magic Links.
-* Users provide their email address.
-* The system sends a secure, time-limited link to that email.
-* Clicking the link authenticates the user without requiring a password.
+
+* Users provide their email address.
+* The system sends a secure, time-limited link to that email.
+* Clicking the link authenticates the user without requiring a password.
### OAuth Providers
+
FDM includes integration with **Google** and **Microsoft** OAuth providers.
-* **Account Linking:** Users can log in using their existing Google or Microsoft accounts.
-* **Profile Mapping:** Upon login, FDM maps profile information from the provider (First Name, Last Name, and Profile Picture) to the FDM user profile.
-* **User Creation:** New users authenticating via OAuth are automatically provisioned with a unique username and default settings (e.g., language preference set to `nl-NL`).
+
+* **Account Linking:** Users can log in using their existing Google or Microsoft accounts.
+* **Profile Mapping:** Upon login, FDM maps profile information from the provider (First Name, Last Name, and Profile Picture) to the FDM user profile.
+* **User Creation:** New users authenticating via OAuth are automatically provisioned with a unique username and default settings (e.g., language preference set to `nl-NL`).
## Session Management
FDM uses a database-backed session system managed by Better Auth.
-* **Session Storage:** Sessions are stored in the database using the Drizzle ORM adapter. This allows for server-side session control and revocation.
-* **Expiration:** By default, sessions are configured to expire after 30 days.
-* **Renewal:** Active sessions are automatically updated every 24 hours to extend their validity.
+* **Session Storage:** Sessions are stored in the database using the Drizzle ORM adapter. This allows for server-side session control and revocation.
+* **Expiration:** By default, sessions are configured to expire after 30 days.
+* **Renewal:** Active sessions are automatically updated every 24 hours to extend their validity.
## Implementation Details
The core authentication logic resides in `fdm-core/src/authentication.ts`.
-* **Schema Extensions:** The user schema is extended to include FDM-specific fields such as `firstname`, `surname`, `lang`, and `farm_active`.
-* **Organizations:** The system utilizes the Better Auth organization plugin, which supports the creation and management of organizations within the authentication flow.
+* **Schema Extensions:** The user schema is extended to include FDM-specific fields such as `firstname`, `surname`, `lang`, and `farm_active`.
+* **Organizations:** The system utilizes the Better Auth organization plugin, which supports the creation and management of organizations within the authentication flow.
diff --git a/fdm-docs/docs/core-concepts/10-authorization.md b/fdm-docs/docs/core-concepts/10-authorization.md
index 0177ff176..23321caf6 100644
--- a/fdm-docs/docs/core-concepts/10-authorization.md
+++ b/fdm-docs/docs/core-concepts/10-authorization.md
@@ -2,33 +2,31 @@
title: Authorization
---
-# Authorization
-
Authorization is the process of determining what actions a user is allowed to perform. The Farm Data Model (FDM) provides a resource-based permission model that allows you to control access to your data.
## The Permission Model
FDM's permission model is based on a combination of **resources**, **roles**, and **actions**.
-* **Resources:** These are the main entities in the FDM, such as `farm`, `field`, `cultivation`, etc.
-* **Roles:** These are collections of permissions that can be assigned to a user for a specific resource. FDM defines the following roles:
- * `owner`: Full control over the resource.
- * `advisor`: Can view and edit the resource.
- * `researcher`: Can only view the resource.
-* **Actions:** These are the operations that can be performed on a resource, such as `read`, `write`, `list`, and `share`.
+* **Resources:** These are the main entities in the FDM, such as `farm`, `field`, `cultivation`, etc.
+* **Roles:** These are collections of permissions that can be assigned to a user for a specific resource. FDM defines the following roles:
+* `owner`: Full control over the resource.
+* `advisor`: Can view and edit the resource.
+* `researcher`: Can only view the resource.
+* **Actions:** These are the operations that can be performed on a resource, such as `read`, `write`, `list`, and `share`.
## How Access Control is Handled
Access control is handled by the `fdm-authz` schema, which contains two main tables:
-* **`role`**: This table stores the roles that have been assigned to users for specific resources. Each row in this table represents a single role assignment, linking a `principal_id` (user) to a `resource` and `resource_id`.
-* **`audit`**: This table provides an audit trail of all authorization checks. It records who attempted to perform what action on which resource, and whether the action was allowed or denied.
+* **`role`**: This table stores the roles that have been assigned to users for specific resources. Each row in this table represents a single role assignment, linking a `principal_id` (user) to a `resource` and `resource_id`.
+* **`audit`**: This table provides an audit trail of all authorization checks. It records who attempted to perform what action on which resource, and whether the action was allowed or denied.
When a user attempts to perform an action, the `checkPermission` function is called. This function does the following:
-1. **Determines the required roles:** It first determines which roles are required to perform the requested action on the given resource.
-2. **Constructs the resource hierarchy:** It then constructs the resource hierarchy for the target resource. For example, if the target resource is a `cultivation`, the hierarchy would be `farm` -> `field` -> `cultivation`.
-3. **Checks for permissions:** It then checks to see if the user has been granted any of the required roles on any of the resources in the hierarchy.
-4. **Audits the check:** Finally, it records the result of the check in the `audit` table.
+1. **Determines the required roles:** It first determines which roles are required to perform the requested action on the given resource.
+2. **Constructs the resource hierarchy:** It then constructs the resource hierarchy for the target resource. For example, if the target resource is a `cultivation`, the hierarchy would be `farm` -> `field` -> `cultivation`.
+3. **Checks for permissions:** It then checks to see if the user has been granted any of the required roles on any of the resources in the hierarchy.
+4. **Audits the check:** Finally, it records the result of the check in the `audit` table.
This system provides a flexible and secure way to control access to your data, while also providing a complete audit trail of all access control decisions.
diff --git a/fdm-docs/docs/core-concepts/11-organizations.md b/fdm-docs/docs/core-concepts/11-organizations.md
index eca20e921..c736d9c3d 100644
--- a/fdm-docs/docs/core-concepts/11-organizations.md
+++ b/fdm-docs/docs/core-concepts/11-organizations.md
@@ -2,17 +2,15 @@
title: Organizations
---
-# Organizations
-
Organizations provide a way to group and manage multiple farms and users under a single entity. This is particularly useful for large agricultural businesses, cooperatives, and other organizations that need to manage data from multiple farms.
## The Organization Schema
The organization-related tables are part of the `fdm-authn` schema, which is based on the `better-auth` library. The main tables are:
-* **`organization`**: This table stores the basic information about an organization, including its `id`, `name`, `slug`, and `logo`.
-* **`member`**: This table links users to organizations. Each row represents a user's membership in an organization and includes their `userId`, `organizationId`, and `role` within that organization (e.g., 'admin', 'member').
-* **`invitation`**: This table is used to manage invitations for users to join an organization.
+* **`organization`**: This table stores the basic information about an organization, including its `id`, `name`, `slug`, and `logo`.
+* **`member`**: This table links users to organizations. Each row represents a user's membership in an organization and includes their `userId`, `organizationId`, and `role` within that organization (e.g., 'admin', 'member').
+* **`invitation`**: This table is used to manage invitations for users to join an organization.
## Multi-Farm Access and Management
@@ -22,11 +20,11 @@ When a role is granted to an `Organization` for a specific farm, all members of
This capability allows you to:
-* **Centralize Access Control**: Manage farm access for an entire team by granting a single role to their organization.
-* **Streamline Onboarding**: New members joining an organization automatically gain the appropriate farm access without individual assignments.
-* **Facilitate Multi-Farm Analysis**: Members of an organization can easily compare and view data across multiple farms to which their organization has been granted access.
-* **Identify Trends and Patterns**: Analyze data and identify trends across the collective farms managed by the organization.
-* **Roll Up Data**: Aggregate data to the organization level for high-level reporting and strategic decision-making.
+* **Centralize Access Control**: Manage farm access for an entire team by granting a single role to their organization.
+* **Streamline Onboarding**: New members joining an organization automatically gain the appropriate farm access without individual assignments.
+* **Facilitate Multi-Farm Analysis**: Members of an organization can easily compare and view data across multiple farms to which their organization has been granted access.
+* **Identify Trends and Patterns**: Analyze data and identify trends across the collective farms managed by the organization.
+* **Roll Up Data**: Aggregate data to the organization level for high-level reporting and strategic decision-making.
This direct linkage of roles between organizations and farms via the `fdm-authz` schema provides a robust and efficient way to manage multi-farm operations.
diff --git a/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md b/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
index 575bc9dd6..e02d5352e 100644
--- a/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
+++ b/fdm-docs/docs/fdm-app/01-introduction-to-fdm-app.md
@@ -3,58 +3,55 @@ title: Introduction to FDM App
sidebar_label: Introduction
---
-# Introduction to FDM App
-
The `fdm-app` is a practical, working example of an application that is built with the Farm Data Model (FDM). It serves as a reference implementation and a showcase of the capabilities of the FDM.
## Features
The `fdm-app` includes the following features:
-* **Farm Data Visualization:** You can view your farm data on a map, including field polygon and with tables for your rotation.
-* **Action Logging:** You can log the actions that take place on your farm, such as sowing, fertilizing, and harvesting.
-* **Data Analysis:** You can use the `fdm-app` to analyze your farm data and gain insights into your nutrient management.
+* **Farm Data Visualization:** You can view your farm data on a map, including field polygon and with tables for your rotation.
+* **Action Logging:** You can log the actions that take place on your farm, such as sowing, fertilizing, and harvesting.
+* **Data Analysis:** You can use the `fdm-app` to analyze your farm data and gain insights into your nutrient management.
## Technical Stack
The `fdm-app` is built with a technical stack that provides specific functionalities and benefits:
-* **Frontend Framework:**
- * **React 19:** A JavaScript library for building user interfaces.
- * **React Router 7 (formerly Remix):** Manages both frontend routing and backend data operations, contributing to a cohesive development experience.
- * **Vite:** A build tool that provides fast server starts and Hot Module Replacement (HMR) for development.
-
-* **UI & Styling:**
- * **Tailwind CSS 4:** A utility-first CSS framework for building custom designs.
- * **shadcn/ui (Radix UI):** A collection of re-usable components built on Radix UI primitives and styled with Tailwind CSS, supporting accessibility and modularity.
- * **Framer Motion:** A motion library for React that supports animations and gestures in the UI.
- * **Lucide React:** An icon library that integrates with React applications.
- * **Sonner:** A toast component for displaying notifications and messages to the user.
-
-* **Backend & Data Management:**
- * **PostgreSQL:** An open-source relational database system.
- * **Drizzle ORM:** A TypeScript ORM for interacting with the database in a type-safe way.
- * **@svenvw/fdm-core:** The core Farm Data Model library, providing business logic and data interaction capabilities.
- * **@svenvw/fdm-data:** Standardized agricultural catalogues for consistent data entry and reference.
- * **@svenvw/fdm-calculator:** A library for performing agronomic calculations.
-
-* **Authentication & Authorization:**
- * **Better Auth:** A library for user authentication and session management.
- * **@svenvw/fdm-core (Authorization module):** Manages role-based access control (RBAC) for various FDM resources.
-
-* **GIS & Mapping:**
- * **Mapbox GL JS & React Map GL:** For interactive maps and geospatial data visualization.
- * **Turf.js:** A geospatial library for spatial analysis operations.
- * **Proj4:** A JavaScript library for coordinate transformation.
- * **Flatgeobuf:** An open format for publishing and consuming geospatial data.
-
-* **Error Tracking & Analytics:**
- * **Sentry:** For error tracking and performance monitoring.
- * **PostHog:** For product analytics.
+* **Frontend Framework:**
+ * **React 19:** A JavaScript library for building user interfaces.
+ * **React Router 7 (formerly Remix):** Manages both frontend routing and backend data operations, contributing to a cohesive development experience.
+ * **Vite:** A build tool that provides fast server starts and Hot Module Replacement (HMR) for development.
+
+* **UI & Styling:**
+ * **Tailwind CSS 4:** A utility-first CSS framework for building custom designs.
+ * **shadcn/ui (Radix UI):** A collection of re-usable components built on Radix UI primitives and styled with Tailwind CSS, supporting accessibility and modularity.
+ * **Framer Motion:** A motion library for React that supports animations and gestures in the UI.
+ * **Lucide React:** An icon library that integrates with React applications.
+ * **Sonner:** A toast component for displaying notifications and messages to the user.
+
+* **Backend & Data Management:**
+ * **PostgreSQL:** An open-source relational database system.
+ * **Drizzle ORM:** A TypeScript ORM for interacting with the database in a type-safe way.
+ * **@svenvw/fdm-core:** The core Farm Data Model library, providing business logic and data interaction capabilities.
+ * **@svenvw/fdm-data:** Standardized agricultural catalogues for consistent data entry and reference.
+ * **@svenvw/fdm-calculator:** A library for performing agronomic calculations.
+
+* **Authentication & Authorization:**
+ * **Better Auth:** A library for user authentication and session management.
+ * **@svenvw/fdm-core (Authorization module):** Manages role-based access control (RBAC) for various FDM resources.
+
+* **GIS & Mapping:**
+ * **Mapbox GL JS & React Map GL:** For interactive maps and geospatial data visualization.
+ * **Turf.js:** A geospatial library for spatial analysis operations.
+ * **Proj4:** A JavaScript library for coordinate transformation.
+ * **Flatgeobuf:** An open format for publishing and consuming geospatial data.
+
+* **Error Tracking & Analytics:**
+ * **Sentry:** For error tracking and performance monitoring.
+ * **PostHog:** For product analytics.
This combination of technologies supports a functional environment for building agricultural applications.
-
## A Working Application
The `fdm-app` is not just a demo, it is a working application that can be used as inspiration for your own farm management solutions. You can use it as a starting point for your own projects, or you can contribute to its development to help make it even better.
diff --git a/fdm-docs/docs/getting-started/01-what-is-fdm.md b/fdm-docs/docs/getting-started/01-what-is-fdm.md
index e105526ee..5b27bb6dc 100644
--- a/fdm-docs/docs/getting-started/01-what-is-fdm.md
+++ b/fdm-docs/docs/getting-started/01-what-is-fdm.md
@@ -2,36 +2,34 @@
title: What is FDM?
---
-# What is FDM?
-
The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions that lowers the barries to deliver latest agronomic insights to farmers.
## What Problem Does FDM Solve?
The agricultural industry is becoming increasingly data-driven. However, farm data is often fragmented, inconsistent, and locked into proprietary systems. This makes it difficult to:
-* **Share data** between different applications and services.
-* **Analyze data** from multiple sources to gain a holistic view of farm operations.
-* **Develop new and innovative** farm management tools.
+* **Share data** between different applications and services.
+* **Analyze data** from multiple sources to gain a holistic view of farm operations.
+* **Develop new and innovative** farm management tools.
FDM addresses these challenges by providing a common language for describing farm data. It defines a standardized schema for a wide range of agricultural concepts, including:
-* **Farms and Fields:** The core assets of any agricultural operation.
-* **Cultivations:** The lifecycle of a crop, from sowing to harvest.
-* **Actions:** The various activities that take place on a farm, such as fertilizing, spraying, and soil sampling.
-* **Catalogues:** Standardized lists of crops, fertilizers, and other agricultural inputs.
+* **Farms and Fields:** The core assets of any agricultural operation.
+* **Cultivations:** The lifecycle of a crop, from sowing to harvest.
+* **Actions:** The various activities that take place on a farm, such as fertilizing, spraying, and soil sampling.
+* **Catalogues:** Standardized lists of crops, fertilizers, and other agricultural inputs.
## Who is the Target Audience?
FDM is designed for a diverse audience, including:
-* **Agronomists:** FDM provides a structured way to record and analyze farm data, enabling them to make more informed decisions.
-* **Developers:** FDM offers a flexible and extensible data model for building a new generation of farm management applications.
-* **Researchers:** FDM provides a standardized dataset for conducting research and developing new agricultural technologies.
+* **Agronomists:** FDM provides a structured way to record and analyze farm data, enabling them to make more informed decisions.
+* **Developers:** FDM offers a flexible and extensible data model for building a new generation of farm management applications.
+* **Researchers:** FDM provides a standardized dataset for conducting research and developing new agricultural technologies.
## What are the Key Features?
-* **Standardized Schema:** FDM provides a comprehensive and well-documented schema for a wide range of agricultural data.
-* **Calculation Engine:** FDM includes a powerful calculation engine for performing common agronomic calculations, such as nitrogen balance and nutrient recommendations.
-* **Open-Source:** FDM is an open-source project, which means it is free to use, modify, and distribute.
-* **Extensible:** FDM is designed to be extensible, allowing users to add their own custom data types and calculations.
+* **Standardized Schema:** FDM provides a comprehensive and well-documented schema for a wide range of agricultural data.
+* **Calculation Engine:** FDM includes a powerful calculation engine for performing common agronomic calculations, such as nitrogen balance and nutrient recommendations.
+* **Open-Source:** FDM is an open-source project, which means it is free to use, modify, and distribute.
+* **Extensible:** FDM is designed to be extensible, allowing users to add their own custom data types and calculations.
diff --git a/fdm-docs/docs/getting-started/02-the-asset-action-model.md b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
index 1cad6347f..a11872eb9 100644
--- a/fdm-docs/docs/getting-started/02-the-asset-action-model.md
+++ b/fdm-docs/docs/getting-started/02-the-asset-action-model.md
@@ -2,8 +2,6 @@
title: The Asset-Action Model
---
-# The Asset-Action Model
-
The Asset-Action model serves as the architectural foundation for the Farm Data Model (FDM). It provides a framework for organizing agricultural data by separating physical or conceptual entities from the events that affect them. This structure is designed to bring clarity to farm data and enable detailed analysis.
## Core Concepts
@@ -11,29 +9,32 @@ The Asset-Action model serves as the architectural foundation for the Farm Data
The model is built around two fundamental concepts:
### Assets
+
**Assets** represent the entities within a farm operation. They are the objects that have value or play a significant role in the system. In FDM, key assets include:
-* **Farms:** The top-level container for all other assets.
-* **Fields:** The primary spatial asset, representing a specific area of land.
-* **Cultivations:** An instance of a crop being grown on a field.
-* **Fertilizers:** A specific batch or acquisition of a fertilizer product.
-* **Soil Samples:** A physical sample of soil taken from a field.
+* **Farms:** The top-level container for all other assets.
+* **Fields:** The primary spatial asset, representing a specific area of land.
+* **Cultivations:** An instance of a crop being grown on a field.
+* **Fertilizers:** A specific batch or acquisition of a fertilizer product.
+* **Soil Samples:** A physical sample of soil taken from a field.
### Actions
+
**Actions** represent the operations or events that affect assets. These capture the dynamic processes that shape the state of farm assets. Common actions include:
-* **Sowing:** Planting a crop, which creates a new `cultivation` asset.
-* **Fertilizing:** Applying fertilizer to a field, which modifies the `field` or `cultivation` state.
-* **Harvesting:** Gathering a crop, which modifies the `cultivation` asset.
-* **Soil Sampling:** Taking a soil sample, which creates a new `soil sample` asset.
+* **Sowing:** Planting a crop, which creates a new `cultivation` asset.
+* **Fertilizing:** Applying fertilizer to a field, which modifies the `field` or `cultivation` state.
+* **Harvesting:** Gathering a crop, which modifies the `cultivation` asset.
+* **Soil Sampling:** Taking a soil sample, which creates a new `soil sample` asset.
## Design Philosophy
The Asset-Action model aligns with agricultural operations by distinguishing between the object being managed and the activity performed upon it.
For example, rather than recording a single abstract metric like "effective nitrogen dose," the model records the specific components:
-1. The **Asset** (the field).
-2. The **Action** (the application of fertilizer), including the specific type, amount, and date.
+
+1. The **Asset** (the field).
+2. The **Action** (the application of fertilizer), including the specific type, amount, and date.
This separation allows for more nuanced analysis. An agronomist can calculate nitrogen use efficiency by aggregating all application actions for a specific field asset over a growing season, rather than relying on pre-aggregated or simplified data points.
@@ -41,10 +42,10 @@ This separation allows for more nuanced analysis. An agronomist can calculate ni
The structure of the Asset-Action model supports various data requirements:
-* **Granularity:** Actions can be defined with varying levels of detail, from broad categories (e.g., "planting") to specific instances containing detailed parameters (e.g., specific hybrid variety and seeding rate).
-* **Relationships:** The model captures relationships between entities and events. A single asset can be the subject of multiple actions over time (e.g., a field undergoes plowing, sowing, and harvesting). Conversely, a single action can involve multiple assets.
-* **Temporal Tracking:** Actions are associated with timestamps. This allows the system to track changes in assets over time, providing a historical view of farm operations.
-* **Extensibility:** Both assets and actions can include custom attributes to capture specific data relevant to the operation, such as geometry for fields or application methods for fertilizer actions.
+* **Granularity:** Actions can be defined with varying levels of detail, from broad categories (e.g., "planting") to specific instances containing detailed parameters (e.g., specific hybrid variety and seeding rate).
+* **Relationships:** The model captures relationships between entities and events. A single asset can be the subject of multiple actions over time (e.g., a field undergoes plowing, sowing, and harvesting). Conversely, a single action can involve multiple assets.
+* **Temporal Tracking:** Actions are associated with timestamps. This allows the system to track changes in assets over time, providing a historical view of farm operations.
+* **Extensibility:** Both assets and actions can include custom attributes to capture specific data relevant to the operation, such as geometry for fields or application methods for fertilizer actions.
## Practical Implementation
@@ -52,9 +53,9 @@ The Asset-Action Model creates a traceable history of all farm activities. Each
For example, the history of a `field` asset might look like this:
-1. **Create Field:** The `field` asset is created with its initial geometry and properties.
-2. **Sow Crop:** A `sowing` action is performed on the `field`, creating a new `cultivation` asset.
-3. **Apply Fertilizer:** A `fertilizing` action is performed on the `field`, adding nutrients to the soil.
-4. **Harvest Crop:** A `harvesting` action is performed on the `field`, gathering the crop and ending the `cultivation`.
+1. **Create Field:** The `field` asset is created with its initial geometry and properties.
+2. **Sow Crop:** A `sowing` action is performed on the `field`, creating a new `cultivation` asset.
+3. **Apply Fertilizer:** A `fertilizing` action is performed on the `field`, adding nutrients to the soil.
+4. **Harvest Crop:** A `harvesting` action is performed on the `field`, gathering the crop and ending the `cultivation`.
This creates a complete and auditable record of activities on the farm, which is essential for traceability and compliance.
diff --git a/fdm-docs/docs/getting-started/03-quick-start-guide.md b/fdm-docs/docs/getting-started/03-quick-start-guide.md
index a229ec5ce..5bd1a05d2 100644
--- a/fdm-docs/docs/getting-started/03-quick-start-guide.md
+++ b/fdm-docs/docs/getting-started/03-quick-start-guide.md
@@ -2,8 +2,6 @@
title: Quick Start Guide
---
-# Quick Start Guide
-
This guide will walk you through the basics of using the Farm Data Model (FDM) in your own applications. We will cover how to install FDM, connect to a database, create a `farm`, add a `field`, and perform a simple `action` like sowing a crop.
## Installation
diff --git a/fdm-docs/docs/insights/01-nitrogen-balance.md b/fdm-docs/docs/insights/01-nitrogen-balance.md
index cef85a839..84c213cce 100644
--- a/fdm-docs/docs/insights/01-nitrogen-balance.md
+++ b/fdm-docs/docs/insights/01-nitrogen-balance.md
@@ -3,8 +3,6 @@ title: Nitrogen Balance
sidebar_label: Nitrogen Balance
---
-# Nitrogen Balance Calculation
-
This document explains how the nitrogen (N) balance is calculated within the FDM Calculator. The balance provides insights into nitrogen inputs, outputs, and potential surpluses or deficits on a per-field basis, which are then aggregated to the farm level. It serves as a critical tool for agronomists and farmers to optimize nutrient management, enhance crop productivity, and minimize environmental impacts.
## 1. Overview
@@ -18,9 +16,10 @@ N Balance (kg N / ha) = N Supply - N Removal - N-NH3 Emission
```
Where:
-* **N Supply:** Nitrogen added to the field.
-* **N Removal:** Nitrogen taken off the field.
-* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
+
+* **N Supply:** Nitrogen added to the field.
+* **N Removal:** Nitrogen taken off the field.
+* **N-NH3 Emission:** Nitrogen lost to the environment due to ammonia volatilization.
(Note: In the calculation, N Removal and N-NH3 Emission are typically treated as negative values when summing components to derive the final balance.)
@@ -30,44 +29,44 @@ The calculations are performed for a user-defined **Time Frame**.
Accurate N balance calculation relies on comprehensive input data that captures the various aspects of farm management and environmental conditions influencing nitrogen dynamics.
-* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
- * Unique ID, area (ha), centroid coordinates (for deposition).
- * Start and end dates defining the field's existence (if different from the balance time frame).
-* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
- * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
- * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
-* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
- * Links to the specific `b_lu` (cultivation instance).
- * `harvestable_analyses` array containing:
- * Yield of harvested product (`b_lu_yield`, kg / ha).
- * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
- * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
-* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
- * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
- * Key parameters used:
- * Agricultural soil type (`b_soiltype_agr`).
- * Total N content (`a_n_rt`, mg N / kg).
- * Organic carbon (`a_c_of`, g C / kg).
- * C / N ratio (`a_cn_fr`).
- * Bulk density (`a_density_sa`, g / cm³).
- * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
- * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
-* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
- * Application amount (`p_app_amount`, kg / ha).
- * Link to fertilizer type via `p_id_catalogue`.
-* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
- * `FertilizerCatalogue` (`FertilizerDetail`):
- * Total N content (`p_n_rt`, g N / kg).
- * Nitrate content (`p_no3_rt`, g N / kg)
- * Ammonium content (`p_nh4_rt`, g N/ kg)
- * Sulfur content (`p_s_rt`, g SO3 / kg)
- * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
- * `CultivationCatalogue` (`CultivationDetail`):
- * Default yield (`b_lu_yield`, kg / ha).
- * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
- * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
- * Harvest Index (`b_lu_hi`, fraction).
- * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
+* **Field Information:** Essential for defining the spatial and temporal boundaries of the calculation. Field area is used for scaling, and centroid coordinates are crucial for location-specific environmental data like atmospheric deposition.
+ * Unique ID, area (ha), centroid coordinates (for deposition).
+ * Start and end dates defining the field's existence (if different from the balance time frame).
+* **Cultivation Data (per field):** Crop type significantly influences nitrogen demand, uptake patterns, and potential for biological nitrogen fixation. Residue management dictates whether nitrogen in crop residues is returned to the soil or removed from the field.
+ * Crop type (via `b_lu_catalogue` linking to `CultivationCatalogue`).
+ * Crop residue management (`m_cropresidue` flag: true if residues removed, false / null if incorporated).
+* **Harvest Data (per field):** Harvested products represent the primary pathway of nitrogen removal from the field. Accurate yield and nitrogen content data are critical for quantifying this export.
+ * Links to the specific `b_lu` (cultivation instance).
+ * `harvestable_analyses` array containing:
+ * Yield of harvested product (`b_lu_yield`, kg / ha).
+ * N content of harvested product (`b_lu_n_harvestable`, g N / kg product).
+ * (If these are not in `harvestable_analyses`, defaults from `CultivationCatalogue` are used).
+* **Soil Analysis Data (per field):** Soil properties are fundamental to understanding the inherent nitrogen supply capacity of the soil (e.g., through mineralization) and its ability to retain or lose nitrogen.
+ * Multiple analyses can be provided. The system uses the most recent available data for each parameter.
+ * Key parameters used:
+ * Agricultural soil type (`b_soiltype_agr`).
+ * Total N content (`a_n_rt`, mg N / kg).
+ * Organic carbon (`a_c_of`, g C / kg).
+ * C / N ratio (`a_cn_fr`).
+ * Bulk density (`a_density_sa`, g / cm³).
+ * Soil Organic Matter (SOM) by Loss on Ignition (`a_som_loi`, %).
+ * If some parameters are missing, they may be estimated (see Section 3.1.4.1).
+* **Fertilizer Application Data (per field):** These represent direct, managed inputs of nitrogen to the field, crucial for meeting crop nutrient demands.
+ * Application amount (`p_app_amount`, kg / ha).
+ * Link to fertilizer type via `p_id_catalogue`.
+* **Catalogue Data:** Standardized data from catalogues ensures consistency and provides default values for various crop and fertilizer characteristics, which are essential for modeling when specific field-level data is unavailable.
+ * `FertilizerCatalogue` (`FertilizerDetail`):
+ * Total N content (`p_n_rt`, g N / kg).
+ * Nitrate content (`p_no3_rt`, g N / kg)
+ * Ammonium content (`p_nh4_rt`, g N/ kg)
+ * Sulfur content (`p_s_rt`, g SO3 / kg)
+ * Type flag: `p_type` ("manure", "mineral", "compost" or `null`).
+ * `CultivationCatalogue` (`CultivationDetail`):
+ * Default yield (`b_lu_yield`, kg / ha).
+ * Default N content of harvestable product (`b_lu_n_harvestable`, g N / kg).
+ * N content of crop residue (`b_lu_n_residue`, g N / kg residue).
+ * Harvest Index (`b_lu_hi`, fraction).
+ * Biological N fixation rate (`b_n_fixation`, kg N / ha / year for the crop).
## 3. Calculation Components
@@ -80,39 +79,43 @@ Total N supply is the sum of N from fertilizers, biological fixation, atmospheri
#### 3.1.1. Fertilizers
Fertilizers are a primary and often controlled source of nitrogen input in agricultural systems, applied to meet specific crop nutrient demands. Different fertilizer types have varying nitrogen forms and release characteristics.
-* **Formula per application:**
+
+* **Formula per application:**
`N_supplied (kg N / ha) = Amount_applied (kg / ha) * (Total_N_content (g N / kg) / 1000)`
-* Contributions are summed for each category:
- * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
- * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
- * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
- * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
+* Contributions are summed for each category:
+ * **Mineral Fertilizers:** Mineral fertilizers providing readily available nitrogen (e.g., urea, ammonium nitrate).
+ * **Manure:** Organic fertilizers derived from animal feces, providing both readily available and slowly mineralizing nitrogen.
+ * **Compost:** Stabilized organic matter, releasing nitrogen slowly over time as it decomposes.
+ * **Other Fertilizers:** Any other types of fertilizers not classified as mineral, manure, or compost.
#### 3.1.2. Biological Fixation
Biological nitrogen fixation is a natural process where atmospheric nitrogen (N2) is converted into plant-available forms (e.g., ammonia) by microorganisms, primarily symbiotic bacteria associated with leguminous crops (e.g., clover, beans, peas). This process significantly contributes to the nitrogen supply in agricultural ecosystems, reducing the need for mineral nitrogen fertilizers.
-* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
-* These values are summed if multiple N-fixing crops are involved.
+
+* **Source:** The `b_n_fixation` value (kg N / ha for the specific crop) is taken directly from the `CultivationCatalogue` for each cultivation present. This value represents the estimated net nitrogen input from fixation for that crop type.
+* These values are summed if multiple N-fixing crops are involved.
#### 3.1.3. Atmospheric Deposition
Atmospheric deposition refers to the input of nitrogen compounds from the atmosphere to the Earth's surface. This occurs through both wet deposition (e.g., nitrogen dissolved in rain, snow) and dry deposition (e.g., gaseous ammonia, nitric acid vapor, particulate matter). These deposited nitrogen forms can be utilized by plants, thus contributing to the overall nitrogen supply in the field.
-* **Method:**
- 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
- 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
- * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
- 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
- 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
+
+* **Method:**
+
+ 1. The system uses the field's centroid coordinates to pinpoint its geographical location.
+ 2. It queries a GeoTIFF raster file for annual total N deposition. This raster dataset provides spatially explicit annual nitrogen deposition rates.
+ * Currently uses data for the Netherlands, year 2022 (`nl/ntot_2022.tiff` from RIVM, via FDM public data URL).
+ 3. The annual deposition rate (kg N / ha / year) for the field's specific location is extracted.
+ 4. This annual rate is pro-rated for the balance `Time Frame` to reflect the actual period of calculation:
`Deposition_period (kg N / ha) = Annual_Deposition (kg N / ha / year) * (Days_in_TimeFrame + 1) / 365`
#### 3.1.4. Soil Mineralization
Soil mineralization is a crucial biological process where organic nitrogen (N) compounds in soil organic matter (SOM) are converted by microorganisms into inorganic, plant-available forms, primarily ammonium (NH4+). This process can be a source of nitrogen for crops. The calculation of nitrogen mineralization is based on default values that depend on the soil type and land use (grassland or arable land).
-* **Method:**
- 1. The calculation is performed for each year within the specified `TimeFrame`.
- 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
- 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
+* **Method:**
+ 1. The calculation is performed for each year within the specified `TimeFrame`.
+ 2. For each year, the system determines if the field is considered "grassland" or "arable land". A field is considered "grassland" for a given year if it has a cultivation with a crop rotation code corresponding to grassland (e.g., BRP code 265) that is active between May 15th and July 15th of that year. Otherwise, it is considered "arable land".
+ 3. Based on the soil type (`b_soiltype_agr`) and whether the field is grassland, a default annual N mineralization rate (kg N / ha / year) is assigned:
| Soil Type (`b_soiltype_agr`) | Land Use | Annual N Mineralization (kg N / ha / year) |
| :--- | :--- | :--- |
@@ -131,22 +134,24 @@ Nitrogen removal accounts for the nitrogen that leaves the field system, primari
#### 3.2.1. Harvested Products
The harvest of crops is typically the largest pathway for nitrogen removal from agricultural fields. Nitrogen is assimilated by plants during growth and stored in various plant parts, including the economically valuable harvested portion (e.g., grain, tubers, forage).
-* **Formula per harvest:**
+
+* **Formula per harvest:**
`N_removed (kg N / ha) = Yield (kg / ha) * N_Content_Harvestable (g N / kg) / 1000 * -1`
-* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
-* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
+* Yield and N content are taken from `HarvestableAnalysis` if available, otherwise from `CultivationCatalogue` defaults. Using actual analysis data provides a more precise estimate of N removal.
+* If a harvest event has multiple analyses (e.g., for different components of the harvested product), their N removal values are averaged.
#### 3.2.2. Crop Residues
Crop residues (e.g., straw, stover, roots) contain significant amounts of nitrogen. Their management is crucial for the field's nitrogen balance. If residues are removed from the field (e.g., for animal feed, bedding, or bioenergy), the nitrogen contained within them is considered a removal from the field system. If residues are left on the field and incorporated into the soil, their nitrogen contributes to the soil organic matter pool and will be subject to mineralization.
-* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
-* **Residue Mass Estimation:**
+
+* **Nitrogen Removal Condition:** Nitrogen is considered removed by crop residues only if the `m_cropresidue` flag is true for the cultivation, indicating that residues are indeed taken off the field.
+* **Residue Mass Estimation:**
1. Average yield for the cultivation is determined (from actual harvests or catalogue default).
2. Harvest Index (`b_lu_hi`) is from `CultivationCatalogue`. The Harvest Index is the ratio of harvested biomass to total above-ground biomass.
3. Residue Proportion = `1 - b_lu_hi`. This represents the fraction of total above-ground biomass that remains as residue.
- 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
-* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
-* **Formula per cultivation:**
+ 4. `Residue_Mass (kg / ha) = Average_Yield (kg / ha) * Residue_Proportion`.
+* **N Content of Residue:** `b_lu_n_residue` (g N / kg residue) from `CultivationCatalogue`. This value represents the typical nitrogen concentration in the crop residues for a given crop type.
+* **Formula per cultivation:**
`N_removed_residue (kg N / ha) = Residue_Mass (kg / ha) * N_Content_Residue (g N / kg) / 1000 * -1`
### 3.3. Nitrogen Emission (kg N / ha)
@@ -167,17 +172,17 @@ Nitrate leaching represents the loss of nitrogen to water bodies. In the FDM Cal
Ammonia emissions from fertilizers are calculated differently depending on the fertilizer type.
-* **Manure, Compost, and Other Organic Fertilizers:**
+* **Manure, Compost, and Other Organic Fertilizers:**
For these organic fertilizers, the emission is calculated based on the Total Ammoniacal Nitrogen (TAN) content, as this is the amount of nitrogen that is readily available for volatilization.
- * **Formula:**
+ * **Formula:**
`NH3 Emission (kg N / ha) = Application Amount (kg / ha) * TAN Content (g N / kg) / 1000 * Emission Factor (fraction)`
Where:
- * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
- * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
- * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
+ * `Application Amount`: `p_app_amount` (kg / ha) - The total amount of fertilizer applied.
+ * `TAN Content`: `p_nh4_rt` (g N / kg) - The amount of total nitrogen that is in ammoniacal form.
+ * `Emission Factor`: A dimensionless factor representing the proportion of TAN that is volatilized as ammonia. This factor is determined by the application method and the type of land (grassland, cropland, or bare soil) at the time of application.
- * **Emission Factors for Manure and Compost:**
+ * **Emission Factors for Manure and Compost:**
| Application Method | Grassland | Cropland | Bare Soil |
| :-------------------- | :-------- | :------- | :-------- |
@@ -190,46 +195,44 @@ Ammonia emissions from fertilizers are calculated differently depending on the f
*Note: "N/A" indicates that the method is not typically used or supported for that land type in the calculation model, and will result in an error if attempted.*
-* **Mineral Fertilizers:**
+* **Mineral Fertilizers:**
For mineral fertilizers, the emission is calculated based on the **total nitrogen content (`p_n_rt`)** of the fertilizer and the **emission factor**.
- * **Formula:**
+ * **Formula:**
`NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
Where:
- * `Application Amount`: `p_app_amount` (kg / ha).
- * `Total N Content`: `p_n_rt` (fraction).
- * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
+ * `Application Amount`: `p_app_amount` (kg / ha).
+ * `Total N Content`: `p_n_rt` (fraction).
+ * `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
`Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
Where:
- * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
- * `p_no3_rt`: Nitrate content.
- * `p_nh4_rt`: Ammonium content (TAN).
- * `p_s_rt`: Sulfur content.
- * `K_1`, `K_2`, `K_3`: Empirical constants.
- * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
- * If no inhibitor: `K_1 = 7.021 * 10^-5`
- * `K_2 = -4.308 * 10^-5`
- * `K_3 = 2.498 * 10^-4`
+ * `p_n_org`: Organic nitrogen content (calculated as `p_n_rt - p_no3_rt - p_nh4_rt`).
+ * `p_no3_rt`: Nitrate content.
+ * `p_nh4_rt`: Ammonium content (TAN).
+ * `p_s_rt`: Sulfur content.
+ * `K_1`, `K_2`, `K_3`: Empirical constants.
+ * If an inhibitor is present: `K_1 = 3.166 * 10^-5`
+ * If no inhibitor: `K_1 = 7.021 * 10^-5`
+ * `K_2 = -4.308 * 10^-5`
+ * `K_3 = 2.498 * 10^-4`
*Note: Currently, the presence of an inhibitor (`p_inhibitor`) is hardcoded to `false` in the calculation.*
-
-
#### 3.3.3. Ammonia from Crop Residues
Ammonia emissions from crop residues occur when residues are left on the field and decompose, releasing nitrogen compounds that can volatilize. The calculation of these emissions is based on the amount of nitrogen in the crop residues and a specific emission factor.
-* **Formula per cultivation:**
+* **Formula per cultivation:**
`NH3 Emission (kg N / ha) = Residue N Content (kg N / ha) * Emission Factor (fraction)`
Where:
- * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
- * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
+ * `Residue N Content`: The amount of nitrogen contained in the crop residues left on the field. This is derived from the `Residue_Mass` (calculated in Section 3.2.2) and the `N_Content_Residue` (`b_lu_n_residue` from `CultivationCatalogue`).
+ * `Emission Factor`: This factor is calculated based on the nitrogen content of the crop residue in g/kg dry matter (`b_lu_n_residue`).
- * **Emission Factor Formula:**
+ * **Emission Factor Formula:**
`Emission Factor = (0.41 * b_lu_n_residue (g/kg dry matter)) - 5.42`
Where:
- * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
+ * `b_lu_n_residue`: Nitrogen content of the crop residue in grams per kilogram of dry matter (`b_lu_n_residue` from `CultivationCatalogue`).
*Note: Ammonia emissions from crop residues are only calculated if the `m_cropresidue` flag is `false` or `null`, indicating that residues are incorporated into the soil rather than removed.*
@@ -239,20 +242,21 @@ Ammonia emissions from grazing are currently not calculated in the FDM Calculato
## 4. Field and Farm Level Balance
-* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
-* **Farm Balance:**
- 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
- 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
+* **Field Surplus (Field Balance):** For each field, the **N Surplus** is calculated as `N Supply - N Removal - Ammonia Emission`. This value is reported as the `balance` for each field in the output.
+* **Farm Balance:**
+ 1. The total N supplied, removed, and total emitted (including ammonia and nitrate) for each field (kg N / ha * field area (ha) = kg N per field) are summed across all fields.
+ 2. These total farm-level amounts (in kg N) are then divided by the total farm area (ha) to provide an average farm-level balance (`N Supply - N Removal - Total N Emission`) in kg N / ha.
## 5. Output
The final output (`NitrogenBalanceNumeric`) provides:
-* Overall farm balance, supply, removal, and total emission (kg N / ha).
-* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
- * Field ID.
- * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
- * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
- * Detailed breakdown of removal (total, harvests, residues).
- * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
+
+* Overall farm balance, supply, removal, and total emission (kg N / ha).
+* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
+ * Field ID.
+ * Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
+ * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
+ * Detailed breakdown of removal (total, harvests, residues).
+ * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
All values are rounded numbers.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md b/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
index 89684d5c0..3bd3d91cf 100644
--- a/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/01-index.md
@@ -2,8 +2,6 @@
title: Overview
---
-# Norms and Regulations
-
The `fdm-calculator` includes functionality to validate agronomic data against regional norms for fertilizer application. This capability supports nutrient management by comparing planned or actual applications against specific regulatory limits.
## Relevance and Data Usage
@@ -16,8 +14,8 @@ Providing these insights is relevant for farmers who need to adhere to environme
The norm calculation system in `fdm-calculator` is designed to be extensible across different regions and timeframes. The internal architecture organizes logic by:
-* **Region:** Supporting different countries or regulatory zones (e.g., `NL` for Netherlands).
-* **Year:** Allowing for annual updates to regulations (e.g., `2025`).
+* **Region:** Supporting different countries or regulatory zones (e.g., `NL` for Netherlands).
+* **Year:** Allowing for annual updates to regulations (e.g., `2025`).
This structure enables the addition of new regional rule sets or the updating of existing ones as regulations evolve, without disrupting previous implementations.
@@ -25,9 +23,9 @@ This structure enables the addition of new regional rule sets or the updating of
The current implementation in `fdm-calculator` covers the Dutch nutrient management regulations for the year 2025. This includes the following usage norms (`gebruiksnormen`):
-* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./nl/2025/stikstofgebruiksnorm.md):** Calculates the maximum total effective nitrogen (in kg N/ha) allowed. The calculation considers factors such as the main crop, geographical location (including `NV-gebieden`), and soil region.
-* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./nl/2025/fosfaatgebruiksnorm.md):** Determines the maximum amount of phosphate (in kg P₂O₅ per hectare) allowed. This limit is based on the land use type (grassland or arable land) and the phosphate status of the soil.
-* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./nl/2025/dierlijke-mest-gebruiksnorm.md):** Specifies the maximum nitrogen from animal manure (in kg N/ha) permitted. The limit depends on the farm's derogation status and the field's location.
+* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./nl/2025/stikstofgebruiksnorm.md):** Calculates the maximum total effective nitrogen (in kg N/ha) allowed. The calculation considers factors such as the main crop, geographical location (including `NV-gebieden`), and soil region.
+* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./nl/2025/fosfaatgebruiksnorm.md):** Determines the maximum amount of phosphate (in kg P₂O₅ per hectare) allowed. This limit is based on the land use type (grassland or arable land) and the phosphate status of the soil.
+* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./nl/2025/dierlijke-mest-gebruiksnorm.md):** Specifies the maximum nitrogen from animal manure (in kg N/ha) permitted. The limit depends on the farm's derogation status and the field's location.
For detailed logic and specific parameters of these norms, refer to their respective pages.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
index 9357608b3..a88e8d625 100644
--- a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/01-index.md
@@ -4,15 +4,13 @@ sidebar_label: "Overview"
position: 1
---
-# Calculating the 2025 Dutch Fertilizer Application Norms
-
This guide explains how the FDM Calculator determines the official Dutch legal usage norms (`gebruiksnormen`) for nitrogen and phosphate for the year 2025. These calculations are essential for ensuring your farm management plan complies with national environmental regulations.
The FDM Calculator automates these complex calculations based on your specific farm, field, and cultivation data. It calculates three key norms:
-* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./stikstofgebruiksnorm.md):** This norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation takes into account the main crop, the geographical location (including `NV-gebieden`), and the soil region.
-* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./fosfaatgebruiksnorm.md):** This norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. The maximum is determined by the land use type (grassland or arable land) and the phosphate status of the soil.
-* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./dierlijke-mest-gebruiksnorm.md):** This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
+* **[Nitrogen Usage Norm (`Stikstofgebruiksnorm`)](./stikstofgebruiksnorm.md):** This norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation takes into account the main crop, the geographical location (including `NV-gebieden`), and the soil region.
+* **[Phosphate Usage Norm (`Fosfaatgebruiksnorm`)](./fosfaatgebruiksnorm.md):** This norm defines the maximum amount of phosphate (in kg P₂O₅ per hectare) that can be applied to a parcel of land. The maximum is determined by the land use type (grassland or arable land) and the phosphate status of the soil.
+* **[Animal Manure Usage Norm (`Dierlijke Mest Gebruiksnorm`)](./dierlijke-mest-gebruiksnorm.md):** This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
For more detailed information on these norms, please refer to the specific pages for each one.
@@ -26,16 +24,16 @@ Always consult your agricultural advisor for definitive guidance and values tail
To calculate the norms for a specific field, the FDM Calculator requires the following information for the 2025 calendar year.
-* **Farm Details**:
- * **Derogation Status**: Does the farm have a derogation permit for 2025? This is a critical factor for nitrogen and animal manure norms.
+* **Farm Details**:
+ * **Derogation Status**: Does the farm have a derogation permit for 2025? This is a critical factor for nitrogen and animal manure norms.
-* **Field & Location**:
- * **Field Location**: The precise geographical coordinates of the field are used to determine if it falls within special regulatory zones, such as Nutrient-Polluted Areas (`NV-gebieden`), Groundwater Protection Areas (`GWBG-gebieden`), or specific soil regions (sand, clay, peat, loess).
+* **Field & Location**:
+ * **Field Location**: The precise geographical coordinates of the field are used to determine if it falls within special regulatory zones, such as Nutrient-Polluted Areas (`NV-gebieden`), Groundwater Protection Areas (`GWBG-gebieden`), or specific soil regions (sand, clay, peat, loess).
-* **Cultivation Plan for 2025**:
- * **Main Crop (`hoofdteelt`)**: The primary crop grown on the field. The calculator identifies the main crop as the one with the longest cultivation period between May 15th and July 15th.
- * **Crop Variety**: For certain crops like potatoes and flowers, the specific variety can result in a higher or lower nitrogen norm.
- * **Cultivation Dates**: The start and end dates of cultivation are crucial for time-sensitive norms, such as those for temporary grassland.
+* **Cultivation Plan for 2025**:
+ * **Main Crop (`hoofdteelt`)**: The primary crop grown on the field. The calculator identifies the main crop as the one with the longest cultivation period between May 15th and July 15th.
+ * **Crop Variety**: For certain crops like potatoes and flowers, the specific variety can result in a higher or lower nitrogen norm.
+ * **Cultivation Dates**: The start and end dates of cultivation are crucial for time-sensitive norms, such as those for temporary grassland.
-* **Latest Soil Analysis Data**:
- * **Phosphate Levels**: The P-CaCl2 (or P-PAE) and P-Al values from your most recent soil test are used to classify the soil's phosphate status, which directly determines the phosphate usage norm.
+* **Latest Soil Analysis Data**:
+ * **Phosphate Levels**: The P-CaCl2 (or P-PAE) and P-Al values from your most recent soil test are used to classify the soil's phosphate status, which directly determines the phosphate usage norm.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md
index 0d89a01fa..d35c808db 100644
--- a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/dierlijke-mest-gebruiksnorm.md
@@ -3,8 +3,6 @@ title: Dierlijke Mest Gebruiksnorm 2025
sidebar_label: "Dierlijke Mest Gebruiksnorm"
---
-# Dierlijke Mest Gebruiksnorm 2025
-
This document explains how the FDM Calculator determines the official Dutch legal usage norm (`gebruiksnorm`) for nitrogen from animal manure and how the applied animal manure counts towards this norm (the `filling`). It also covers the derogation regulations for 2025.
---
@@ -15,22 +13,22 @@ This document explains how the FDM Calculator determines the official Dutch lega
This norm defines the maximum nitrogen from animal manure (in kg N/ha) that can be applied. The calculation is based on the farm's derogation status and the field's location.
-#### Standard Norm (No Derogation):
+#### Standard Norm (No Derogation)
If the farm does **not** have a derogation permit, the standard norm is **170 kg N/ha**.
-#### Derogation Norms for 2025:
+#### Derogation Norms for 2025
Derogation is a temporary exception that allows farms with at least 80% grassland to use more nitrogen from grazing animal manure. However, derogation is being phased out, and the norms for 2025 are as follows:
-1. **Derogation-Free Zones**:
- * If a field is in a **derogation-free zone** (`derogatievrije zone`) around a Natura 2000 area, the standard norm of **170 kg N/ha** applies, even with a derogation permit.
+1. **Derogation-Free Zones**:
+ * If a field is in a **derogation-free zone** (`derogatievrije zone`) around a Natura 2000 area, the standard norm of **170 kg N/ha** applies, even with a derogation permit.
-2. **Nutrient-Polluted and Groundwater Protection Areas**:
- * If a field is in a **Nutrient-Polluted Area (`NV-gebied`)** or a **Groundwater Protection Area (`GWBG-gebied`)**, the derogation norm is **190 kg N/ha**.
+2. **Nutrient-Polluted and Groundwater Protection Areas**:
+ * If a field is in a **Nutrient-Polluted Area (`NV-gebied`)** or a **Groundwater Protection Area (`GWBG-gebied`)**, the derogation norm is **190 kg N/ha**.
-3. **Other Areas**:
- * For all other fields, the derogation norm is **200 kg N/ha**.
+3. **Other Areas**:
+ * For all other fields, the derogation norm is **200 kg N/ha**.
### How the FDM Calculator Determines the Norm
@@ -44,11 +42,11 @@ The `fdm-calculator` uses the `calculateAnimalManureUsageNorm` function in `fdm-
The filling for the animal manure usage norm is based on the **total nitrogen** from all applied animal manures. Unlike the nitrogen usage norm, no efficiency coefficients are applied here; the total nitrogen content of the manure counts.
-#### Calculation Formula:
+#### Calculation Formula
`Total Nitrogen (kg N) = Applied Amount (ton) × Total Nitrogen Content (kg N/ton)`
-#### Forfaitair Nitrogen Content (`Forfaitaire Stikstofgehalten`):
+#### Forfaitair Nitrogen Content (`Forfaitaire Stikstofgehalten`)
The forfaitair nitrogen content per ton of manure is determined by the animal species, category, and manure type, as specified in RVO Tabel 11. This table provides standard values for various manure codes (`mestcodes`).
@@ -65,8 +63,8 @@ The forfaitair nitrogen content per ton of manure is determined by the animal sp
The `fdm-calculator` uses the `calculateAnimalManureFilling` function in `fdm-calculator/src/norms/nl/2025/filling/dierlijke-mest-gebruiksnorm.ts`. This function relies on:
-* The applied amount of animal manure.
-* The manure code (`mestcode`) of the applied manure.
-* The forfaitair nitrogen values from `fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts`, which implements RVO Tabel 11.
+* The applied amount of animal manure.
+* The manure code (`mestcode`) of the applied manure.
+* The forfaitair nitrogen values from `fdm-calculator/src/norms/nl/2025/filling/table-11-mestcodes.ts`, which implements RVO Tabel 11.
If a specific analysis value for the nitrogen content is known, it will be used; otherwise, the forfaitair content is applied.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md
index d788334f0..85b134a5c 100644
--- a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/fosfaatgebruiksnorm.md
@@ -3,8 +3,6 @@ title: Fosfaatgebruiksnorm 2025
sidebar_label: "Fosfaatgebruiksnorm"
---
-# Fosfaatgebruiksnorm 2025
-
This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for phosphate in 2025. It covers how the norm is calculated and how the amount of applied phosphate counts towards this norm (`opvulling`), with a special focus on the regulations for organic-rich fertilizers as introduced in the 7th Action Programme Nitraatrichtlijn.
---
@@ -17,9 +15,9 @@ The phosphate usage norm defines the maximum amount of phosphate (in kg P₂O₅
The process involves three steps:
-1. **Determine Land Type**: First, the land is classified as either **`grasland`** (grassland) or **`bouwland`** (arable land) based on the main crop.
-2. **Determine Phosphate Class**: Based on a recent soil analysis (using P-CaCl₂ and P-Al values), the soil is assigned a phosphate class. The classes range from `Arm` (Poor) to `Hoog` (High). The specific thresholds for each class differ for grassland and arable land.
-3. **Look Up the Final Norm**: The combination of land type and phosphate class determines the final usage norm, as shown in the official table below.
+1. **Determine Land Type**: First, the land is classified as either **`grasland`** (grassland) or **`bouwland`** (arable land) based on the main crop.
+2. **Determine Phosphate Class**: Based on a recent soil analysis (using P-CaCl₂ and P-Al values), the soil is assigned a phosphate class. The classes range from `Arm` (Poor) to `Hoog` (High). The specific thresholds for each class differ for grassland and arable land.
+3. **Look Up the Final Norm**: The combination of land type and phosphate class determines the final usage norm, as shown in the official table below.
| Klasse | Grasland (kg P₂O₅/ha) | Bouwland (kg P₂O₅/ha) |
| :------- | :-------------------- | :-------------------- |
@@ -36,8 +34,9 @@ The result of this calculation is the maximum allowable phosphate application fo
The `fdm-calculator` uses the `calculatePhosphateUsageNorm` function, located in `fdm-calculator/src/norms/nl/2025/value/fosfaatgebruiksnorm.ts`.
This function requires the following inputs, defined in `input.ts`:
-* **Main Crop**: To determine if the land is `grasland` or `bouwland`.
-* **Soil Analysis Data**: The latest P-CaCl₂ and P-Al values.
+
+* **Main Crop**: To determine if the land is `grasland` or `bouwland`.
+* **Soil Analysis Data**: The latest P-CaCl₂ and P-Al values.
The core logic uses `fosfaatgebruiksnorm-data.ts`, which contains the official thresholds for phosphate classes and the corresponding norm values for both grassland and arable land.
@@ -49,70 +48,73 @@ The core logic uses `fosfaatgebruiksnorm-data.ts`, which contains the official t
The "filling" (`opvulling`) refers to how much of the applied phosphate counts towards the usage norm. While most fertilizers count for 100% of their phosphate content, the Dutch government encourages the use of **organic-rich fertilizers** (`Organische Stofrijke meststoffen`) to improve soil quality. To stimulate their use, these fertilizers count for a lower percentage of their phosphate content.
-#### Differentiated Percentages for Organic-Rich Fertilizers:
+#### Differentiated Percentages for Organic-Rich Fertilizers
The phosphate in qualifying organic-rich fertilizers counts towards the usage norm according to the following differentiated percentages:
-* **25% of phosphate counts for:**
- * GFT-compost
- * Groencompost (Green compost)
+* **25% of phosphate counts for:**
+ * GFT-compost
+ * Groencompost (Green compost)
-* **75% of phosphate counts for:**
- * Vaste strorijke mest van rundvee (Straw-rich solid manure from cattle)
- * Vaste strorijke mest van varkens (only for organic farms) (Straw-rich solid manure)
- * Vaste strorijke mest van schapen (Straw-rich solid manure from sheep)
- * Vaste strorijke mest van geiten (Straw-rich solid manure from goats)
- * Vaste strorijke mest van paarden (Straw-rich solid manure from horses)
- * Champost
+* **75% of phosphate counts for:**
+ * Vaste strorijke mest van rundvee (Straw-rich solid manure from cattle)
+ * Vaste strorijke mest van varkens (only for organic farms) (Straw-rich solid manure)
+ * Vaste strorijke mest van schapen (Straw-rich solid manure from sheep)
+ * Vaste strorijke mest van geiten (Straw-rich solid manure from goats)
+ * Vaste strorijke mest van paarden (Straw-rich solid manure from horses)
+ * Champost
-* **100% of phosphate counts for:**
- * All other fertilizers, including mineral fertilizers and other organic fertilizers not listed above.
+* **100% of phosphate counts for:**
+ * All other fertilizers, including mineral fertilizers and other organic fertilizers not listed above.
-#### Conditions for Differentiated Percentages:
+#### Conditions for Differentiated Percentages
To use these lower percentages, two important conditions must be met:
-1. **Minimum Application**: At least **20 kg P₂O₅ per hectare** of a specific organic-rich fertilizer must be applied. This ensures the application is substantial enough to contribute to soil improvement.
-2. **Maximum for Differentiated Calculation**: The differentiated percentage (25% or 75%) applies only to the amount of phosphate **up to the parcel's maximum usage norm**. If you apply more phosphate from an organic-rich source than the norm allows, the excess amount counts for **100%**.
+1. **Minimum Application**: At least **20 kg P₂O₅ per hectare** of a specific organic-rich fertilizer must be applied. This ensures the application is substantial enough to contribute to soil improvement.
+2. **Maximum for Differentiated Calculation**: The differentiated percentage (25% or 75%) applies only to the amount of phosphate **up to the parcel's maximum usage norm**. If you apply more phosphate from an organic-rich source than the norm allows, the excess amount counts for **100%**.
-#### Calculation Examples:
+#### Calculation Examples
**Example 1: Standard Application**
-* **Parcel**: Arable land, phosphate status `Ruim`.
-* **Norm**: 60 kg P₂O₅/ha.
-* **Application**: 10 tons/ha of straw-rich cattle manure (forfaitair: 3.2 kg P₂O₅/ton).
-
-1. **Total Phosphate Applied**: `10 ton/ha × 3.2 kg P₂O₅/ton = 32 kg P₂O₅/ha`.
-2. **Check Conditions**:
- * The applied amount (32 kg) is > 20 kg (minimum met).
- * The applied amount (32 kg) is < 60 kg (norm).
- * The 75% rule applies.
-3. **Calculate Filling**: `32 kg P₂O₅/ha × 75% = 24 kg P₂O₅/ha`.
- * **Result**: Only **24 kg** counts towards the 60 kg norm, leaving **36 kg** of usage room.
+
+* **Parcel**: Arable land, phosphate status `Ruim`.
+* **Norm**: 60 kg P₂O₅/ha.
+* **Application**: 10 tons/ha of straw-rich cattle manure (forfaitair: 3.2 kg P₂O₅/ton).
+
+1. **Total Phosphate Applied**: `10 ton/ha × 3.2 kg P₂O₅/ton = 32 kg P₂O₅/ha`.
+2. **Check Conditions**:
+ * The applied amount (32 kg) is > 20 kg (minimum met).
+ * The applied amount (32 kg) is < 60 kg (norm).
+ * The 75% rule applies.
+3. **Calculate Filling**: `32 kg P₂O₅/ha × 75% = 24 kg P₂O₅/ha`.
+ * **Result**: Only **24 kg** counts towards the 60 kg norm, leaving **36 kg** of usage room.
**Example 2: High Application of Compost**
-* **Parcel**: Grassland, phosphate status `Arm`.
-* **Norm**: 120 kg P₂O₅/ha.
-* **Application**: 210 kg P₂O₅/ha from green compost.
-
-1. **Check Conditions**:
- * The applied amount (210 kg) is > 20 kg (minimum met).
- * The differentiated percentage of 25% applies up to the norm of 120 kg.
-2. **Calculate Filling**:
- * **Part 1 (up to the norm)**: `120 kg P₂O₅/ha × 25% = 30 kg P₂O₅/ha`.
- * **Part 2 (above the norm)**: The remaining phosphate is `210 kg - 120 kg = 90 kg`. This amount counts for 100%.
- * **Total Filling**: `30 kg + 90 kg = 120 kg P₂O₅/ha`.
- * **Result**: The total filling is **120 kg**, which meets the 120 kg norm exactly.
+
+* **Parcel**: Grassland, phosphate status `Arm`.
+* **Norm**: 120 kg P₂O₅/ha.
+* **Application**: 210 kg P₂O₅/ha from green compost.
+
+1. **Check Conditions**:
+ * The applied amount (210 kg) is > 20 kg (minimum met).
+ * The differentiated percentage of 25% applies up to the norm of 120 kg.
+2. **Calculate Filling**:
+ * **Part 1 (up to the norm)**: `120 kg P₂O₅/ha × 25% = 30 kg P₂O₅/ha`.
+ * **Part 2 (above the norm)**: The remaining phosphate is `210 kg - 120 kg = 90 kg`. This amount counts for 100%.
+ * **Total Filling**: `30 kg + 90 kg = 120 kg P₂O₅/ha`.
+ * **Result**: The total filling is **120 kg**, which meets the 120 kg norm exactly.
### How the FDM Calculator Determines the Filling
The `fdm-calculator` uses the `calculatePhosphateFilling` function, located in `fdm-calculator/src/norms/nl/2025/filling/fosfaatgebruiksnorm.ts`.
This function processes a list of fertilizer applications and implements the following logic:
-1. It identifies which fertilizers are classified as organic-rich and determines their applicable percentage (25% or 75%).
-2. For each application of an organic-rich fertilizer, it checks if the **20 kg P₂O₅/ha minimum** is met.
-3. It calculates the filling by applying the differentiated percentage to the phosphate amount that falls **within the usage norm**.
-4. Any phosphate from an organic-rich fertilizer applied **above the usage norm** is counted at 100%.
-5. All other fertilizers are always counted at 100%.
+
+1. It identifies which fertilizers are classified as organic-rich and determines their applicable percentage (25% or 75%).
+2. For each application of an organic-rich fertilizer, it checks if the **20 kg P₂O₅/ha minimum** is met.
+3. It calculates the filling by applying the differentiated percentage to the phosphate amount that falls **within the usage norm**.
+4. Any phosphate from an organic-rich fertilizer applied **above the usage norm** is counted at 100%.
+5. All other fertilizers are always counted at 100%.
The function sums the calculated filling from all applications to provide the total phosphate filling for the parcel.
diff --git a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md
index db7112dab..bf71c4c3b 100644
--- a/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md
+++ b/fdm-docs/docs/insights/fertilizer-application-norms/nl/2025/stikstofgebruiksnorm.md
@@ -3,8 +3,6 @@ title: Stikstofgebruiksnorm 2025
sidebar_label: "Stikstofgebruiksnorm"
---
-# Stikstofgebruiksnorm 2025
-
This document provides a detailed explanation of the Dutch legal usage norm (`gebruiksnorm`) for nitrogen in 2025. It covers how the norm is calculated, the rules for catch crops and winter crops, and how the applied nitrogen counts towards this norm (`opvulling`).
---
@@ -15,26 +13,27 @@ This document provides a detailed explanation of the Dutch legal usage norm (`ge
The nitrogen usage norm sets the maximum total effective nitrogen (in kg N/ha) that can be applied to a field. The calculation follows a step-by-step process to find the most precise norm based on various factors.
-#### Calculation Steps:
-
-1. **Identify Main Crop**: The main crop for 2025 is determined from your cultivation plan.
-2. **Determine Geographical Context**: The field's location is used to check:
- * If it is in a **Nutrient-Polluted Area (`NV-gebied`)**, which results in a stricter (lower) norm.
- * The dominant **soil region** (`zand_nwc`, `zand_zuid`, `klei`, `veen`, or `loess`).
-3. **Find the Standard Norm**: The main crop is looked up in the official RVO Table 2 (or Tabel 2g for NV-gebieden).
-4. **Apply Specific Rules**: The standard norm is refined with additional rules for certain crops:
- * **Temporary Grassland (`Tijdelijk grasland`)**: The norm is adjusted based on the cultivation end date.
- * **Potatoes (`Aardappelen`)**: The norm is adjusted based on the potato variety. See [RVO Tabel 2c](https://www.rvo.nl/sites/default/files/2024-12/Tabel-2c-Consumptieaardappelen%20hoge%20of%20lage%20norm-2025.pdf).
- * **Maize (`Maïs`)**: The norm depends on the farm's derogation status.
- * **Outdoor Flowers (`Buitenbloemen`)**: A higher norm is applied for specific varieties.
-5. **Select the Final Norm**: The final value is selected based on the field's soil region and `NV-gebied` status.
-6. **Apply Nitrogen Usage Norm Reduction (`Korting Stikstofgebruiksnorm`)**: The norm can be reduced (`korting`) if catch crop (`vanggewas`) or winter crop (`winterteelt`) requirements were not met in the previous year on sand and loess soils.
+#### Calculation Steps
+
+1. **Identify Main Crop**: The main crop for 2025 is determined from your cultivation plan.
+2. **Determine Geographical Context**: The field's location is used to check:
+ * If it is in a **Nutrient-Polluted Area (`NV-gebied`)**, which results in a stricter (lower) norm.
+ * The dominant **soil region** (`zand_nwc`, `zand_zuid`, `klei`, `veen`, or `loess`).
+3. **Find the Standard Norm**: The main crop is looked up in the official RVO Table 2 (or Tabel 2g for NV-gebieden).
+4. **Apply Specific Rules**: The standard norm is refined with additional rules for certain crops:
+ * **Temporary Grassland (`Tijdelijk grasland`)**: The norm is adjusted based on the cultivation end date.
+ * **Potatoes (`Aardappelen`)**: The norm is adjusted based on the potato variety. See [RVO Tabel 2c](https://www.rvo.nl/sites/default/files/2024-12/Tabel-2c-Consumptieaardappelen%20hoge%20of%20lage%20norm-2025.pdf).
+ * **Maize (`Maïs`)**: The norm depends on the farm's derogation status.
+ * **Outdoor Flowers (`Buitenbloemen`)**: A higher norm is applied for specific varieties.
+5. **Select the Final Norm**: The final value is selected based on the field's soil region and `NV-gebied` status.
+6. **Apply Nitrogen Usage Norm Reduction (`Korting Stikstofgebruiksnorm`)**: The norm can be reduced (`korting`) if catch crop (`vanggewas`) or winter crop (`winterteelt`) requirements were not met in the previous year on sand and loess soils.
### How the FDM Calculator Determines the Norm
The `fdm-calculator` uses the `calculateNitrogenUsageNorm` function in `fdm-calculator/src/norms/nl/2025/value/stikstofgebruiksnorm.ts`, which relies on:
-* **`stikstofgebruiksnorm-data.ts`**: Contains the data from RVO Tabel 2 and Tabel 2g.
-* **`input.ts`**: Defines the required inputs, such as derogation status, location, and crop data.
+
+* **`stikstofgebruiksnorm-data.ts`**: Contains the data from RVO Tabel 2 and Tabel 2g.
+* **`input.ts`**: Defines the required inputs, such as derogation status, location, and crop data.
---
@@ -53,18 +52,18 @@ No reduction is applied if the main crop of the current year is a designated **w
If there is no winter crop, a **catch crop (`vanggewas`)** must be sown. The sowing date determines the reduction:
-* **No Reduction**: Sown by **October 1st**.
-* **5 kg N/ha Reduction**: Sown between **October 2nd and October 14th**.
-* **10 kg N/ha Reduction**: Sown between **October 15th and October 31st**.
-* **20 kg N/ha Reduction**: No valid catch crop, sown on or after **November 1st**, or destroyed before **February 1st**.
+* **No Reduction**: Sown by **October 1st**.
+* **5 kg N/ha Reduction**: Sown between **October 2nd and October 14th**.
+* **10 kg N/ha Reduction**: Sown between **October 15th and October 31st**.
+* **20 kg N/ha Reduction**: No valid catch crop, sown on or after **November 1st**, or destroyed before **February 1st**.
### How the FDM Calculator Implements These Rules
This logic is part of the `calculateNitrogenUsageNorm` function:
-1. **Check for Winter Crop**: The calculator checks if the current year's main crop is a winter crop.
-2. **Check for Catch Crop**: If not, it checks the previous year's cultivation data for a catch crop.
-3. **Apply Reduction**: The sowing date determines the reduction, which is applied to the current year's norm.
+1. **Check for Winter Crop**: The calculator checks if the current year's main crop is a winter crop.
+2. **Check for Catch Crop**: If not, it checks the previous year's cultivation data for a catch crop.
+3. **Apply Reduction**: The sowing date determines the reduction, which is applied to the current year's norm.
---
diff --git a/fdm-docs/package.json b/fdm-docs/package.json
index f1c51fe07..c077b6861 100644
--- a/fdm-docs/package.json
+++ b/fdm-docs/package.json
@@ -9,6 +9,7 @@
"build": "pnpm run build:api && docusaurus build",
"build:api": "typedoc --options typedoc.json",
"build-docs": "pnpm run build:api && docusaurus build",
+ "lint": "markdownlint-cli2 '**/*.md' '#node_modules --format",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
@@ -34,6 +35,7 @@
"@docusaurus/tsconfig": "3.9.2",
"@docusaurus/types": "3.9.2",
"docusaurus-plugin-typedoc": "^1.4.2",
+ "markdownlint-cli2": "^0.19.0",
"typedoc": "catalog:",
"typedoc-plugin-markdown": "^4.9.0",
"typescript": "catalog:"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 503444099..4a2771f8b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -570,6 +570,9 @@ importers:
docusaurus-plugin-typedoc:
specifier: ^1.4.2
version: 1.4.2(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)))
+ markdownlint-cli2:
+ specifier: ^0.19.0
+ version: 0.19.0
typedoc:
specifier: 'catalog:'
version: 0.28.14(typescript@5.9.3)
@@ -4056,6 +4059,10 @@ packages:
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
engines: {node: '>=14.16'}
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
'@slorber/react-helmet-async@1.3.0':
resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==}
peerDependencies:
@@ -4870,6 +4877,9 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@types/katex@0.16.7':
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
'@types/keyv@3.1.4':
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
@@ -6836,6 +6846,10 @@ packages:
resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ globby@15.0.0:
+ resolution: {integrity: sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==}
+ engines: {node: '>=20'}
+
globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
@@ -7074,6 +7088,10 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
image-size@2.0.2:
resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==}
engines: {node: '>=16.x'}
@@ -7451,6 +7469,10 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
jsesc@3.0.2:
resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
engines: {node: '>=6'}
@@ -7488,6 +7510,9 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
@@ -7498,6 +7523,10 @@ packages:
resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==}
engines: {node: '>= 12'}
+ katex@0.16.25:
+ resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==}
+ hasBin: true
+
kdbush@4.0.2:
resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
@@ -7737,6 +7766,20 @@ packages:
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+ markdownlint-cli2-formatter-default@0.0.6:
+ resolution: {integrity: sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==}
+ peerDependencies:
+ markdownlint-cli2: '>=0.0.4'
+
+ markdownlint-cli2@0.19.0:
+ resolution: {integrity: sha512-0+g7Fi/Y3qfvwfhJr77CpC/dEEoc4k7SvumlnL1tb68O+7fjKtIUG7aKzNUQIMXTVi8x63jcfXg4swz/ZYKyCw==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ markdownlint@0.39.0:
+ resolution: {integrity: sha512-Xt/oY7bAiHwukL1iru2np5LIkhwD19Y7frlsiDILK62v3jucXCD6JXlZlwMG12HZOR+roHIVuJZrfCkOhp6k3g==}
+ engines: {node: '>=20'}
+
marked@15.0.12:
resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==}
engines: {node: '>= 18'}
@@ -7851,6 +7894,9 @@ packages:
micromark-extension-directive@3.0.2:
resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+ micromark-extension-directive@4.0.0:
+ resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==}
+
micromark-extension-frontmatter@2.0.0:
resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
@@ -7875,6 +7921,9 @@ packages:
micromark-extension-gfm@3.0.0:
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+ micromark-extension-math@3.1.0:
+ resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
+
micromark-extension-mdx-expression@3.0.1:
resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
@@ -8434,6 +8483,10 @@ packages:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+ path-type@6.0.0:
+ resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
+ engines: {node: '>=18'}
+
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
@@ -9712,6 +9765,10 @@ packages:
resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
engines: {node: '>=12'}
+ slash@5.1.0:
+ resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+ engines: {node: '>=14.16'}
+
slice-source@0.4.1:
resolution: {integrity: sha512-YiuPbxpCj4hD9Qs06hGAz/OZhQ0eDuALN0lRWJez0eD/RevzKqGdUx1IOMUnXgpr+sXZLq3g8ERwbAH0bCb8vg==}
@@ -10258,6 +10315,10 @@ packages:
resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
engines: {node: '>=4'}
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -15271,6 +15332,8 @@ snapshots:
'@sindresorhus/is@5.6.0': {}
+ '@sindresorhus/merge-streams@4.0.0': {}
+
'@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
'@babel/runtime': 7.28.4
@@ -16828,6 +16891,8 @@ snapshots:
'@types/json-schema@7.0.15': {}
+ '@types/katex@0.16.7': {}
+
'@types/keyv@3.1.4':
dependencies:
'@types/node': 24.10.0
@@ -18944,6 +19009,15 @@ snapshots:
merge2: 1.4.1
slash: 4.0.0
+ globby@15.0.0:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ fast-glob: 3.3.3
+ ignore: 7.0.5
+ path-type: 6.0.0
+ slash: 5.1.0
+ unicorn-magic: 0.3.0
+
globrex@0.1.2: {}
gopd@1.2.0: {}
@@ -19288,6 +19362,8 @@ snapshots:
ignore@5.3.2: {}
+ ignore@7.0.5: {}
+
image-size@2.0.2: {}
import-fresh@3.3.1:
@@ -19628,6 +19704,10 @@ snapshots:
dependencies:
argparse: 2.0.1
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
jsesc@3.0.2: {}
jsesc@3.1.0: {}
@@ -19648,6 +19728,8 @@ snapshots:
json5@2.2.3: {}
+ jsonc-parser@3.3.1: {}
+
jsonfile@4.0.0:
optionalDependencies:
graceful-fs: 4.2.11
@@ -19660,6 +19742,10 @@ snapshots:
jsts@2.7.1: {}
+ katex@0.16.25:
+ dependencies:
+ commander: 8.3.0
+
kdbush@4.0.2: {}
keyv@4.5.4:
@@ -19881,6 +19967,35 @@ snapshots:
markdown-table@3.0.4: {}
+ markdownlint-cli2-formatter-default@0.0.6(markdownlint-cli2@0.19.0):
+ dependencies:
+ markdownlint-cli2: 0.19.0
+
+ markdownlint-cli2@0.19.0:
+ dependencies:
+ globby: 15.0.0
+ js-yaml: 4.1.1
+ jsonc-parser: 3.3.1
+ markdown-it: 14.1.0
+ markdownlint: 0.39.0
+ markdownlint-cli2-formatter-default: 0.0.6(markdownlint-cli2@0.19.0)
+ micromatch: 4.0.8
+ transitivePeerDependencies:
+ - supports-color
+
+ markdownlint@0.39.0:
+ dependencies:
+ micromark: 4.0.2
+ micromark-core-commonmark: 2.0.3
+ micromark-extension-directive: 4.0.0
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-math: 3.1.0
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
marked@15.0.12: {}
marked@16.4.1: {}
@@ -20152,6 +20267,16 @@ snapshots:
micromark-util-types: 2.0.2
parse-entities: 4.0.2
+ micromark-extension-directive@4.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ parse-entities: 4.0.2
+
micromark-extension-frontmatter@2.0.0:
dependencies:
fault: 2.0.1
@@ -20217,6 +20342,16 @@ snapshots:
micromark-util-combine-extensions: 2.0.1
micromark-util-types: 2.0.2
+ micromark-extension-math@3.1.0:
+ dependencies:
+ '@types/katex': 0.16.7
+ devlop: 1.1.0
+ katex: 0.16.25
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
micromark-extension-mdx-expression@3.0.1:
dependencies:
'@types/estree': 1.0.8
@@ -20854,6 +20989,8 @@ snapshots:
path-type@4.0.0: {}
+ path-type@6.0.0: {}
+
pathe@1.1.2: {}
pathe@2.0.3: {}
@@ -22333,6 +22470,8 @@ snapshots:
slash@4.0.0: {}
+ slash@5.1.0: {}
+
slice-source@0.4.1: {}
smob@1.5.0: {}
@@ -22853,6 +22992,8 @@ snapshots:
unicode-property-aliases-ecmascript@2.2.0: {}
+ unicorn-magic@0.3.0: {}
+
unified@11.0.5:
dependencies:
'@types/unist': 3.0.3
From ae6cdfe9cac20c310752df8c77fc97d542bdf937 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 18:03:11 +0100
Subject: [PATCH 07/11] fix: typo
---
fdm-docs/docs/getting-started/01-what-is-fdm.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fdm-docs/docs/getting-started/01-what-is-fdm.md b/fdm-docs/docs/getting-started/01-what-is-fdm.md
index 5b27bb6dc..6e87526cf 100644
--- a/fdm-docs/docs/getting-started/01-what-is-fdm.md
+++ b/fdm-docs/docs/getting-started/01-what-is-fdm.md
@@ -2,7 +2,7 @@
title: What is FDM?
---
-The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions that lowers the barries to deliver latest agronomic insights to farmers.
+The Farm Data Model (FDM) is an open-source project designed to standardize and simplify the management of agricultural data. Our mission is to provide a robust and flexible data model that empowers agronomists, developers, and researchers to build powerful and interoperable farm management solutions that lowers the barriers to deliver latest agronomic insights to farmers.
## What Problem Does FDM Solve?
From 5bb1a4c589bf961ac29e7d3191b6f0f1a6b383c5 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 18:04:02 +0100
Subject: [PATCH 08/11] fix: link
---
fdm-docs/docs/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fdm-docs/docs/README.md b/fdm-docs/docs/README.md
index eee5c6589..359508da3 100644
--- a/fdm-docs/docs/README.md
+++ b/fdm-docs/docs/README.md
@@ -15,7 +15,7 @@ The **[Core Concepts](./core-concepts/01-database-schema.md)** section provides
## Agronomic Calculations
-The **[Agronomic Calculations](./agronomic-calculations/01-nitrogen-balance.md)** section is dedicated to explaining the powerful calculation engine within the FDM. Here you will find information on how to perform common agronomic calculations, such as nitrogen balance and fertilizer recommendations.
+The **[Agronomic Calculations](./insights/01-nitrogen-balance.md)** section is dedicated to explaining the powerful calculation engine within the FDM. Here you will find information on how to perform common agronomic calculations, such as nitrogen balance and fertilizer recommendations.
## Contributing to FDM
From 04770331d1a0f7baf2a3d2ee4af0c672f0e1e558 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 18:17:15 +0100
Subject: [PATCH 09/11] Update fdm-docs/docs/core-concepts/06-fertilizers.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
---
fdm-docs/docs/core-concepts/06-fertilizers.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fdm-docs/docs/core-concepts/06-fertilizers.md b/fdm-docs/docs/core-concepts/06-fertilizers.md
index 82d949781..b901e8b9d 100644
--- a/fdm-docs/docs/core-concepts/06-fertilizers.md
+++ b/fdm-docs/docs/core-concepts/06-fertilizers.md
@@ -11,7 +11,7 @@ In FDM, there are two main ways to work with fertilizers:
1. **Using Pre-defined Fertilizers from a Catalogue:** FDM includes a `fertilizersCatalogue` that contains a standardized list of common fertilizers. This catalogue provides information about each fertilizer, including its nutrient content, density, and application methods. When you use a fertilizer from the catalogue, you create a `fertilizerPicking` record to link your specific fertilizer instance to the catalogue entry.
2. **Defining Custom Fertilizers:** If a fertilizer is not in the catalogue, you can define a custom one by creating a new entry in the `fertilizers` table. Storing specific nutrient analysis for custom fertilizers is a planned feature and not yet implemented. This is particularly useful for manure and other organic fertilizers, which can have highly variable nutrient content.
-When you apply a fertilizer to a `Field`, you create a `fertilizer_applying` action. This action is stored in the `fertilizerApplication` table and records:
+When you apply a fertilizer to a `Field`, you create a fertilizer application action. This action is stored in the `fertilizerApplication` table and records:
* **`p_app_id`**: A unique identifier for the application event.
* **`b_id`**: The ID of the `Field` where the fertilizer was applied.
From ba987b160f5c5e407a26215c1447cfae97ee0187 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Wed, 19 Nov 2025 18:17:27 +0100
Subject: [PATCH 10/11] Update fdm-docs/docs/insights/01-nitrogen-balance.md
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
---
fdm-docs/docs/insights/01-nitrogen-balance.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fdm-docs/docs/insights/01-nitrogen-balance.md b/fdm-docs/docs/insights/01-nitrogen-balance.md
index 84c213cce..2ab14e0d5 100644
--- a/fdm-docs/docs/insights/01-nitrogen-balance.md
+++ b/fdm-docs/docs/insights/01-nitrogen-balance.md
@@ -202,7 +202,7 @@ Ammonia emissions from fertilizers are calculated differently depending on the f
`NH3 Emission (kg N / ha) = Application Amount (kg / ha) * Total N Content (g N / kg) * Emission Factor (fraction)`
Where:
* `Application Amount`: `p_app_amount` (kg / ha).
- * `Total N Content`: `p_n_rt` (fraction).
+ * `Total N Content`: `p_n_rt` (g N / kg).
* `Emission Factor`: `p_ef_nh3` (fraction). This factor can be directly provided in the `FertilizerDetail`. If it is not provided, it is calculated using an empirical formula based on the fertilizer's composition:
`Emission Factor = p_n_org^2 * K_1 + p_no3_rt * p_s_rt * K_2 + p_nh4_rt^2 * K_3`
From 33fe0dd23979f8cfbb65e43aa586ed25b4d365a3 Mon Sep 17 00:00:00 2001
From: Sven Verweij <37927107+SvenVw@users.noreply.github.com>
Date: Mon, 24 Nov 2025 09:52:04 +0100
Subject: [PATCH 11/11] docs: resolve comments of Gerard
---
fdm-docs/README.md | 2 +-
fdm-docs/docs/README.md | 2 +-
.../contributing/02-setting-up-local-environment.md | 10 +++++-----
fdm-docs/docs/core-concepts/02-farms.md | 2 +-
fdm-docs/docs/insights/01-nitrogen-balance.md | 6 +++---
5 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/fdm-docs/README.md b/fdm-docs/README.md
index 7e5ed36f1..106d4ea5e 100644
--- a/fdm-docs/README.md
+++ b/fdm-docs/README.md
@@ -25,13 +25,13 @@ turbo run build
```
## Contributing
+
We welcome contributions to improve the FDM documentation! See the contributing guidelines in the main FDM repository for details on how to contribute code, documentation, report bugs, and suggest improvements.
## Made Possible By
FDM is developed by the [Nutriënten Management Instituut](https://www.nmi-agro.nl/) as part of the Horizon Europe projects: [NutriBudget](https://www.nutribudget.eu/) and [PPS BAAT](https://www.handboekbodemenbemesting.nl/nl/handboekbodemenbemesting/pps-baat.htm).
-
## Contact
Maintainer: @SvenVw
diff --git a/fdm-docs/docs/README.md b/fdm-docs/docs/README.md
index 359508da3..02612bea2 100644
--- a/fdm-docs/docs/README.md
+++ b/fdm-docs/docs/README.md
@@ -15,7 +15,7 @@ The **[Core Concepts](./core-concepts/01-database-schema.md)** section provides
## Agronomic Calculations
-The **[Agronomic Calculations](./insights/01-nitrogen-balance.md)** section is dedicated to explaining the powerful calculation engine within the FDM. Here you will find information on how to perform common agronomic calculations, such as nitrogen balance and fertilizer recommendations.
+The **[Agronomic Calculations](./insights/01-nitrogen-balance.md)** section is dedicated to explaining the calculation engine within the FDM. Here you will find information on how to perform common agronomic calculations, such as nitrogen balance and fertilizer recommendations.
## Contributing to FDM
diff --git a/fdm-docs/docs/contributing/02-setting-up-local-environment.md b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
index cdca41f48..257253368 100644
--- a/fdm-docs/docs/contributing/02-setting-up-local-environment.md
+++ b/fdm-docs/docs/contributing/02-setting-up-local-environment.md
@@ -9,10 +9,10 @@ This guide will walk you through the process of setting up a local development e
Before you begin, you will need to have the following software installed on your machine:
-* **Node.js:** FDM is a TypeScript and JavaScript project, so you will need to have Node.js installed.
-* **`pnpm`**: FDM uses `pnpm` for package management, so you will need to have it installed.
-* **Git:** FDM is hosted on GitHub, so you will need to have Git installed to clone the repository.
-* **Docker:** FDM uses Docker to run the necessary services, such as the PostgreSQL database.
+* **[Node.js](https://nodejs.org/en/download)**: FDM is a TypeScript and JavaScript project, so you will need to have Node.js installed.
+* **[`pnpm`](https://pnpm.io/installation)**: FDM uses `pnpm` for package management, so you will need to have it installed.
+* **[Git](https://git-scm.com/downloads)**: FDM is hosted on GitHub, so you will need to have Git installed to clone the repository.
+* **[Docker](https://docs.docker.com/get-docker/)**: FDM uses Docker to run the necessary services, such as the PostgreSQL database.
## Cloning the Repository
@@ -50,7 +50,7 @@ docker-compose up -d
## External Services
-The `fdm-calculator` requires the `nmi-api` for Dutch nutrient advices. You can find the documentation for this API at [https://api.nmi-agro.nl/docs](https://api.nmi-agro.nl/docs).
+The `fdm-calculator` requires the `nmi-api` for Dutch nutrient advices. You can find the documentation for this API at [https://api.nmi-agro.nl/docs](https://api.nmi-agro.nl/docs). You need to have a NMI API key to access this service.
## Running the Application
diff --git a/fdm-docs/docs/core-concepts/02-farms.md b/fdm-docs/docs/core-concepts/02-farms.md
index e8f44baf2..16a8409c8 100644
--- a/fdm-docs/docs/core-concepts/02-farms.md
+++ b/fdm-docs/docs/core-concepts/02-farms.md
@@ -2,7 +2,7 @@
title: Farms
---
-The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming operation and is the primary unit within the system.
+The `Farm` asset is the top-level container for all other assets and actions in the Farm Data Model (FDM). It represents a single farming business or enterprise and is the primary unit within the system.
## Properties
diff --git a/fdm-docs/docs/insights/01-nitrogen-balance.md b/fdm-docs/docs/insights/01-nitrogen-balance.md
index 2ab14e0d5..cdccc37cc 100644
--- a/fdm-docs/docs/insights/01-nitrogen-balance.md
+++ b/fdm-docs/docs/insights/01-nitrogen-balance.md
@@ -255,8 +255,8 @@ The final output (`NitrogenBalanceNumeric`) provides:
* A list of balances for each field (`NitrogenBalanceFieldNumeric`), which includes:
* Field ID.
* Field-specific **N Surplus** (reported as `balance`, in kg N / ha). This is calculated as `N Supply - N Removal - Ammonia Emission`.
- * Detailed breakdown of supply (total, fertilizers by type, fixation, deposition, mineralization).
- * Detailed breakdown of removal (total, harvests, residues).
- * Detailed breakdown of emission (total, plus sub-components for ammonia and nitrate).
+ * Supply breakdown (total, fertilizers by type, fixation, deposition, mineralization).
+ * Removal breakdown (total, harvests, residues).
+ * Emission breakdown (total, plus sub-components for ammonia and nitrate).
All values are rounded numbers.