Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
797a3c9
wire-in component
lazarusA Jun 15, 2026
c4193e6
get values
lazarusA Jun 15, 2026
ef31cf2
keys issues
lazarusA Jun 15, 2026
c737005
no log
lazarusA Jun 15, 2026
5974a7d
config bar
lazarusA Jun 15, 2026
72032a9
dont
lazarusA Jun 16, 2026
0ce7209
let it be index
lazarusA Jun 16, 2026
f2f5df9
fixes to DIMS
lazarusA Jun 16, 2026
3f1b6b9
all
lazarusA Jun 18, 2026
7a0f002
selections
lazarusA Jun 18, 2026
9a9ca6e
full original version back
lazarusA Jun 18, 2026
dadab6e
more ui
lazarusA Jun 19, 2026
f85eba0
select
lazarusA Jun 19, 2026
5e934f2
collapsed
lazarusA Jun 19, 2026
ca84371
no more than 3
lazarusA Jun 19, 2026
989d098
pointers
lazarusA Jun 19, 2026
0064651
less options
lazarusA Jun 19, 2026
5edc36d
all feedback on ui redundacies
lazarusA Jun 19, 2026
a926c87
Stash
TheJeran Jun 19, 2026
aac39d9
working with NetCDF
TheJeran Jun 19, 2026
9eabd73
LoadZarrFunction
TheJeran Jun 19, 2026
e4bf0fd
Good enough
TheJeran Jun 19, 2026
a81cfe5
last comment
TheJeran Jun 19, 2026
be8a461
locahost --> browzarr
TheJeran Jun 19, 2026
e35e87d
Gemini suggestions
TheJeran Jun 19, 2026
6239421
include icechunk in the main store menu (#668)
lazarusA Jun 20, 2026
4512514
icechunk options into settings (#669)
lazarusA Jun 21, 2026
3c21b0e
adds icechunk catalog (#670)
lazarusA Jun 21, 2026
8fb320f
Added IsNan to shaders w/out boilerplate
TheJeran Apr 30, 2026
93e0cb3
Gemini fixes
TheJeran Jun 22, 2026
f77df0a
rm baseUrl
lazarusA Jun 25, 2026
fe22ba9
icechunk 0.6
lazarusA Jun 25, 2026
8b26b89
copy over and rm import
lazarusA Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
"embla-carousel-react": "^8.6.0",
"fflate": "^0.8.2",
"gsap": "^3.13.0",
"icechunk-js": "^0.4.0",
"icechunk-js": "^0.6.0",
"input-otp": "^1.4.2",
"js-colormaps-es": "^0.0.5",
"lucide-react": "^0.562.0",
Expand Down
5 changes: 5 additions & 0 deletions src/GlobalStates/PlotStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ type PlotState ={
maskValue: number;
cameraPosition: THREE.Vector3;
disablePointScale: boolean;
camera: THREE.Camera | undefined;

setQuality: (quality: number) => void;
setTimeScale: (timeScale : number) =>void;
Expand Down Expand Up @@ -119,8 +120,10 @@ type PlotState ={
setUseOrtho: (useOrtho: boolean) => void;
setFillValue: (fillValue: number | undefined) => void;
setCameraPosition: (cameraPosition: THREE.Vector3) => void;

}


export const usePlotStore = create<PlotState>((set, get) => ({
plotType: "volume",
pointSize: 5,
Expand Down Expand Up @@ -185,6 +188,7 @@ export const usePlotStore = create<PlotState>((set, get) => ({
borderWidth: 0.05,
cameraPosition: new THREE.Vector3(0, 0, 5),
disablePointScale: false,
camera: undefined,

setVTransferRange: (vTransferRange) => set({ vTransferRange }),
setVTransferScale: (vTransferScale) => set({ vTransferScale }),
Expand Down Expand Up @@ -242,4 +246,5 @@ export const usePlotStore = create<PlotState>((set, get) => ({
setUseOrtho: (useOrtho) => set({ useOrtho }),
setFillValue: (fillValue) => set({ fillValue }),
setCameraPosition: (cameraPosition) => set({ cameraPosition }),

}))
2 changes: 2 additions & 0 deletions src/GlobalStates/ZarrStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type ZarrState = {
fetchOptions: FetchStoreOptions | null;
abortController: AbortController | null;
fetchKey: number;
blobKey: string | undefined; // The key for the stored File blob for a local NC

setZSlice: (zSlice: [number , number | null]) => void;
setYSlice: (ySlice: [number , number | null]) => void;
Expand Down Expand Up @@ -63,6 +64,7 @@ export const useZarrStore = create<ZarrState>((set, get) => ({
fetchOptions: null,
abortController: null,
fetchKey: 0,
blobKey: undefined,

setZSlice: (zSlice) => set({ zSlice }),
setYSlice: (ySlice) => set({ ySlice }),
Expand Down
8 changes: 8 additions & 0 deletions src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -455,4 +455,12 @@ a[href]:hover::after {
.glow-effect {
animation: glow-pulse 2s ease-in-out infinite;
border-radius: 0.275rem;
}

input[type=number].no-spinner {
-moz-appearance: textfield;
}

input[type=number].no-spinner::-moz-number-spin-box {
display: none;
}
128 changes: 128 additions & 0 deletions src/assets/catalogs/IcechunkCatalog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
export const ICECHUNK_CATALOG = [
{
key: 'chirps-daily',
label: 'CHIRPS Daily Precipitation',
subtitle: '',
store: 'https://data.source.coop/e4drr-project/observations/chirps_daily_icechunk',
},
{
key: 'earthmover-era5-surface',
label: 'Earthmover ERA5 Surface Reanalysis',
subtitle: 'Multi-Variable',
store: 'https://earthmover-icechunk-era5.s3.us-east-1.amazonaws.com/era5_surface_aws',
},
{
key: 'noaa-gfs-forecast',
label: 'NOAA GFS',
subtitle: 'Global Weather Forecast',
store: 'https://dynamical-noaa-gfs.s3.us-west-2.amazonaws.com/noaa-gfs-forecast/v0.2.7.icechunk/',
},
{
key: 'dwd-icon-eu-forecast',
label: 'DWD ICON-EU',
subtitle: 'Numerical Weather Forecast',
store: 'https://dynamical-dwd-icon-eu.s3.us-west-2.amazonaws.com/dwd-icon-eu-forecast-5-day/v0.2.0.icechunk/',
},
{
key: 'ecmwf-aifs-single-forecast',
label: 'ECMWF AIFS Single Forecast',
subtitle: 'Artificial Intelligence Forecasting System',
store: 'https://dynamical-ecmwf-aifs-single.s3.us-west-2.amazonaws.com/ecmwf-aifs-single-forecast/v0.1.0.icechunk/',
},
{
key: 'metoffice-global-wave',
label: 'UK Met Office Global Wave Forecast',
subtitle: '',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_wave.icechunk',
},
{
key: 'metoffice-global-deterministic-6h',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '6-hourly 24hr',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km_6hourly_24hr.icechunk',
},
{
key: 'nasa-geos-15min',
label: 'NASA GEOS Atmospheric Reanalysis',
subtitle: '15-minute',
store: 'https://data.source.coop/bkr/geos/geos_15min.icechunk',
},
{
key: 'metoffice-global-deterministic-11h',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '11-hour',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km_11hour.icechunk',
},
{
key: 'metoffice-global-deterministic',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km.icechunk',
},
{
key: 'noaa-hrrr-analysis',
label: 'NOAA HRRR',
subtitle: 'High-Resolution Rapid Refresh Analysis',
store: 'https://dynamical-noaa-hrrr.s3.us-west-2.amazonaws.com/noaa-hrrr-analysis/v0.2.0.icechunk/',
},
{
key: 'noaa-mrms-conus-hourly',
label: 'NOAA MRMS CONUS',
subtitle: 'Hourly Radar-Based Precipitation Analysis',
store: 'https://dynamical-noaa-mrms.s3.amazonaws.com/noaa-mrms-conus-analysis-hourly/v0.3.0.icechunk/',
},
{
key: 'ecmwf-aifs-ens-forecast',
label: 'ECMWF AIFS Ensemble Forecast',
subtitle: '',
store: 'https://dynamical-ecmwf-aifs-ens.s3.us-west-2.amazonaws.com/ecmwf-aifs-ens-forecast/v0.1.0.icechunk/',
},
{
key: 'ecmwf-ifs-ens-15day',
label: 'ECMWF IFS Ensemble 15-day Weather Forecast',
subtitle: '0.25°',
store: 'https://dynamical-ecmwf-ifs-ens.s3.us-west-2.amazonaws.com/ecmwf-ifs-ens-forecast-15-day-0-25-degree/v0.1.0.icechunk/',
},
{
key: 'noaa-gefs-35day-forecast',
label: 'NOAA GEFS 35-day Ensemble Forecast',
subtitle: '',
store: 'https://dynamical-noaa-gefs.s3.us-west-2.amazonaws.com/noaa-gefs-forecast-35-day/v0.2.0.icechunk/',
},
{
key: 'silam-aerosol',
label: 'SILAM Global Dust Model Forecasts',
subtitle: 'Aerosol',
store: 'https://data.source.coop/bkr/silam-dust/silam_aerosol.icechunk',
},
{
key: 'cams-aerosol-analysis',
label: 'CAMS Aerosol Analysis',
subtitle: 'Copernicus CAMS Operational Archive',
store: 'https://data.source.coop/bkr/cams/cams.icechunk',
},
{
key: 'cams-aerosol-forecast',
label: 'CAMS Aerosol Forecast',
subtitle: 'Copernicus CAMS Operational Archive',
store: 'https://data.source.coop/bkr/cams/cams_analysis_and_forecast.icechunk',
},
{
key: 'nasa-rasi',
label: 'NASA RASI',
subtitle: 'Risk Analysis and Solutions Innovators',
store: 'https://nasa-waterinsight.s3.us-west-2.amazonaws.com/virtual-zarr-store/icechunk/RASI/HISTORICAL/',
},
{
key: 'alaska-hrrr',
label: 'Alaska HRRR',
subtitle: '',
store: 'https://data.source.coop/bkr/dmi/alaska_hrrr.icechunk',
},
{
key: 'ndvi-test',
label: 'NDVI',
subtitle: 'Normalized Difference Vegetation Index',
store: 'https://data.source.coop/eeholmes/chlaz/icechunk',
},
];
92 changes: 92 additions & 0 deletions src/assets/catalogs/ZarrCatalog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export const ZARR_CATALOG = [
{
key: 'seasfire',
label: 'SeasFire Cube',
subtitle: 'A Global Dataset for Seasonal Fire Modeling in the Earth System',
store: 'https://s3.bgc-jena.mpg.de:9000/misc/seasfire_rechunked.zarr',
},
{
key: 'ESDC',
label: 'ESDC',
subtitle: 'Earth System Data Cube v3.0.2',
store: 'https://s3.bgc-jena.mpg.de:9000/esdl-esdc-v3.0.2/esdc-16d-2.5deg-46x72x1440-3.0.2.zarr',
},
{
key: 'precipitation',
label: 'Precipitation (EC-Earth3P-HR)',
subtitle: 'Precipitation data from EC-Earth3P-HR highresSST-present',
store: 'https://storage.googleapis.com/cmip6/CMIP6/HighResMIP/EC-Earth-Consortium/EC-Earth3P-HR/highresSST-present/r1i1p1f1/Amon/pr/gr/v20170811/',
},
{
key: 'arco-ocean',
label: 'ARCO-OCEAN',
subtitle: 'Global Ocean Reanalysis Daily',
store: 'https://ogs-arco-ocean.s3.eu-south-1.amazonaws.com/dataset/tres=1d/res=0p25/levels=10/',
},
{
key: 'cmip6-mpi-esm1-2-hr-tas',
label: 'CMIP6 MPI-ESM1-2-HR',
subtitle: 'Historical Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/CMIP/MPI-M/MPI-ESM1-2-HR/historical/r1i1p1f1/Amon/tas/gn/v20190710/',
},
{
key: 'cmip6-pmip-ipsl-cm6a-lr-tas',
label: 'CMIP6 PMIP IPSL-CM6A-LR',
subtitle: 'Mid-Holocene Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f3/Amon/tas/gr/v20180926/',
},
{
key: 'cmip6-hadgem3-gc31-hm-tas',
label: 'CMIP6 HighResMIP HadGEM3-GC31-HM',
subtitle: 'Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/HighResMIP/MOHC/HadGEM3-GC31-HM/highresSST-present/r1i1p1f1/Amon/tas/gn/v20170831/',
},
{
key: 'indian-ocean-chl',
label: 'Indian Ocean Physical and Biological Variables',
subtitle: '',
store: 'https://storage.googleapis.com/nmfs_odp_nwfsc/CB/mind_the_chl_gap/IO.zarr',
},
{
key: 'nasa-mur-sst',
label: 'NASA MUR Sea Surface Temperature',
subtitle: 'Multi-scale Ultra-high Resolution SST',
store: 'https://mur-sst.s3.us-west-2.amazonaws.com/zarr-v1/',
},
{
key: 'cmip6-gfdl-esm4-tos',
label: 'CMIP6 NOAA GFDL-ESM4',
subtitle: 'Historical Sea Surface Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/CMIP/NOAA-GFDL/GFDL-ESM4/historical/r2i1p1f1/Omon/tos/gn/v20180701/',
},
{
key: 'cmip6-awi-cm-1-1-mr-tos',
label: 'CMIP6 AWI-CM-1-1-MR',
subtitle: 'Historical Daily Sea Surface Temperature',
store: 'https://cmip6-pds.s3.amazonaws.com/CMIP6/CMIP/AWI/AWI-CM-1-1-MR/historical/r1i1p1f1/Oday/tos/gn/v20181218/',
},
{
key: 'carbonplan-antarctic-era5',
label: 'CarbonPlan Antarctic ERA5 Reanalysis',
subtitle: '',
store: 'https://carbonplan-share.s3.us-west-2.amazonaws.com/zarr-layer-examples/antarctic_era5.zarr',
},
{
key: 'silam-dust',
label: 'SILAM Global Dust Model Forecasts',
subtitle: 'Dust',
store: 'https://data.source.coop/bkr/silam-dust/silam_global_dust_v3.zarr',
},
{
key: 'silam-dust-v2',
label: 'SILAM Global Dust Model Forecasts (v2)',
subtitle: 'Dust',
store: 'https://data.source.coop/bkr/silam-dust/data.zarr',
},
{
key: 'gefs-35day-direct',
label: 'NOAA GEFS 35-day Ensemble Forecast',
subtitle: '',
store: 'https://data.dynamical.org/noaa/gefs/forecast-35-day/latest.zarr',
},
];
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
18 changes: 11 additions & 7 deletions src/assets/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import logoSeasFire from "./logoS.png";
import logoSF from "./SeasFire-logo.png";
import logo from "./logo.png";
import logoBGC_MPI from "./logo_bgc_mpi.png"
import logoBGC from "./logo_bgc.png"
import logoMPI from "./logo_mpi.png"
import logoSeasFire from "./imgs/logoS.png";
import logoSF from "./imgs/SeasFire-logo.png";
import logo from "./imgs/logo.png";
import logoBGC_MPI from "./imgs/logo_bgc_mpi.png"
import logoBGC from "./imgs/logo_bgc.png"
import logoMPI from "./imgs/logo_mpi.png"
import { ZARR_CATALOG } from "./catalogs/ZarrCatalog"
import { ICECHUNK_CATALOG } from "./catalogs/IcechunkCatalog"

export {
logoSeasFire,
logo,
logoSF,
logoBGC_MPI,
logoBGC,
logoMPI
logoMPI,
ZARR_CATALOG,
ICECHUNK_CATALOG,
};
35 changes: 34 additions & 1 deletion src/components/StoreInitializer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
import { useSearchParams } from "next/navigation";
import { useGlobalStore } from "@/GlobalStates/GlobalStore";
import { useZarrStore } from '@/GlobalStates/ZarrStore';
import { usePlotStore } from "@/GlobalStates/PlotStore";
import { useShallow } from 'zustand/shallow';
import { isRemoteStore } from '@/utils/isRemoteStore';
import { loadNetCDF } from "@/utils/loadNetCDF";
import { loadFile } from "@/utils/IndexDB";
import { LoadLocalZarr } from "./ui/MainPanel/LocalZarr";

function StoreInitializerInner() {
const searchParams = useSearchParams();
Expand All @@ -17,11 +21,40 @@

useEffect(() => {
const store = searchParams.get("store");
let data = searchParams.get("data")

Check failure on line 24 in src/components/StoreInitializer.tsx

View workflow job for this annotation

GitHub Actions / core

'data' is never reassigned. Use 'const' instead
if (data){
try{
const fullObj = JSON.parse(data);
if (fullObj.zarrState.blobKey){ // If NC local must load file beforehand
const blobKey = fullObj.zarrState.blobKey
const isNC = fullObj.zarrState.useNC
loadFile(blobKey).then(cache =>{
if (!isNC){
LoadLocalZarr(cache?.blob as File[])
} else {
//@ts-ignore cache is what we want

Check failure on line 35 in src/components/StoreInitializer.tsx

View workflow job for this annotation

GitHub Actions / core

Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free
const file = cache.blob as File
loadNetCDF(file, file.name).then(() => {
useZarrStore.setState(fullObj.zarrState);
useGlobalStore.setState(fullObj.globalState);
usePlotStore.setState(fullObj.plotState);
})
}
})
} else {
useZarrStore.setState(fullObj.zarrState)
useGlobalStore.setState(fullObj.globalState)
usePlotStore.setState(fullObj.plotState)
}
} catch {
console.error('Something Failed :/')
}
}
if (!store) {
setStoreFromURL(false);
return;
}

const isNC = searchParams.get("format") === "nc";
setUseNC(isNC);
setFetchNC(isNC);
Expand Down
Loading
Loading