From 470571434cb4566e8c403b282dc30f200ddddd90 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Sun, 22 Mar 2026 16:29:37 -0400 Subject: [PATCH 01/14] add simple button to create a PR against the main repository to add new content --- CLAUDE.md | 82 + frontend/dist/assets/index-Bq7rTnOb.css | 1 + frontend/dist/assets/index-CRvjnaR5.js | 190 ++ frontend/dist/data/reproinventory_data.json | 2080 +++++++++++++++++ frontend/dist/index.html | 13 + frontend/src/components/AddMaterialDialog.tsx | 424 ++++ frontend/src/main.tsx | 1 + frontend/src/training-materials-browser.tsx | 8 + 8 files changed, 2799 insertions(+) create mode 100644 CLAUDE.md create mode 100644 frontend/dist/assets/index-Bq7rTnOb.css create mode 100644 frontend/dist/assets/index-CRvjnaR5.js create mode 100644 frontend/dist/data/reproinventory_data.json create mode 100644 frontend/dist/index.html create mode 100644 frontend/src/components/AddMaterialDialog.tsx diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b729136 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,82 @@ +# ReproInventory - Claude Instructions + +## Project Overview + +ReproInventory is a web application for browsing neuroimaging and reproducibility training materials. It is part of the ReproNim project. Users can search and filter a catalog of training resources by level, platform, format, programming language, neuroimaging software, and more. + +## Tech Stack + +- **Frontend:** React 19 + TypeScript + Vite +- **Styling:** Tailwind CSS v4 +- **UI Components:** shadcn/ui (built on Radix UI primitives) +- **Icons:** lucide-react +- **Data:** Static JSON file served from `frontend/public/data/reproinventory_data.json` +- **Model/Schema:** YAML-based schema in `model/`, with Python scripts to generate JSON +- **Deploy:** GitHub Pages via GitHub Actions (pushes to `main` auto-deploy) + +## Directory Structure + +``` +frontend/ # Main React app + src/ + components/ # Custom components (e.g. Footer, EditMaterialDialog, AddMaterialDialog) + components/ui/ # shadcn/ui primitives (accordion, badge, button, card, etc.) + types/ # TypeScript types generated from the YAML schema + training-materials-browser.tsx # Main browser/filter UI + App.tsx # Root component + public/ + data/ + reproinventory_data.json # The training materials dataset + +model/ # Schema and data source of truth + model.yaml # LinkML schema definition + reproinventory_data.yaml # Raw training data + reproinventory_schema.yaml # Schema + generate_reproinventory_data.py # Generates JSON from YAML + convert_yaml_to_json.py + +SimpleViewer/ # Legacy Python/Flask viewer (archived, do not modify) +``` + +## Development Commands + +All commands run from the `frontend/` directory: + +```bash +npm run dev # Start local dev server +npm run build # TypeScript check + Vite build +npm run lint # ESLint +npm run preview # Preview production build locally +``` + +## Data Model + +The data schema is defined in `model/model.yaml` (LinkML). TypeScript types in `frontend/src/types/reproinventory.ts` are generated from this schema. Key fields on `ReproInventoryEntry`: + +- `id`, `course_name`, `url`, `review`, `notes`, `keywords` +- `level`, `platform`, `course_length`, `instruction_medium`, `delivery` +- `language`, `programming_language`, `neuroimaging_software`, `imaging_modality` +- `open_dataset`, `assessment`, `quadrants`, `tag_team` + +Enum values are strict — always use values that match the schema. + +## Code Conventions + +- Use the types from `frontend/src/types/reproinventory.ts` for all data model types; do not redefine them locally (note: `AddMaterialDialog.tsx` currently duplicates types — prefer importing from the shared types file in new code). +- Use `@/` path alias for imports (e.g. `@/components/ui/button`). +- UI primitives live in `frontend/src/components/ui/` — use these rather than raw HTML elements. +- Custom components go in `frontend/src/components/`. +- The dataset is fetched at runtime from `/ReproInventory/data/reproinventory_data.json` (the GitHub Pages base path). + +## Deployment + +- Pushing to `main` triggers GitHub Actions which builds the frontend and deploys to GitHub Pages. +- The Vite base path is set for GitHub Pages — keep this in mind when referencing public assets. +- Do not push broken builds to `main`. + +## What to Avoid + +- Do not modify files in `SimpleViewer/` — it is a legacy viewer and not actively used. +- Do not change enum values without also updating `model/model.yaml` and regenerating types. +- Do not hardcode data that belongs in `reproinventory_data.json` or the YAML source. +- Do not add dependencies without good reason — the stack is intentionally minimal. diff --git a/frontend/dist/assets/index-Bq7rTnOb.css b/frontend/dist/assets/index-Bq7rTnOb.css new file mode 100644 index 0000000..049cea5 --- /dev/null +++ b/frontend/dist/assets/index-Bq7rTnOb.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.10 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-blue-500:oklch(62.3% .214 259.815);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-900:oklch(21% .006 285.885);--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.right-4{right:calc(var(--spacing)*4)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-16{margin-top:calc(var(--spacing)*16)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-24{height:calc(var(--spacing)*24)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-px{height:1px}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.min-h-screen{min-height:100vh}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-24{width:calc(var(--spacing)*24)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.cursor-default{cursor:default}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-1{padding:calc(var(--spacing)*1)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-\[3px\]{padding:3px}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-blue-500{color:var(--color-blue-500)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.text-zinc-50{color:var(--color-zinc-50)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up var(--tw-animation-duration,var(--tw-duration,.2s))ease-out}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: 50% }.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48% }.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down var(--tw-animation-duration,var(--tw-duration,.2s))ease-out}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: 50% }.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48% }@media (min-width:40rem){.sm\:max-w-\[800px\]{max-width:800px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}}@media (min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary)90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))))}}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))))}to{height:0}} diff --git a/frontend/dist/assets/index-CRvjnaR5.js b/frontend/dist/assets/index-CRvjnaR5.js new file mode 100644 index 0000000..a1fd1e2 --- /dev/null +++ b/frontend/dist/assets/index-CRvjnaR5.js @@ -0,0 +1,190 @@ +function f0(a,r){for(var o=0;oc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const g of d.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&c(g)}).observe(document,{childList:!0,subtree:!0});function o(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=o(f);fetch(f.href,d)}})();function cv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var mu={exports:{}},Yi={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var pg;function d0(){if(pg)return Yi;pg=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(c,f,d){var g=null;if(d!==void 0&&(g=""+d),f.key!==void 0&&(g=""+f.key),"key"in f){d={};for(var v in f)v!=="key"&&(d[v]=f[v])}else d=f;return f=d.ref,{$$typeof:a,type:c,key:g,ref:f!==void 0?f:null,props:d}}return Yi.Fragment=r,Yi.jsx=o,Yi.jsxs=o,Yi}var yg;function m0(){return yg||(yg=1,mu.exports=d0()),mu.exports}var u=m0(),hu={exports:{}},Se={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var xg;function h0(){if(xg)return Se;xg=1;var a=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),g=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),m=Symbol.for("react.memo"),b=Symbol.for("react.lazy"),p=Symbol.iterator;function w(E){return E===null||typeof E!="object"?null:(E=p&&E[p]||E["@@iterator"],typeof E=="function"?E:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},M=Object.assign,N={};function j(E,Y,W){this.props=E,this.context=Y,this.refs=N,this.updater=W||C}j.prototype.isReactComponent={},j.prototype.setState=function(E,Y){if(typeof E!="object"&&typeof E!="function"&&E!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,E,Y,"setState")},j.prototype.forceUpdate=function(E){this.updater.enqueueForceUpdate(this,E,"forceUpdate")};function z(){}z.prototype=j.prototype;function _(E,Y,W){this.props=E,this.context=Y,this.refs=N,this.updater=W||C}var U=_.prototype=new z;U.constructor=_,M(U,j.prototype),U.isPureReactComponent=!0;var q=Array.isArray,G={H:null,A:null,T:null,S:null,V:null},J=Object.prototype.hasOwnProperty;function F(E,Y,W,P,I,ye){return W=ye.ref,{$$typeof:a,type:E,key:Y,ref:W!==void 0?W:null,props:ye}}function X(E,Y){return F(E.type,Y,void 0,void 0,void 0,E.props)}function ie(E){return typeof E=="object"&&E!==null&&E.$$typeof===a}function me(E){var Y={"=":"=0",":":"=2"};return"$"+E.replace(/[=:]/g,function(W){return Y[W]})}var xe=/\/+/g;function ue(E,Y){return typeof E=="object"&&E!==null&&E.key!=null?me(""+E.key):Y.toString(36)}function be(){}function ve(E){switch(E.status){case"fulfilled":return E.value;case"rejected":throw E.reason;default:switch(typeof E.status=="string"?E.then(be,be):(E.status="pending",E.then(function(Y){E.status==="pending"&&(E.status="fulfilled",E.value=Y)},function(Y){E.status==="pending"&&(E.status="rejected",E.reason=Y)})),E.status){case"fulfilled":return E.value;case"rejected":throw E.reason}}throw E}function de(E,Y,W,P,I){var ye=typeof E;(ye==="undefined"||ye==="boolean")&&(E=null);var ce=!1;if(E===null)ce=!0;else switch(ye){case"bigint":case"string":case"number":ce=!0;break;case"object":switch(E.$$typeof){case a:case r:ce=!0;break;case b:return ce=E._init,de(ce(E._payload),Y,W,P,I)}}if(ce)return I=I(E),ce=P===""?"."+ue(E,0):P,q(I)?(W="",ce!=null&&(W=ce.replace(xe,"$&/")+"/"),de(I,Y,W,"",function(De){return De})):I!=null&&(ie(I)&&(I=X(I,W+(I.key==null||E&&E.key===I.key?"":(""+I.key).replace(xe,"$&/")+"/")+ce)),Y.push(I)),1;ce=0;var ee=P===""?".":P+":";if(q(E))for(var oe=0;oe>>1,E=R[re];if(0>>1;ref(P,B))If(ye,P)?(R[re]=ye,R[I]=B,re=I):(R[re]=P,R[W]=B,re=W);else if(If(ye,B))R[re]=ye,R[I]=B,re=I;else break e}}return Z}function f(R,Z){var B=R.sortIndex-Z.sortIndex;return B!==0?B:R.id-Z.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var g=Date,v=g.now();a.unstable_now=function(){return g.now()-v}}var x=[],m=[],b=1,p=null,w=3,C=!1,M=!1,N=!1,j=!1,z=typeof setTimeout=="function"?setTimeout:null,_=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function q(R){for(var Z=o(m);Z!==null;){if(Z.callback===null)c(m);else if(Z.startTime<=R)c(m),Z.sortIndex=Z.expirationTime,r(x,Z);else break;Z=o(m)}}function G(R){if(N=!1,q(R),!M)if(o(x)!==null)M=!0,J||(J=!0,ue());else{var Z=o(m);Z!==null&&de(G,Z.startTime-R)}}var J=!1,F=-1,X=5,ie=-1;function me(){return j?!0:!(a.unstable_now()-ieR&&me());){var re=p.callback;if(typeof re=="function"){p.callback=null,w=p.priorityLevel;var E=re(p.expirationTime<=R);if(R=a.unstable_now(),typeof E=="function"){p.callback=E,q(R),Z=!0;break t}p===o(x)&&c(x),q(R)}else c(x);p=o(x)}if(p!==null)Z=!0;else{var Y=o(m);Y!==null&&de(G,Y.startTime-R),Z=!1}}break e}finally{p=null,w=B,C=!1}Z=void 0}}finally{Z?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(R,Z){F=z(function(){R(a.unstable_now())},Z)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(R){R.callback=null},a.unstable_forceFrameRate=function(R){0>R||125re?(R.sortIndex=B,r(m,R),o(x)===null&&R===o(m)&&(N?(_(F),F=-1):N=!0,de(G,B-re))):(R.sortIndex=E,r(x,R),M||C||(M=!0,J||(J=!0,ue()))),R},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(R){var Z=w;return function(){var B=w;w=Z;try{return R.apply(this,arguments)}finally{w=B}}}}(pu)),pu}var wg;function v0(){return wg||(wg=1,vu.exports=g0()),vu.exports}var yu={exports:{}},Nt={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ng;function p0(){if(Ng)return Nt;Ng=1;var a=Ju();function r(x){var m="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),yu.exports=p0(),yu.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Eg;function y0(){if(Eg)return Xi;Eg=1;var a=v0(),r=Ju(),o=ov();function c(e){var t="https://react.dev/errors/"+e;if(1E||(e.current=re[E],re[E]=null,E--)}function P(e,t){E++,re[E]=e.current,e.current=t}var I=Y(null),ye=Y(null),ce=Y(null),ee=Y(null);function oe(e,t){switch(P(ce,t),P(ye,e),P(I,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Qh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Qh(t),e=Zh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}W(I),P(I,e)}function De(){W(I),W(ye),W(ce)}function _e(e){e.memoizedState!==null&&P(ee,e);var t=I.current,n=Zh(t,e.type);t!==n&&(P(ye,e),P(I,n))}function Ne(e){ye.current===e&&(W(I),W(ye)),ee.current===e&&(W(ee),Li._currentValue=B)}var Ae=Object.prototype.hasOwnProperty,nt=a.unstable_scheduleCallback,xt=a.unstable_cancelCallback,An=a.unstable_shouldYield,Pt=a.unstable_requestPaint,lt=a.unstable_now,Za=a.unstable_getCurrentPriorityLevel,K=a.unstable_ImmediatePriority,fe=a.unstable_UserBlockingPriority,Ot=a.unstable_NormalPriority,un=a.unstable_LowPriority,fn=a.unstable_IdlePriority,wl=a.log,ut=a.unstable_setDisableYieldValue,dn=null,at=null;function It(e){if(typeof wl=="function"&&ut(e),at&&typeof at.setStrictMode=="function")try{at.setStrictMode(dn,e)}catch{}}var bt=Math.clz32?Math.clz32:Iy,lr=Math.log,it=Math.LN2;function Iy(e){return e>>>=0,e===0?32:31-(lr(e)/it|0)|0}var ar=256,ir=4194304;function Nl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function rr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~s,l!==0?i=Nl(l):(h&=y,h!==0?i=Nl(h):n||(n=y&~e,n!==0&&(i=Nl(n))))):(y=l&~s,y!==0?i=Nl(y):h!==0?i=Nl(h):n||(n=l&~e,n!==0&&(i=Nl(n)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,n=t&-t,s>=n||s===32&&(n&4194048)!==0)?t:i}function Ka(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Jy(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function jf(){var e=ar;return ar<<=1,(ar&4194048)===0&&(ar=256),e}function _f(){var e=ir;return ir<<=1,(ir&62914560)===0&&(ir=4194304),e}function ts(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $a(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Wy(e,t,n,l,i,s){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,A=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0)":-1i||A[l]!==k[i]){var V=` +`+A[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{cs=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function ix(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return ss(e.type,!1);case 11:return ss(e.type.render,!1);case 1:return ss(e.type,!0);case 31:return Jl("Activity");default:return""}}function Bf(e){try{var t="";do t+=ix(e),e=e.return;while(e);return t}catch(n){return` +Error generating stack: `+n.message+` +`+n.stack}}function qt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Gf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function rx(e){var t=Gf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(h){l=""+h,s.call(this,h)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return l},setValue:function(h){l=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function or(e){e._valueTracker||(e._valueTracker=rx(e))}function qf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),l="";return e&&(l=Gf(e)?e.checked?"true":"false":e.value),e=l,e!==n?(t.setValue(e),!0):!1}function ur(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var cx=/[\n"\\]/g;function Vt(e){return e.replace(cx,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function os(e,t,n,l,i,s,h,y){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+qt(t)):e.value!==""+qt(t)&&(e.value=""+qt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?us(e,h,qt(t)):n!=null?us(e,h,qt(n)):l!=null&&e.removeAttribute("value"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.name=""+qt(y):e.removeAttribute("name")}function Vf(e,t,n,l,i,s,h,y){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||n!=null){if(!(s!=="submit"&&s!=="reset"||t!=null))return;n=n!=null?""+qt(n):"",t=t!=null?""+qt(t):n,y||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=y?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h)}function us(e,t,n){t==="number"&&ur(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Wl(e,t,n,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),gs=!1;if(Cn)try{var Ja={};Object.defineProperty(Ja,"passive",{get:function(){gs=!0}}),window.addEventListener("test",Ja,Ja),window.removeEventListener("test",Ja,Ja)}catch{gs=!1}var Zn=null,vs=null,dr=null;function Ff(){if(dr)return dr;var e,t=vs,n=t.length,l,i="value"in Zn?Zn.value:Zn.textContent,s=i.length;for(e=0;e=ti),td=" ",nd=!1;function ld(e,t){switch(e){case"keyup":return kx.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ad(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var la=!1;function Hx(e,t){switch(e){case"compositionend":return ad(t);case"keypress":return t.which!==32?null:(nd=!0,td);case"textInput":return e=t.data,e===td&&nd?null:e;default:return null}}function Lx(e,t){if(la)return e==="compositionend"||!Ss&&ld(e,t)?(e=Ff(),dr=vs=Zn=null,la=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=dd(n)}}function hd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ur(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ur(e.document)}return t}function As(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Zx=Cn&&"documentMode"in document&&11>=document.documentMode,aa=null,Es=null,ii=null,Cs=!1;function vd(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Cs||aa==null||aa!==ur(l)||(l=aa,"selectionStart"in l&&As(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),ii&&ai(ii,l)||(ii=l,l=nc(Es,"onSelect"),0>=h,i-=h,jn=1<<32-bt(t)+i|n<s?s:8;var h=R.T,y={};R.T=y,fo(e,!1,t,n);try{var A=i(),k=R.S;if(k!==null&&k(y,A),A!==null&&typeof A=="object"&&typeof A.then=="function"){var V=tb(A,l);bi(e,t,V,Ht(e))}else bi(e,t,l,Ht(e))}catch($){bi(e,t,{then:function(){},status:"rejected",reason:$},Ht())}finally{Z.p=s,R.T=h}}function rb(){}function oo(e,t,n,l){if(e.tag!==5)throw Error(c(476));var i=pm(e).queue;vm(e,i,t,B,n===null?rb:function(){return ym(e),n(l)})}function pm(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:B},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ym(e){var t=pm(e).next.queue;bi(e,t,{},Ht())}function uo(){return wt(Li)}function xm(){return et().memoizedState}function bm(){return et().memoizedState}function cb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Ht();e=Fn(n);var l=Pn(t,e,n);l!==null&&(Lt(l,t,n),hi(l,t,n)),t={cache:Gs()},e.payload=t;return}t=t.return}}function sb(e,t,n){var l=Ht();n={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Ur(e)?wm(t,n):(n=Rs(e,t,n,l),n!==null&&(Lt(n,e,l),Nm(n,t,l)))}function Sm(e,t,n){var l=Ht();bi(e,t,n,l)}function bi(e,t,n,l){var i={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ur(e))wm(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var h=t.lastRenderedState,y=s(h,n);if(i.hasEagerState=!0,i.eagerState=y,Mt(y,h))return xr(e,t,i,0),Xe===null&&yr(),!1}catch{}finally{}if(n=Rs(e,t,i,l),n!==null)return Lt(n,e,l),Nm(n,t,l),!0}return!1}function fo(e,t,n,l){if(l={lane:2,revertLane:Xo(),action:l,hasEagerState:!1,eagerState:null,next:null},Ur(e)){if(t)throw Error(c(479))}else t=Rs(e,n,l,2),t!==null&&Lt(t,e,2)}function Ur(e){var t=e.alternate;return e===Ee||t!==null&&t===Ee}function wm(e,t){ha=Rr=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Nm(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Of(e,n)}}var Hr={readContext:wt,use:Mr,useCallback:Pe,useContext:Pe,useEffect:Pe,useImperativeHandle:Pe,useLayoutEffect:Pe,useInsertionEffect:Pe,useMemo:Pe,useReducer:Pe,useRef:Pe,useState:Pe,useDebugValue:Pe,useDeferredValue:Pe,useTransition:Pe,useSyncExternalStore:Pe,useId:Pe,useHostTransitionStatus:Pe,useFormState:Pe,useActionState:Pe,useOptimistic:Pe,useMemoCache:Pe,useCacheRefresh:Pe},Am={readContext:wt,use:Mr,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:wt,useEffect:cm,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,kr(4194308,4,fm.bind(null,t,e),n)},useLayoutEffect:function(e,t){return kr(4194308,4,e,t)},useInsertionEffect:function(e,t){kr(4,2,e,t)},useMemo:function(e,t){var n=Tt();t=t===void 0?null:t;var l=e();if(Ul){It(!0);try{e()}finally{It(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=Tt();if(n!==void 0){var i=n(t);if(Ul){It(!0);try{n(t)}finally{It(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=sb.bind(null,Ee,e),[l.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:function(e){e=io(e);var t=e.queue,n=Sm.bind(null,Ee,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:co,useDeferredValue:function(e,t){var n=Tt();return so(n,e,t)},useTransition:function(){var e=io(!1);return e=vm.bind(null,Ee,e.queue,!0,!1),Tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=Ee,i=Tt();if(ke){if(n===void 0)throw Error(c(407));n=n()}else{if(n=t(),Xe===null)throw Error(c(349));(Me&124)!==0||Qd(l,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,cm(Kd.bind(null,l,s,e),[e]),l.flags|=2048,va(9,zr(),Zd.bind(null,l,s,n,t),null),n},useId:function(){var e=Tt(),t=Xe.identifierPrefix;if(ke){var n=_n,l=jn;n=(l&~(1<<32-bt(l)-1)).toString(32)+n,t="«"+t+"R"+n,n=Or++,0ge?(ht=se,se=null):ht=se.sibling;var ze=H(O,se,D[ge],Q);if(ze===null){se===null&&(se=ht);break}e&&se&&ze.alternate===null&&t(O,se),T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze,se=ht}if(ge===D.length)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;gege?(ht=se,se=null):ht=se.sibling;var ml=H(O,se,ze.value,Q);if(ml===null){se===null&&(se=ht);break}e&&se&&ml.alternate===null&&t(O,se),T=s(ml,T,ge),Te===null?ne=ml:Te.sibling=ml,Te=ml,se=ht}if(ze.done)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;!ze.done;ge++,ze=D.next())ze=$(O,ze.value,Q),ze!==null&&(T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return ke&&Rl(O,ge),ne}for(se=l(se);!ze.done;ge++,ze=D.next())ze=L(se,O,ge,ze.value,Q),ze!==null&&(e&&ze.alternate!==null&&se.delete(ze.key===null?ge:ze.key),T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return e&&se.forEach(function(u0){return t(O,u0)}),ke&&Rl(O,ge),ne}function qe(O,T,D,Q){if(typeof D=="object"&&D!==null&&D.type===M&&D.key===null&&(D=D.props.children),typeof D=="object"&&D!==null){switch(D.$$typeof){case w:e:{for(var ne=D.key;T!==null;){if(T.key===ne){if(ne=D.type,ne===M){if(T.tag===7){n(O,T.sibling),Q=i(T,D.props.children),Q.return=O,O=Q;break e}}else if(T.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===X&&Cm(ne)===T.type){n(O,T.sibling),Q=i(T,D.props),wi(Q,D),Q.return=O,O=Q;break e}n(O,T);break}else t(O,T);T=T.sibling}D.type===M?(Q=jl(D.props.children,O.mode,Q,D.key),Q.return=O,O=Q):(Q=Sr(D.type,D.key,D.props,null,O.mode,Q),wi(Q,D),Q.return=O,O=Q)}return h(O);case C:e:{for(ne=D.key;T!==null;){if(T.key===ne)if(T.tag===4&&T.stateNode.containerInfo===D.containerInfo&&T.stateNode.implementation===D.implementation){n(O,T.sibling),Q=i(T,D.children||[]),Q.return=O,O=Q;break e}else{n(O,T);break}else t(O,T);T=T.sibling}Q=Ds(D,O.mode,Q),Q.return=O,O=Q}return h(O);case X:return ne=D._init,D=ne(D._payload),qe(O,T,D,Q)}if(de(D))return pe(O,T,D,Q);if(ue(D)){if(ne=ue(D),typeof ne!="function")throw Error(c(150));return D=ne.call(D),he(O,T,D,Q)}if(typeof D.then=="function")return qe(O,T,Lr(D),Q);if(D.$$typeof===U)return qe(O,T,Er(O,D),Q);Br(O,D)}return typeof D=="string"&&D!==""||typeof D=="number"||typeof D=="bigint"?(D=""+D,T!==null&&T.tag===6?(n(O,T.sibling),Q=i(T,D),Q.return=O,O=Q):(n(O,T),Q=Ms(D,O.mode,Q),Q.return=O,O=Q),h(O)):n(O,T)}return function(O,T,D,Q){try{Si=0;var ne=qe(O,T,D,Q);return pa=null,ne}catch(se){if(se===di||se===Tr)throw se;var Te=Dt(29,se,null,O.mode);return Te.lanes=Q,Te.return=O,Te}finally{}}}var ya=Tm(!0),jm=Tm(!1),Kt=Y(null),hn=null;function Jn(e){var t=e.alternate;P(ct,ct.current&1),P(Kt,e),hn===null&&(t===null||ma.current!==null||t.memoizedState!==null)&&(hn=e)}function _m(e){if(e.tag===22){if(P(ct,ct.current),P(Kt,e),hn===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(hn=e)}}else Wn()}function Wn(){P(ct,ct.current),P(Kt,Kt.current)}function Dn(e){W(Kt),hn===e&&(hn=null),W(ct)}var ct=Y(0);function Gr(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||nu(n)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function mo(e,t,n,l){t=e.memoizedState,n=n(l,t),n=n==null?t:b({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var ho={enqueueSetState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Ht(),l=Fn(n);l.tag=2,t!=null&&(l.callback=t),t=Pn(e,l,n),t!==null&&(Lt(t,e,n),hi(t,e,n))}};function Rm(e,t,n,l,i,s,h){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(l,s,h):t.prototype&&t.prototype.isPureReactComponent?!ai(n,l)||!ai(i,s):!0}function Om(e,t,n,l){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,l),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,l),t.state!==e&&ho.enqueueReplaceState(t,t.state,null)}function Hl(e,t){var n=t;if("ref"in t){n={};for(var l in t)l!=="ref"&&(n[l]=t[l])}if(e=e.defaultProps){n===t&&(n=b({},n));for(var i in e)n[i]===void 0&&(n[i]=e[i])}return n}var qr=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)};function Mm(e){qr(e)}function Dm(e){console.error(e)}function zm(e){qr(e)}function Vr(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(l){setTimeout(function(){throw l})}}function km(e,t,n){try{var l=e.onCaughtError;l(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function go(e,t,n){return n=Fn(n),n.tag=3,n.payload={element:null},n.callback=function(){Vr(e,t)},n}function Um(e){return e=Fn(e),e.tag=3,e}function Hm(e,t,n,l){var i=n.type.getDerivedStateFromError;if(typeof i=="function"){var s=l.value;e.payload=function(){return i(s)},e.callback=function(){km(t,n,l)}}var h=n.stateNode;h!==null&&typeof h.componentDidCatch=="function"&&(e.callback=function(){km(t,n,l),typeof i!="function"&&(il===null?il=new Set([this]):il.add(this));var y=l.stack;this.componentDidCatch(l.value,{componentStack:y!==null?y:""})})}function ub(e,t,n,l,i){if(n.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){if(t=n.alternate,t!==null&&oi(t,n,i,!0),n=Kt.current,n!==null){switch(n.tag){case 13:return hn===null?Bo():n.alternate===null&&Fe===0&&(Fe=3),n.flags&=-257,n.flags|=65536,n.lanes=i,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([l]):t.add(l),qo(e,l,i)),!1;case 22:return n.flags|=65536,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([l])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([l]):n.add(l)),qo(e,l,i)),!1}throw Error(c(435,n.tag))}return qo(e,l,i),Bo(),!1}if(ke)return t=Kt.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,l!==Us&&(e=Error(c(422),{cause:l}),si(Yt(e,n)))):(l!==Us&&(t=Error(c(423),{cause:l}),si(Yt(t,n))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,l=Yt(l,n),i=go(e.stateNode,l,i),Zs(e,i),Fe!==4&&(Fe=2)),!1;var s=Error(c(520),{cause:l});if(s=Yt(s,n),_i===null?_i=[s]:_i.push(s),Fe!==4&&(Fe=2),t===null)return!0;l=Yt(l,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=i&-i,n.lanes|=e,e=go(n.stateNode,l,e),Zs(n,e),!1;case 1:if(t=n.type,s=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||s!==null&&typeof s.componentDidCatch=="function"&&(il===null||!il.has(s))))return n.flags|=65536,i&=-i,n.lanes|=i,i=Um(i),Hm(i,e,n,l),Zs(n,i),!1}n=n.return}while(n!==null);return!1}var Lm=Error(c(461)),dt=!1;function gt(e,t,n,l){t.child=e===null?jm(t,null,n,l):ya(t,e.child,n,l)}function Bm(e,t,n,l,i){n=n.render;var s=t.ref;if("ref"in l){var h={};for(var y in l)y!=="ref"&&(h[y]=l[y])}else h=l;return zl(t),l=Is(e,t,n,h,s,i),y=Js(),e!==null&&!dt?(Ws(e,t,i),zn(e,t,i)):(ke&&y&&zs(t),t.flags|=1,gt(e,t,l,i),t.child)}function Gm(e,t,n,l,i){if(e===null){var s=n.type;return typeof s=="function"&&!Os(s)&&s.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=s,qm(e,t,s,l,i)):(e=Sr(n.type,null,l,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!No(e,i)){var h=s.memoizedProps;if(n=n.compare,n=n!==null?n:ai,n(h,l)&&e.ref===t.ref)return zn(e,t,i)}return t.flags|=1,e=Tn(s,l),e.ref=t.ref,e.return=t,t.child=e}function qm(e,t,n,l,i){if(e!==null){var s=e.memoizedProps;if(ai(s,l)&&e.ref===t.ref)if(dt=!1,t.pendingProps=l=s,No(e,i))(e.flags&131072)!==0&&(dt=!0);else return t.lanes=e.lanes,zn(e,t,i)}return vo(e,t,n,l,i)}function Vm(e,t,n){var l=t.pendingProps,i=l.children,s=e!==null?e.memoizedState:null;if(l.mode==="hidden"){if((t.flags&128)!==0){if(l=s!==null?s.baseLanes|n:n,e!==null){for(i=t.child=e.child,s=0;i!==null;)s=s|i.lanes|i.childLanes,i=i.sibling;t.childLanes=s&~l}else t.childLanes=0,t.child=null;return Ym(e,t,l,n)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Cr(t,s!==null?s.cachePool:null),s!==null?qd(t,s):$s(),_m(t);else return t.lanes=t.childLanes=536870912,Ym(e,t,s!==null?s.baseLanes|n:n,n)}else s!==null?(Cr(t,s.cachePool),qd(t,s),Wn(),t.memoizedState=null):(e!==null&&Cr(t,null),$s(),Wn());return gt(e,t,i,n),t.child}function Ym(e,t,n,l){var i=Vs();return i=i===null?null:{parent:rt._currentValue,pool:i},t.memoizedState={baseLanes:n,cachePool:i},e!==null&&Cr(t,null),$s(),_m(t),e!==null&&oi(e,t,l,!0),null}function Yr(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!="function"&&typeof n!="object")throw Error(c(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function vo(e,t,n,l,i){return zl(t),n=Is(e,t,n,l,void 0,i),l=Js(),e!==null&&!dt?(Ws(e,t,i),zn(e,t,i)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,i),t.child)}function Xm(e,t,n,l,i,s){return zl(t),t.updateQueue=null,n=Yd(t,l,n,i),Vd(e),l=Js(),e!==null&&!dt?(Ws(e,t,s),zn(e,t,s)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,s),t.child)}function Qm(e,t,n,l,i){if(zl(t),t.stateNode===null){var s=sa,h=n.contextType;typeof h=="object"&&h!==null&&(s=wt(h)),s=new n(l,s),t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,s.updater=ho,t.stateNode=s,s._reactInternals=t,s=t.stateNode,s.props=l,s.state=t.memoizedState,s.refs={},Xs(t),h=n.contextType,s.context=typeof h=="object"&&h!==null?wt(h):sa,s.state=t.memoizedState,h=n.getDerivedStateFromProps,typeof h=="function"&&(mo(t,n,h,l),s.state=t.memoizedState),typeof n.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(h=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),h!==s.state&&ho.enqueueReplaceState(s,s.state,null),vi(t,l,s,i),gi(),s.state=t.memoizedState),typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!0}else if(e===null){s=t.stateNode;var y=t.memoizedProps,A=Hl(n,y);s.props=A;var k=s.context,V=n.contextType;h=sa,typeof V=="object"&&V!==null&&(h=wt(V));var $=n.getDerivedStateFromProps;V=typeof $=="function"||typeof s.getSnapshotBeforeUpdate=="function",y=t.pendingProps!==y,V||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(y||k!==h)&&Om(t,s,l,h),$n=!1;var H=t.memoizedState;s.state=H,vi(t,l,s,i),gi(),k=t.memoizedState,y||H!==k||$n?(typeof $=="function"&&(mo(t,n,$,l),k=t.memoizedState),(A=$n||Rm(t,n,A,l,H,k,h))?(V||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount=="function"&&(t.flags|=4194308)):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=k),s.props=l,s.state=k,s.context=h,l=A):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!1)}else{s=t.stateNode,Qs(e,t),h=t.memoizedProps,V=Hl(n,h),s.props=V,$=t.pendingProps,H=s.context,k=n.contextType,A=sa,typeof k=="object"&&k!==null&&(A=wt(k)),y=n.getDerivedStateFromProps,(k=typeof y=="function"||typeof s.getSnapshotBeforeUpdate=="function")||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(h!==$||H!==A)&&Om(t,s,l,A),$n=!1,H=t.memoizedState,s.state=H,vi(t,l,s,i),gi();var L=t.memoizedState;h!==$||H!==L||$n||e!==null&&e.dependencies!==null&&Ar(e.dependencies)?(typeof y=="function"&&(mo(t,n,y,l),L=t.memoizedState),(V=$n||Rm(t,n,V,l,H,L,A)||e!==null&&e.dependencies!==null&&Ar(e.dependencies))?(k||typeof s.UNSAFE_componentWillUpdate!="function"&&typeof s.componentWillUpdate!="function"||(typeof s.componentWillUpdate=="function"&&s.componentWillUpdate(l,L,A),typeof s.UNSAFE_componentWillUpdate=="function"&&s.UNSAFE_componentWillUpdate(l,L,A)),typeof s.componentDidUpdate=="function"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=L),s.props=l,s.state=L,s.context=A,l=V):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),l=!1)}return s=l,Yr(e,t),l=(t.flags&128)!==0,s||l?(s=t.stateNode,n=l&&typeof n.getDerivedStateFromError!="function"?null:s.render(),t.flags|=1,e!==null&&l?(t.child=ya(t,e.child,null,i),t.child=ya(t,null,n,i)):gt(e,t,n,i),t.memoizedState=s.state,e=t.child):e=zn(e,t,i),e}function Zm(e,t,n,l){return ci(),t.flags|=256,gt(e,t,n,l),t.child}var po={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function yo(e){return{baseLanes:e,cachePool:Dd()}}function xo(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=$t),e}function Km(e,t,n){var l=t.pendingProps,i=!1,s=(t.flags&128)!==0,h;if((h=s)||(h=e!==null&&e.memoizedState===null?!1:(ct.current&2)!==0),h&&(i=!0,t.flags&=-129),h=(t.flags&32)!==0,t.flags&=-33,e===null){if(ke){if(i?Jn(t):Wn(),ke){var y=$e,A;if(A=y){e:{for(A=y,y=mn;A.nodeType!==8;){if(!y){y=null;break e}if(A=en(A.nextSibling),A===null){y=null;break e}}y=A}y!==null?(t.memoizedState={dehydrated:y,treeContext:_l!==null?{id:jn,overflow:_n}:null,retryLane:536870912,hydrationErrors:null},A=Dt(18,null,null,0),A.stateNode=y,A.return=t,t.child=A,At=t,$e=null,A=!0):A=!1}A||Ml(t)}if(y=t.memoizedState,y!==null&&(y=y.dehydrated,y!==null))return nu(y)?t.lanes=32:t.lanes=536870912,null;Dn(t)}return y=l.children,l=l.fallback,i?(Wn(),i=t.mode,y=Xr({mode:"hidden",children:y},i),l=jl(l,i,n,null),y.return=t,l.return=t,y.sibling=l,t.child=y,i=t.child,i.memoizedState=yo(n),i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),bo(t,y))}if(A=e.memoizedState,A!==null&&(y=A.dehydrated,y!==null)){if(s)t.flags&256?(Jn(t),t.flags&=-257,t=So(e,t,n)):t.memoizedState!==null?(Wn(),t.child=e.child,t.flags|=128,t=null):(Wn(),i=l.fallback,y=t.mode,l=Xr({mode:"visible",children:l.children},y),i=jl(i,y,n,null),i.flags|=2,l.return=t,i.return=t,l.sibling=i,t.child=l,ya(t,e.child,null,n),l=t.child,l.memoizedState=yo(n),l.childLanes=xo(e,h,n),t.memoizedState=po,t=i);else if(Jn(t),nu(y)){if(h=y.nextSibling&&y.nextSibling.dataset,h)var k=h.dgst;h=k,l=Error(c(419)),l.stack="",l.digest=h,si({value:l,source:null,stack:null}),t=So(e,t,n)}else if(dt||oi(e,t,n,!1),h=(n&e.childLanes)!==0,dt||h){if(h=Xe,h!==null&&(l=n&-n,l=(l&42)!==0?1:ns(l),l=(l&(h.suspendedLanes|n))!==0?0:l,l!==0&&l!==A.retryLane))throw A.retryLane=l,ca(e,l),Lt(h,e,l),Lm;y.data==="$?"||Bo(),t=So(e,t,n)}else y.data==="$?"?(t.flags|=192,t.child=e.child,t=null):(e=A.treeContext,$e=en(y.nextSibling),At=t,ke=!0,Ol=null,mn=!1,e!==null&&(Qt[Zt++]=jn,Qt[Zt++]=_n,Qt[Zt++]=_l,jn=e.id,_n=e.overflow,_l=t),t=bo(t,l.children),t.flags|=4096);return t}return i?(Wn(),i=l.fallback,y=t.mode,A=e.child,k=A.sibling,l=Tn(A,{mode:"hidden",children:l.children}),l.subtreeFlags=A.subtreeFlags&65011712,k!==null?i=Tn(k,i):(i=jl(i,y,n,null),i.flags|=2),i.return=t,l.return=t,l.sibling=i,t.child=l,l=i,i=t.child,y=e.child.memoizedState,y===null?y=yo(n):(A=y.cachePool,A!==null?(k=rt._currentValue,A=A.parent!==k?{parent:k,pool:k}:A):A=Dd(),y={baseLanes:y.baseLanes|n,cachePool:A}),i.memoizedState=y,i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),n=e.child,e=n.sibling,n=Tn(n,{mode:"visible",children:l.children}),n.return=t,n.sibling=null,e!==null&&(h=t.deletions,h===null?(t.deletions=[e],t.flags|=16):h.push(e)),t.child=n,t.memoizedState=null,n)}function bo(e,t){return t=Xr({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function Xr(e,t){return e=Dt(22,e,null,t),e.lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function So(e,t,n){return ya(t,e.child,null,n),e=bo(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function $m(e,t,n){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Ls(e.return,t,n)}function wo(e,t,n,l,i){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:n,tailMode:i}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=l,s.tail=n,s.tailMode=i)}function Fm(e,t,n){var l=t.pendingProps,i=l.revealOrder,s=l.tail;if(gt(e,t,l.children,n),l=ct.current,(l&2)!==0)l=l&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&$m(e,n,t);else if(e.tag===19)$m(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}l&=1}switch(P(ct,l),i){case"forwards":for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&Gr(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),wo(t,!1,i,n,s);break;case"backwards":for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&Gr(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}wo(t,!0,n,null,s);break;case"together":wo(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function zn(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),al|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(oi(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(c(153));if(t.child!==null){for(e=t.child,n=Tn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Tn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function No(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Ar(e)))}function fb(e,t,n){switch(t.tag){case 3:oe(t,t.stateNode.containerInfo),Kn(t,rt,e.memoizedState.cache),ci();break;case 27:case 5:_e(t);break;case 4:oe(t,t.stateNode.containerInfo);break;case 10:Kn(t,t.type,t.memoizedProps.value);break;case 13:var l=t.memoizedState;if(l!==null)return l.dehydrated!==null?(Jn(t),t.flags|=128,null):(n&t.child.childLanes)!==0?Km(e,t,n):(Jn(t),e=zn(e,t,n),e!==null?e.sibling:null);Jn(t);break;case 19:var i=(e.flags&128)!==0;if(l=(n&t.childLanes)!==0,l||(oi(e,t,n,!1),l=(n&t.childLanes)!==0),i){if(l)return Fm(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),P(ct,ct.current),l)break;return null;case 22:case 23:return t.lanes=0,Vm(e,t,n);case 24:Kn(t,rt,e.memoizedState.cache)}return zn(e,t,n)}function Pm(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)dt=!0;else{if(!No(e,n)&&(t.flags&128)===0)return dt=!1,fb(e,t,n);dt=(e.flags&131072)!==0}else dt=!1,ke&&(t.flags&1048576)!==0&&Cd(t,Nr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var l=t.elementType,i=l._init;if(l=i(l._payload),t.type=l,typeof l=="function")Os(l)?(e=Hl(l,e),t.tag=1,t=Qm(null,t,l,e,n)):(t.tag=0,t=vo(null,t,l,e,n));else{if(l!=null){if(i=l.$$typeof,i===q){t.tag=11,t=Bm(null,t,l,e,n);break e}else if(i===F){t.tag=14,t=Gm(null,t,l,e,n);break e}}throw t=ve(l)||l,Error(c(306,t,""))}}return t;case 0:return vo(e,t,t.type,t.pendingProps,n);case 1:return l=t.type,i=Hl(l,t.pendingProps),Qm(e,t,l,i,n);case 3:e:{if(oe(t,t.stateNode.containerInfo),e===null)throw Error(c(387));l=t.pendingProps;var s=t.memoizedState;i=s.element,Qs(e,t),vi(t,l,null,n);var h=t.memoizedState;if(l=h.cache,Kn(t,rt,l),l!==s.cache&&Bs(t,[rt],n,!0),gi(),l=h.element,s.isDehydrated)if(s={element:l,isDehydrated:!1,cache:h.cache},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){t=Zm(e,t,l,n);break e}else if(l!==i){i=Yt(Error(c(424)),t),si(i),t=Zm(e,t,l,n);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName==="HTML"?e.ownerDocument.body:e}for($e=en(e.firstChild),At=t,ke=!0,Ol=null,mn=!0,n=jm(t,null,l,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(ci(),l===i){t=zn(e,t,n);break e}gt(e,t,l,n)}t=t.child}return t;case 26:return Yr(e,t),e===null?(n=eg(t.type,null,t.pendingProps,null))?t.memoizedState=n:ke||(n=t.type,e=t.pendingProps,l=ac(ce.current).createElement(n),l[St]=t,l[Et]=e,pt(l,n,e),ft(l),t.stateNode=l):t.memoizedState=eg(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return _e(t),e===null&&ke&&(l=t.stateNode=Ih(t.type,t.pendingProps,ce.current),At=t,mn=!0,i=$e,sl(t.type)?(lu=i,$e=en(l.firstChild)):$e=i),gt(e,t,t.pendingProps.children,n),Yr(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&ke&&((i=l=$e)&&(l=Bb(l,t.type,t.pendingProps,mn),l!==null?(t.stateNode=l,At=t,$e=en(l.firstChild),mn=!1,i=!0):i=!1),i||Ml(t)),_e(t),i=t.type,s=t.pendingProps,h=e!==null?e.memoizedProps:null,l=s.children,Wo(i,s)?l=null:h!==null&&Wo(i,h)&&(t.flags|=32),t.memoizedState!==null&&(i=Is(e,t,lb,null,null,n),Li._currentValue=i),Yr(e,t),gt(e,t,l,n),t.child;case 6:return e===null&&ke&&((e=n=$e)&&(n=Gb(n,t.pendingProps,mn),n!==null?(t.stateNode=n,At=t,$e=null,e=!0):e=!1),e||Ml(t)),null;case 13:return Km(e,t,n);case 4:return oe(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=ya(t,null,l,n):gt(e,t,l,n),t.child;case 11:return Bm(e,t,t.type,t.pendingProps,n);case 7:return gt(e,t,t.pendingProps,n),t.child;case 8:return gt(e,t,t.pendingProps.children,n),t.child;case 12:return gt(e,t,t.pendingProps.children,n),t.child;case 10:return l=t.pendingProps,Kn(t,t.type,l.value),gt(e,t,l.children,n),t.child;case 9:return i=t.type._context,l=t.pendingProps.children,zl(t),i=wt(i),l=l(i),t.flags|=1,gt(e,t,l,n),t.child;case 14:return Gm(e,t,t.type,t.pendingProps,n);case 15:return qm(e,t,t.type,t.pendingProps,n);case 19:return Fm(e,t,n);case 31:return l=t.pendingProps,n=t.mode,l={mode:l.mode,children:l.children},e===null?(n=Xr(l,n),n.ref=t.ref,t.child=n,n.return=t,t=n):(n=Tn(e.child,l),n.ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Vm(e,t,n);case 24:return zl(t),l=wt(rt),e===null?(i=Vs(),i===null&&(i=Xe,s=Gs(),i.pooledCache=s,s.refCount++,s!==null&&(i.pooledCacheLanes|=n),i=s),t.memoizedState={parent:l,cache:i},Xs(t),Kn(t,rt,i)):((e.lanes&n)!==0&&(Qs(e,t),vi(t,null,null,n),gi()),i=e.memoizedState,s=t.memoizedState,i.parent!==l?(i={parent:l,cache:l},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),Kn(t,rt,l)):(l=s.cache,Kn(t,rt,l),l!==i.cache&&Bs(t,[rt],n,!0))),gt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(c(156,t.tag))}function kn(e){e.flags|=4}function Im(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!ig(t)){if(t=Kt.current,t!==null&&((Me&4194048)===Me?hn!==null:(Me&62914560)!==Me&&(Me&536870912)===0||t!==hn))throw mi=Ys,zd;e.flags|=8192}}function Qr(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?_f():536870912,e.lanes|=t,wa|=t)}function Ni(e,t){if(!ke)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var l=null;n!==null;)n.alternate!==null&&(l=n),n=n.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function Ke(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,l=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags&65011712,l|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags,l|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=l,e.childLanes=n,t}function db(e,t,n){var l=t.pendingProps;switch(ks(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ke(t),null;case 1:return Ke(t),null;case 3:return n=t.stateNode,l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),On(rt),De(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ri(t)?kn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,_d())),Ke(t),null;case 26:return n=t.memoizedState,e===null?(kn(t),n!==null?(Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217)):n?n!==e.memoizedState?(kn(t),Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217):(e.memoizedProps!==l&&kn(t),Ke(t),t.flags&=-16777217),null;case 27:Ne(t),n=ce.current;var i=t.type;if(e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}e=I.current,ri(t)?Td(t):(e=Ih(i,l,n),t.stateNode=e,kn(t))}return Ke(t),null;case 5:if(Ne(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}if(e=I.current,ri(t))Td(t);else{switch(i=ac(ce.current),e){case 1:e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":e=i.createElement("div"),e.innerHTML=" + + + +
+ + diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx new file mode 100644 index 0000000..1befdd7 --- /dev/null +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -0,0 +1,424 @@ +import React, { useState } from "react"; +import { DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Plus, Minus } from "lucide-react"; +import type { + ReproInventoryEntry, + LevelEnum, + PlatformEnum, + CourseLengthEnum, + ContentFormatEnum, + DeliveryEnum, + LanguageEnum, + ProgrammingLanguageEnum, + NeuroimagingSoftwareEnum, + ImagingModalityEnum, + OpenDatasetEnum, + QuadrantsEnum, +} from "@/types/reproinventory"; + +const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; + +const levelOptions: LevelEnum[] = ["Beginner", "Intermediate", "Advanced", "NA"]; +const platformOptions: PlatformEnum[] = ["Mac", "Windows", "Linux", "Docker", "Jupyter", "NA"]; +const courseLengthOptions: CourseLengthEnum[] = ["<1 hr", "1-4 hrs", "1 day", "1-3 days", "1 week", "1+ weeks", "NA"]; +const instructionMediumOptions: ContentFormatEnum[] = ["Hands-on tutorial / notebooks", "lecture", "video", "notes", "blog post", "reference", "slides", "website", "outline", "meta-resource", "NA"]; +const deliveryOptions: DeliveryEnum[] = ["self-paced", "instructor", "Hybrid", "Discussion needed"]; +const languageOptions: LanguageEnum[] = ["English", "French", "Spanish", "Chinese", "German", "English, French", "English, German", "Other", "NA"]; +const programmingLanguageOptions: ProgrammingLanguageEnum[] = ["Python", "R", "shell scripting", "Matlab", "Git", "NA"]; +const neuroimagingSoftwareOptions: NeuroimagingSoftwareEnum[] = ["AFNI", "SPM", "FSL", "Freesurfer", "Python", "Multiple", "NA"]; +const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Functional", "Task-based", "Resting-State", "EEG", "Behavioral", "MEG", "MRI", "NA"]; +const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; +const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; + +function formatAsYaml(material: ReproInventoryEntry): string { + const lines: string[] = []; + + const addScalar = (key: string, value: string | number | boolean | undefined | null) => { + if (value !== undefined && value !== null && value !== "") { + lines.push(`${key}: ${value}`); + } + }; + + const addList = (key: string, values: string[] | undefined | null) => { + if (values && values.length > 0) { + lines.push(`${key}:`); + values.forEach((v) => lines.push(` - ${v}`)); + } + }; + + lines.push("id: TBD"); + addScalar("course_name", material.course_name); + addScalar("url", material.url); + addList("level", material.level); + addList("platform", material.platform); + addList("keywords", material.keywords); + addScalar("course_length", material.course_length); + addList("instruction_medium", material.instruction_medium); + addList("delivery", material.delivery); + addList("language", material.language); + addList("programming_language", material.programming_language); + addList("neuroimaging_software", material.neuroimaging_software); + addList("imaging_modality", material.imaging_modality); + addScalar("open_dataset", material.open_dataset); + addScalar("review", material.review); + addScalar("notes", material.notes); + addList("quadrants", material.quadrants); + + return lines.join("\n"); +} + +function openGitHubIssue(material: ReproInventoryEntry) { + const yaml = formatAsYaml(material); + const title = `Add material: ${material.course_name || "New training material"}`; + const body = + `## New Training Material Submission\n\n` + + `Please review the following training material for addition to ReproInventory.\n\n` + + `\`\`\`yaml\n${yaml}\n\`\`\``; + const url = `${GITHUB_REPO}/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + window.open(url, "_blank"); +} + +interface AddMaterialDialogProps { + onClose: () => void; +} + +const AddMaterialDialog: React.FC = ({ onClose }) => { + const [material, setMaterial] = useState({ + id: "", + course_name: "", + url: "", + level: [], + platform: [], + keywords: [], + course_length: undefined, + instruction_medium: [], + delivery: [], + language: [], + programming_language: [], + neuroimaging_software: [], + imaging_modality: [], + open_dataset: undefined, + review: "", + notes: "", + quadrants: [], + }); + + const handleChange = (field: keyof ReproInventoryEntry, value: any) => { + setMaterial((prev) => ({ ...prev, [field]: value })); + }; + + const handleMultiSelectChange = (field: keyof ReproInventoryEntry, option: string, checked: boolean) => { + const current = (material[field] || []) as string[]; + handleChange(field, checked ? [...current, option] : current.filter((v) => v !== option)); + }; + + const handleArrayItemChange = (field: keyof ReproInventoryEntry, index: number, value: string) => { + const arr = [...((material[field] || []) as string[])]; + arr[index] = value; + handleChange(field, arr); + }; + + const handleAddArrayItem = (field: keyof ReproInventoryEntry) => { + handleChange(field, [...((material[field] || []) as string[]), ""]); + }; + + const handleRemoveArrayItem = (field: keyof ReproInventoryEntry, index: number) => { + handleChange(field, ((material[field] || []) as string[]).filter((_, i) => i !== index)); + }; + + const handleSubmit = () => { + if (!material.course_name?.trim()) { + alert("Please provide a course name."); + return; + } + openGitHubIssue(material); + onClose(); + }; + + return ( + + + Add New Training Material + + Fill in the details below. Submitting will open a pre-filled GitHub issue for maintainer review. + Only course name is required. + + + +
+ {/* Essential fields */} +
+ + handleChange("course_name", e.target.value)} + className="col-span-3" + placeholder="Enter course name" + /> +
+ +
+ + handleChange("url", e.target.value)} + className="col-span-3" + placeholder="https://example.com" + /> +
+ +
+ + handleChange("review", e.target.value)} + className="col-span-3" + placeholder="Brief description of the material" + /> +
+ + {/* Keywords */} +
+ +
+ {(material.keywords || []).map((keyword, index) => ( +
+ handleArrayItemChange("keywords", index, e.target.value)} + className="flex-grow" + placeholder="Enter keyword" + /> + +
+ ))} + +
+
+ + {/* Course Length */} +
+ + +
+ + {/* Multi-select grid */} +
+ {/* Level */} +
+ +
+ {levelOptions.map((option) => ( +
+ handleMultiSelectChange("level", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Platform */} +
+ +
+ {platformOptions.map((option) => ( +
+ handleMultiSelectChange("platform", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Instruction Medium */} +
+ +
+ {instructionMediumOptions.map((option) => ( +
+ handleMultiSelectChange("instruction_medium", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Delivery */} +
+ +
+ {deliveryOptions.map((option) => ( +
+ handleMultiSelectChange("delivery", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Language */} +
+ +
+ {languageOptions.map((option) => ( +
+ handleMultiSelectChange("language", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Programming Language */} +
+ +
+ {programmingLanguageOptions.map((option) => ( +
+ handleMultiSelectChange("programming_language", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Neuroimaging Software */} +
+ +
+ {neuroimagingSoftwareOptions.map((option) => ( +
+ handleMultiSelectChange("neuroimaging_software", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Imaging Modality */} +
+ +
+ {imagingModalityOptions.map((option) => ( +
+ handleMultiSelectChange("imaging_modality", option, checked as boolean)} + /> + +
+ ))} +
+
+
+ + {/* Open Dataset */} +
+ + +
+ + {/* Quadrants */} +
+ +
+ {quadrantsOptions.map((option) => ( +
+ handleMultiSelectChange("quadrants", option, checked as boolean)} + /> + +
+ ))} +
+
+ + {/* Notes */} +
+ + handleChange("notes", e.target.value)} + className="col-span-3" + placeholder="Additional notes" + /> +
+
+ +
+ + +
+
+ ); +}; + +export default AddMaterialDialog; diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index bef5202..360a3c3 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -8,3 +8,4 @@ createRoot(document.getElementById('root')!).render( , ) + diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index ec23847..ab1a211 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -13,6 +13,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog" // Adjusted import import EditMaterialDialog from "@/components/EditMaterialDialog"; // Import the new component +import AddMaterialDialog from "@/components/AddMaterialDialog"; import { type ReproInventoryEntry, type LevelEnum, @@ -34,6 +35,7 @@ export default function TrainingMaterialsBrowser() { const [error, setError] = useState(null) const [selectedRawMaterial, setSelectedRawMaterial] = useState(null) const [editingMaterial, setEditingMaterial] = useState(null) + const [showAddMaterial, setShowAddMaterial] = useState(false) useEffect(() => { const fetchData = async () => { @@ -590,6 +592,12 @@ export default function TrainingMaterialsBrowser() {

Results for "{searchQuery}"

)} + + + + + setShowAddMaterial(false)} /> +
From d8ef4931b12b70f9150aca014d5b2ff2ee747c8f Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Sun, 22 Mar 2026 17:43:11 -0400 Subject: [PATCH 02/14] Add the edit and delete button --- frontend/dist/assets/index-Bq7rTnOb.css | 1 - .../{index-CRvjnaR5.js => index-COgKbmi3.js} | 79 +++++++++++-------- frontend/dist/assets/index-Cw0xPReC.css | 1 + frontend/dist/data/reproinventory_data.json | 4 +- frontend/dist/index.html | 4 +- .../src/components/EditMaterialDialog.tsx | 65 ++++++++++++++- frontend/src/training-materials-browser.tsx | 24 +++--- 7 files changed, 125 insertions(+), 53 deletions(-) delete mode 100644 frontend/dist/assets/index-Bq7rTnOb.css rename frontend/dist/assets/{index-CRvjnaR5.js => index-COgKbmi3.js} (53%) create mode 100644 frontend/dist/assets/index-Cw0xPReC.css diff --git a/frontend/dist/assets/index-Bq7rTnOb.css b/frontend/dist/assets/index-Bq7rTnOb.css deleted file mode 100644 index 049cea5..0000000 --- a/frontend/dist/assets/index-Bq7rTnOb.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.10 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-blue-500:oklch(62.3% .214 259.815);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-900:oklch(21% .006 285.885);--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.right-4{right:calc(var(--spacing)*4)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-16{margin-top:calc(var(--spacing)*16)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-24{height:calc(var(--spacing)*24)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-px{height:1px}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.min-h-screen{min-height:100vh}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-8{width:calc(var(--spacing)*8)}.w-24{width:calc(var(--spacing)*24)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.cursor-default{cursor:default}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background)80%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-1{padding:calc(var(--spacing)*1)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-\[3px\]{padding:3px}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-blue-500{color:var(--color-blue-500)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.text-zinc-50{color:var(--color-zinc-50)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up var(--tw-animation-duration,var(--tw-duration,.2s))ease-out}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: 50% }.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48% }.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down var(--tw-animation-duration,var(--tw-duration,.2s))ease-out}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: 50% }.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48% }@media (min-width:40rem){.sm\:max-w-\[800px\]{max-width:800px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:64rem){.lg\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}}@media (min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.dark\:data-\[state\=checked\]\:bg-primary:is(.dark *)[data-state=checked]{background-color:var(--primary)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}@media (hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary)90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))))}}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,auto))))}to{height:0}} diff --git a/frontend/dist/assets/index-CRvjnaR5.js b/frontend/dist/assets/index-COgKbmi3.js similarity index 53% rename from frontend/dist/assets/index-CRvjnaR5.js rename to frontend/dist/assets/index-COgKbmi3.js index a1fd1e2..93f1fc4 100644 --- a/frontend/dist/assets/index-CRvjnaR5.js +++ b/frontend/dist/assets/index-COgKbmi3.js @@ -1,4 +1,4 @@ -function f0(a,r){for(var o=0;oc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const g of d.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&c(g)}).observe(document,{childList:!0,subtree:!0});function o(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=o(f);fetch(f.href,d)}})();function cv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var mu={exports:{}},Yi={};/** +function f0(a,r){for(var s=0;sc[f]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const v of d.addedNodes)v.tagName==="LINK"&&v.rel==="modulepreload"&&c(v)}).observe(document,{childList:!0,subtree:!0});function s(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=s(f);fetch(f.href,d)}})();function cv(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var mu={exports:{}},Yi={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ function f0(a,r){for(var o=0;o>>1,E=R[re];if(0>>1;ref(P,B))If(ye,P)?(R[re]=ye,R[I]=B,re=I):(R[re]=P,R[W]=B,re=W);else if(If(ye,B))R[re]=ye,R[I]=B,re=I;else break e}}return Z}function f(R,Z){var B=R.sortIndex-Z.sortIndex;return B!==0?B:R.id-Z.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var g=Date,v=g.now();a.unstable_now=function(){return g.now()-v}}var x=[],m=[],b=1,p=null,w=3,C=!1,M=!1,N=!1,j=!1,z=typeof setTimeout=="function"?setTimeout:null,_=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function q(R){for(var Z=o(m);Z!==null;){if(Z.callback===null)c(m);else if(Z.startTime<=R)c(m),Z.sortIndex=Z.expirationTime,r(x,Z);else break;Z=o(m)}}function G(R){if(N=!1,q(R),!M)if(o(x)!==null)M=!0,J||(J=!0,ue());else{var Z=o(m);Z!==null&&de(G,Z.startTime-R)}}var J=!1,F=-1,X=5,ie=-1;function me(){return j?!0:!(a.unstable_now()-ieR&&me());){var re=p.callback;if(typeof re=="function"){p.callback=null,w=p.priorityLevel;var E=re(p.expirationTime<=R);if(R=a.unstable_now(),typeof E=="function"){p.callback=E,q(R),Z=!0;break t}p===o(x)&&c(x),q(R)}else c(x);p=o(x)}if(p!==null)Z=!0;else{var Y=o(m);Y!==null&&de(G,Y.startTime-R),Z=!1}}break e}finally{p=null,w=B,C=!1}Z=void 0}}finally{Z?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(R,Z){F=z(function(){R(a.unstable_now())},Z)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(R){R.callback=null},a.unstable_forceFrameRate=function(R){0>R||125re?(R.sortIndex=B,r(m,R),o(x)===null&&R===o(m)&&(N?(_(F),F=-1):N=!0,de(G,B-re))):(R.sortIndex=E,r(x,R),M||C||(M=!0,J||(J=!0,ue()))),R},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(R){var Z=w;return function(){var B=w;w=Z;try{return R.apply(this,arguments)}finally{w=B}}}}(pu)),pu}var wg;function v0(){return wg||(wg=1,vu.exports=g0()),vu.exports}var yu={exports:{}},Nt={};/** + */var Sg;function g0(){return Sg||(Sg=1,function(a){function r(R,K){var B=R.length;R.push(K);e:for(;0>>1,A=R[re];if(0>>1;ref(P,B))If(ye,P)?(R[re]=ye,R[I]=B,re=I):(R[re]=P,R[W]=B,re=W);else if(If(ye,B))R[re]=ye,R[I]=B,re=I;else break e}}return K}function f(R,K){var B=R.sortIndex-K.sortIndex;return B!==0?B:R.id-K.id}if(a.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;a.unstable_now=function(){return d.now()}}else{var v=Date,p=v.now();a.unstable_now=function(){return v.now()-p}}var x=[],m=[],g=1,b=null,w=3,_=!1,M=!1,N=!1,T=!1,z=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;function q(R){for(var K=s(m);K!==null;){if(K.callback===null)c(m);else if(K.startTime<=R)c(m),K.sortIndex=K.expirationTime,r(x,K);else break;K=s(m)}}function G(R){if(N=!1,q(R),!M)if(s(x)!==null)M=!0,J||(J=!0,ue());else{var K=s(m);K!==null&&de(G,K.startTime-R)}}var J=!1,F=-1,X=5,ie=-1;function me(){return T?!0:!(a.unstable_now()-ieR&&me());){var re=b.callback;if(typeof re=="function"){b.callback=null,w=b.priorityLevel;var A=re(b.expirationTime<=R);if(R=a.unstable_now(),typeof A=="function"){b.callback=A,q(R),K=!0;break t}b===s(x)&&c(x),q(R)}else c(x);b=s(x)}if(b!==null)K=!0;else{var Y=s(m);Y!==null&&de(G,Y.startTime-R),K=!1}}break e}finally{b=null,w=B,_=!1}K=void 0}}finally{K?ue():J=!1}}}var ue;if(typeof U=="function")ue=function(){U(xe)};else if(typeof MessageChannel<"u"){var be=new MessageChannel,ve=be.port2;be.port1.onmessage=xe,ue=function(){ve.postMessage(null)}}else ue=function(){z(xe,0)};function de(R,K){F=z(function(){R(a.unstable_now())},K)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(R){R.callback=null},a.unstable_forceFrameRate=function(R){0>R||125re?(R.sortIndex=B,r(m,R),s(x)===null&&R===s(m)&&(N?(j(F),F=-1):N=!0,de(G,B-re))):(R.sortIndex=A,r(x,R),M||_||(M=!0,J||(J=!0,ue()))),R},a.unstable_shouldYield=me,a.unstable_wrapCallback=function(R){var K=w;return function(){var B=w;w=K;try{return R.apply(this,arguments)}finally{w=B}}}}(pu)),pu}var wg;function v0(){return wg||(wg=1,vu.exports=g0()),vu.exports}var yu={exports:{}},Nt={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ function f0(a,r){for(var o=0;o"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),yu.exports=p0(),yu.exports}/** + */var Ng;function p0(){if(Ng)return Nt;Ng=1;var a=Ju();function r(x){var m="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),yu.exports=p0(),yu.exports}/** * @license React * react-dom-client.production.js * @@ -38,40 +38,40 @@ function f0(a,r){for(var o=0;oE||(e.current=re[E],re[E]=null,E--)}function P(e,t){E++,re[E]=e.current,e.current=t}var I=Y(null),ye=Y(null),ce=Y(null),ee=Y(null);function oe(e,t){switch(P(ce,t),P(ye,e),P(I,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Qh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Qh(t),e=Zh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}W(I),P(I,e)}function De(){W(I),W(ye),W(ce)}function _e(e){e.memoizedState!==null&&P(ee,e);var t=I.current,n=Zh(t,e.type);t!==n&&(P(ye,e),P(I,n))}function Ne(e){ye.current===e&&(W(I),W(ye)),ee.current===e&&(W(ee),Li._currentValue=B)}var Ae=Object.prototype.hasOwnProperty,nt=a.unstable_scheduleCallback,xt=a.unstable_cancelCallback,An=a.unstable_shouldYield,Pt=a.unstable_requestPaint,lt=a.unstable_now,Za=a.unstable_getCurrentPriorityLevel,K=a.unstable_ImmediatePriority,fe=a.unstable_UserBlockingPriority,Ot=a.unstable_NormalPriority,un=a.unstable_LowPriority,fn=a.unstable_IdlePriority,wl=a.log,ut=a.unstable_setDisableYieldValue,dn=null,at=null;function It(e){if(typeof wl=="function"&&ut(e),at&&typeof at.setStrictMode=="function")try{at.setStrictMode(dn,e)}catch{}}var bt=Math.clz32?Math.clz32:Iy,lr=Math.log,it=Math.LN2;function Iy(e){return e>>>=0,e===0?32:31-(lr(e)/it|0)|0}var ar=256,ir=4194304;function Nl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function rr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,s=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~s,l!==0?i=Nl(l):(h&=y,h!==0?i=Nl(h):n||(n=y&~e,n!==0&&(i=Nl(n))))):(y=l&~s,y!==0?i=Nl(y):h!==0?i=Nl(h):n||(n=l&~e,n!==0&&(i=Nl(n)))),i===0?0:t!==0&&t!==i&&(t&s)===0&&(s=i&-i,n=t&-t,s>=n||s===32&&(n&4194048)!==0)?t:i}function Ka(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Jy(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function jf(){var e=ar;return ar<<=1,(ar&4194048)===0&&(ar=256),e}function _f(){var e=ir;return ir<<=1,(ir&62914560)===0&&(ir=4194304),e}function ts(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $a(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Wy(e,t,n,l,i,s){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,A=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0A||(e.current=re[A],re[A]=null,A--)}function P(e,t){A++,re[A]=e.current,e.current=t}var I=Y(null),ye=Y(null),ce=Y(null),ee=Y(null);function oe(e,t){switch(P(ce,t),P(ye,e),P(I,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Qh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Qh(t),e=Zh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}W(I),P(I,e)}function De(){W(I),W(ye),W(ce)}function je(e){e.memoizedState!==null&&P(ee,e);var t=I.current,n=Zh(t,e.type);t!==n&&(P(ye,e),P(I,n))}function Ne(e){ye.current===e&&(W(I),W(ye)),ee.current===e&&(W(ee),Li._currentValue=B)}var Ee=Object.prototype.hasOwnProperty,lt=a.unstable_scheduleCallback,xt=a.unstable_cancelCallback,En=a.unstable_shouldYield,Pt=a.unstable_requestPaint,at=a.unstable_now,Za=a.unstable_getCurrentPriorityLevel,Q=a.unstable_ImmediatePriority,fe=a.unstable_UserBlockingPriority,Ot=a.unstable_NormalPriority,un=a.unstable_LowPriority,fn=a.unstable_IdlePriority,wl=a.log,ht=a.unstable_setDisableYieldValue,dn=null,ot=null;function It(e){if(typeof wl=="function"&&ht(e),ot&&typeof ot.setStrictMode=="function")try{ot.setStrictMode(dn,e)}catch{}}var bt=Math.clz32?Math.clz32:Iy,lr=Math.log,it=Math.LN2;function Iy(e){return e>>>=0,e===0?32:31-(lr(e)/it|0)|0}var ar=256,ir=4194304;function Nl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function rr(e,t,n){var l=e.pendingLanes;if(l===0)return 0;var i=0,o=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var y=l&134217727;return y!==0?(l=y&~o,l!==0?i=Nl(l):(h&=y,h!==0?i=Nl(h):n||(n=y&~e,n!==0&&(i=Nl(n))))):(y=l&~o,y!==0?i=Nl(y):h!==0?i=Nl(h):n||(n=l&~e,n!==0&&(i=Nl(n)))),i===0?0:t!==0&&t!==i&&(t&o)===0&&(o=i&-i,n=t&-t,o>=n||o===32&&(n&4194048)!==0)?t:i}function Ka(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Jy(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function _f(){var e=ar;return ar<<=1,(ar&4194048)===0&&(ar=256),e}function jf(){var e=ir;return ir<<=1,(ir&62914560)===0&&(ir=4194304),e}function ts(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $a(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Wy(e,t,n,l,i,o){var h=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,E=e.expirationTimes,k=e.hiddenUpdates;for(n=h&~n;0)":-1i||A[l]!==k[i]){var V=` -`+A[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{cs=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function ix(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return ss(e.type,!1);case 11:return ss(e.type.render,!1);case 1:return ss(e.type,!0);case 31:return Jl("Activity");default:return""}}function Bf(e){try{var t="";do t+=ix(e),e=e.return;while(e);return t}catch(n){return` +`);for(i=l=0;li||E[l]!==k[i]){var V=` +`+E[l].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=l&&0<=i);break}}}finally{cs=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Jl(n):""}function ix(e){switch(e.tag){case 26:case 27:case 5:return Jl(e.type);case 16:return Jl("Lazy");case 13:return Jl("Suspense");case 19:return Jl("SuspenseList");case 0:case 15:return ss(e.type,!1);case 11:return ss(e.type.render,!1);case 1:return ss(e.type,!0);case 31:return Jl("Activity");default:return""}}function Bf(e){try{var t="";do t+=ix(e),e=e.return;while(e);return t}catch(n){return` Error generating stack: `+n.message+` -`+n.stack}}function qt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Gf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function rx(e){var t=Gf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),l=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(h){l=""+h,s.call(this,h)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return l},setValue:function(h){l=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function or(e){e._valueTracker||(e._valueTracker=rx(e))}function qf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),l="";return e&&(l=Gf(e)?e.checked?"true":"false":e.value),e=l,e!==n?(t.setValue(e),!0):!1}function ur(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var cx=/[\n"\\]/g;function Vt(e){return e.replace(cx,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function os(e,t,n,l,i,s,h,y){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+qt(t)):e.value!==""+qt(t)&&(e.value=""+qt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?us(e,h,qt(t)):n!=null?us(e,h,qt(n)):l!=null&&e.removeAttribute("value"),i==null&&s!=null&&(e.defaultChecked=!!s),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.name=""+qt(y):e.removeAttribute("name")}function Vf(e,t,n,l,i,s,h,y){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||n!=null){if(!(s!=="submit"&&s!=="reset"||t!=null))return;n=n!=null?""+qt(n):"",t=t!=null?""+qt(t):n,y||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=y?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h)}function us(e,t,n){t==="number"&&ur(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Wl(e,t,n,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),gs=!1;if(Cn)try{var Ja={};Object.defineProperty(Ja,"passive",{get:function(){gs=!0}}),window.addEventListener("test",Ja,Ja),window.removeEventListener("test",Ja,Ja)}catch{gs=!1}var Zn=null,vs=null,dr=null;function Ff(){if(dr)return dr;var e,t=vs,n=t.length,l,i="value"in Zn?Zn.value:Zn.textContent,s=i.length;for(e=0;e=ti),td=" ",nd=!1;function ld(e,t){switch(e){case"keyup":return kx.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ad(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var la=!1;function Hx(e,t){switch(e){case"compositionend":return ad(t);case"keypress":return t.which!==32?null:(nd=!0,td);case"textInput":return e=t.data,e===td&&nd?null:e;default:return null}}function Lx(e,t){if(la)return e==="compositionend"||!Ss&&ld(e,t)?(e=Ff(),dr=vs=Zn=null,la=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=l}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=dd(n)}}function hd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ur(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ur(e.document)}return t}function As(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Zx=Cn&&"documentMode"in document&&11>=document.documentMode,aa=null,Es=null,ii=null,Cs=!1;function vd(e,t,n){var l=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Cs||aa==null||aa!==ur(l)||(l=aa,"selectionStart"in l&&As(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),ii&&ai(ii,l)||(ii=l,l=nc(Es,"onSelect"),0>=h,i-=h,jn=1<<32-bt(t)+i|n<s?s:8;var h=R.T,y={};R.T=y,fo(e,!1,t,n);try{var A=i(),k=R.S;if(k!==null&&k(y,A),A!==null&&typeof A=="object"&&typeof A.then=="function"){var V=tb(A,l);bi(e,t,V,Ht(e))}else bi(e,t,l,Ht(e))}catch($){bi(e,t,{then:function(){},status:"rejected",reason:$},Ht())}finally{Z.p=s,R.T=h}}function rb(){}function oo(e,t,n,l){if(e.tag!==5)throw Error(c(476));var i=pm(e).queue;vm(e,i,t,B,n===null?rb:function(){return ym(e),n(l)})}function pm(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:B,baseState:B,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:B},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Mn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ym(e){var t=pm(e).next.queue;bi(e,t,{},Ht())}function uo(){return wt(Li)}function xm(){return et().memoizedState}function bm(){return et().memoizedState}function cb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Ht();e=Fn(n);var l=Pn(t,e,n);l!==null&&(Lt(l,t,n),hi(l,t,n)),t={cache:Gs()},e.payload=t;return}t=t.return}}function sb(e,t,n){var l=Ht();n={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Ur(e)?wm(t,n):(n=Rs(e,t,n,l),n!==null&&(Lt(n,e,l),Nm(n,t,l)))}function Sm(e,t,n){var l=Ht();bi(e,t,n,l)}function bi(e,t,n,l){var i={lane:l,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ur(e))wm(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var h=t.lastRenderedState,y=s(h,n);if(i.hasEagerState=!0,i.eagerState=y,Mt(y,h))return xr(e,t,i,0),Xe===null&&yr(),!1}catch{}finally{}if(n=Rs(e,t,i,l),n!==null)return Lt(n,e,l),Nm(n,t,l),!0}return!1}function fo(e,t,n,l){if(l={lane:2,revertLane:Xo(),action:l,hasEagerState:!1,eagerState:null,next:null},Ur(e)){if(t)throw Error(c(479))}else t=Rs(e,n,l,2),t!==null&&Lt(t,e,2)}function Ur(e){var t=e.alternate;return e===Ee||t!==null&&t===Ee}function wm(e,t){ha=Rr=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Nm(e,t,n){if((n&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,n|=l,t.lanes=n,Of(e,n)}}var Hr={readContext:wt,use:Mr,useCallback:Pe,useContext:Pe,useEffect:Pe,useImperativeHandle:Pe,useLayoutEffect:Pe,useInsertionEffect:Pe,useMemo:Pe,useReducer:Pe,useRef:Pe,useState:Pe,useDebugValue:Pe,useDeferredValue:Pe,useTransition:Pe,useSyncExternalStore:Pe,useId:Pe,useHostTransitionStatus:Pe,useFormState:Pe,useActionState:Pe,useOptimistic:Pe,useMemoCache:Pe,useCacheRefresh:Pe},Am={readContext:wt,use:Mr,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:wt,useEffect:cm,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,kr(4194308,4,fm.bind(null,t,e),n)},useLayoutEffect:function(e,t){return kr(4194308,4,e,t)},useInsertionEffect:function(e,t){kr(4,2,e,t)},useMemo:function(e,t){var n=Tt();t=t===void 0?null:t;var l=e();if(Ul){It(!0);try{e()}finally{It(!1)}}return n.memoizedState=[l,t],l},useReducer:function(e,t,n){var l=Tt();if(n!==void 0){var i=n(t);if(Ul){It(!0);try{n(t)}finally{It(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=sb.bind(null,Ee,e),[l.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:function(e){e=io(e);var t=e.queue,n=Sm.bind(null,Ee,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:co,useDeferredValue:function(e,t){var n=Tt();return so(n,e,t)},useTransition:function(){var e=io(!1);return e=vm.bind(null,Ee,e.queue,!0,!1),Tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var l=Ee,i=Tt();if(ke){if(n===void 0)throw Error(c(407));n=n()}else{if(n=t(),Xe===null)throw Error(c(349));(Me&124)!==0||Qd(l,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,cm(Kd.bind(null,l,s,e),[e]),l.flags|=2048,va(9,zr(),Zd.bind(null,l,s,n,t),null),n},useId:function(){var e=Tt(),t=Xe.identifierPrefix;if(ke){var n=_n,l=jn;n=(l&~(1<<32-bt(l)-1)).toString(32)+n,t="«"+t+"R"+n,n=Or++,0ge?(ht=se,se=null):ht=se.sibling;var ze=H(O,se,D[ge],Q);if(ze===null){se===null&&(se=ht);break}e&&se&&ze.alternate===null&&t(O,se),T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze,se=ht}if(ge===D.length)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;gege?(ht=se,se=null):ht=se.sibling;var ml=H(O,se,ze.value,Q);if(ml===null){se===null&&(se=ht);break}e&&se&&ml.alternate===null&&t(O,se),T=s(ml,T,ge),Te===null?ne=ml:Te.sibling=ml,Te=ml,se=ht}if(ze.done)return n(O,se),ke&&Rl(O,ge),ne;if(se===null){for(;!ze.done;ge++,ze=D.next())ze=$(O,ze.value,Q),ze!==null&&(T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return ke&&Rl(O,ge),ne}for(se=l(se);!ze.done;ge++,ze=D.next())ze=L(se,O,ge,ze.value,Q),ze!==null&&(e&&ze.alternate!==null&&se.delete(ze.key===null?ge:ze.key),T=s(ze,T,ge),Te===null?ne=ze:Te.sibling=ze,Te=ze);return e&&se.forEach(function(u0){return t(O,u0)}),ke&&Rl(O,ge),ne}function qe(O,T,D,Q){if(typeof D=="object"&&D!==null&&D.type===M&&D.key===null&&(D=D.props.children),typeof D=="object"&&D!==null){switch(D.$$typeof){case w:e:{for(var ne=D.key;T!==null;){if(T.key===ne){if(ne=D.type,ne===M){if(T.tag===7){n(O,T.sibling),Q=i(T,D.props.children),Q.return=O,O=Q;break e}}else if(T.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===X&&Cm(ne)===T.type){n(O,T.sibling),Q=i(T,D.props),wi(Q,D),Q.return=O,O=Q;break e}n(O,T);break}else t(O,T);T=T.sibling}D.type===M?(Q=jl(D.props.children,O.mode,Q,D.key),Q.return=O,O=Q):(Q=Sr(D.type,D.key,D.props,null,O.mode,Q),wi(Q,D),Q.return=O,O=Q)}return h(O);case C:e:{for(ne=D.key;T!==null;){if(T.key===ne)if(T.tag===4&&T.stateNode.containerInfo===D.containerInfo&&T.stateNode.implementation===D.implementation){n(O,T.sibling),Q=i(T,D.children||[]),Q.return=O,O=Q;break e}else{n(O,T);break}else t(O,T);T=T.sibling}Q=Ds(D,O.mode,Q),Q.return=O,O=Q}return h(O);case X:return ne=D._init,D=ne(D._payload),qe(O,T,D,Q)}if(de(D))return pe(O,T,D,Q);if(ue(D)){if(ne=ue(D),typeof ne!="function")throw Error(c(150));return D=ne.call(D),he(O,T,D,Q)}if(typeof D.then=="function")return qe(O,T,Lr(D),Q);if(D.$$typeof===U)return qe(O,T,Er(O,D),Q);Br(O,D)}return typeof D=="string"&&D!==""||typeof D=="number"||typeof D=="bigint"?(D=""+D,T!==null&&T.tag===6?(n(O,T.sibling),Q=i(T,D),Q.return=O,O=Q):(n(O,T),Q=Ms(D,O.mode,Q),Q.return=O,O=Q),h(O)):n(O,T)}return function(O,T,D,Q){try{Si=0;var ne=qe(O,T,D,Q);return pa=null,ne}catch(se){if(se===di||se===Tr)throw se;var Te=Dt(29,se,null,O.mode);return Te.lanes=Q,Te.return=O,Te}finally{}}}var ya=Tm(!0),jm=Tm(!1),Kt=Y(null),hn=null;function Jn(e){var t=e.alternate;P(ct,ct.current&1),P(Kt,e),hn===null&&(t===null||ma.current!==null||t.memoizedState!==null)&&(hn=e)}function _m(e){if(e.tag===22){if(P(ct,ct.current),P(Kt,e),hn===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(hn=e)}}else Wn()}function Wn(){P(ct,ct.current),P(Kt,Kt.current)}function Dn(e){W(Kt),hn===e&&(hn=null),W(ct)}var ct=Y(0);function Gr(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||nu(n)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function mo(e,t,n,l){t=e.memoizedState,n=n(l,t),n=n==null?t:b({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var ho={enqueueSetState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var l=Ht(),i=Fn(l);i.tag=1,i.payload=t,n!=null&&(i.callback=n),t=Pn(e,i,l),t!==null&&(Lt(t,e,l),hi(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Ht(),l=Fn(n);l.tag=2,t!=null&&(l.callback=t),t=Pn(e,l,n),t!==null&&(Lt(t,e,n),hi(t,e,n))}};function Rm(e,t,n,l,i,s,h){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(l,s,h):t.prototype&&t.prototype.isPureReactComponent?!ai(n,l)||!ai(i,s):!0}function Om(e,t,n,l){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,l),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,l),t.state!==e&&ho.enqueueReplaceState(t,t.state,null)}function Hl(e,t){var n=t;if("ref"in t){n={};for(var l in t)l!=="ref"&&(n[l]=t[l])}if(e=e.defaultProps){n===t&&(n=b({},n));for(var i in e)n[i]===void 0&&(n[i]=e[i])}return n}var qr=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)};function Mm(e){qr(e)}function Dm(e){console.error(e)}function zm(e){qr(e)}function Vr(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(l){setTimeout(function(){throw l})}}function km(e,t,n){try{var l=e.onCaughtError;l(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function go(e,t,n){return n=Fn(n),n.tag=3,n.payload={element:null},n.callback=function(){Vr(e,t)},n}function Um(e){return e=Fn(e),e.tag=3,e}function Hm(e,t,n,l){var i=n.type.getDerivedStateFromError;if(typeof i=="function"){var s=l.value;e.payload=function(){return i(s)},e.callback=function(){km(t,n,l)}}var h=n.stateNode;h!==null&&typeof h.componentDidCatch=="function"&&(e.callback=function(){km(t,n,l),typeof i!="function"&&(il===null?il=new Set([this]):il.add(this));var y=l.stack;this.componentDidCatch(l.value,{componentStack:y!==null?y:""})})}function ub(e,t,n,l,i){if(n.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){if(t=n.alternate,t!==null&&oi(t,n,i,!0),n=Kt.current,n!==null){switch(n.tag){case 13:return hn===null?Bo():n.alternate===null&&Fe===0&&(Fe=3),n.flags&=-257,n.flags|=65536,n.lanes=i,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([l]):t.add(l),qo(e,l,i)),!1;case 22:return n.flags|=65536,l===Ys?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([l])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([l]):n.add(l)),qo(e,l,i)),!1}throw Error(c(435,n.tag))}return qo(e,l,i),Bo(),!1}if(ke)return t=Kt.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,l!==Us&&(e=Error(c(422),{cause:l}),si(Yt(e,n)))):(l!==Us&&(t=Error(c(423),{cause:l}),si(Yt(t,n))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,l=Yt(l,n),i=go(e.stateNode,l,i),Zs(e,i),Fe!==4&&(Fe=2)),!1;var s=Error(c(520),{cause:l});if(s=Yt(s,n),_i===null?_i=[s]:_i.push(s),Fe!==4&&(Fe=2),t===null)return!0;l=Yt(l,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=i&-i,n.lanes|=e,e=go(n.stateNode,l,e),Zs(n,e),!1;case 1:if(t=n.type,s=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||s!==null&&typeof s.componentDidCatch=="function"&&(il===null||!il.has(s))))return n.flags|=65536,i&=-i,n.lanes|=i,i=Um(i),Hm(i,e,n,l),Zs(n,i),!1}n=n.return}while(n!==null);return!1}var Lm=Error(c(461)),dt=!1;function gt(e,t,n,l){t.child=e===null?jm(t,null,n,l):ya(t,e.child,n,l)}function Bm(e,t,n,l,i){n=n.render;var s=t.ref;if("ref"in l){var h={};for(var y in l)y!=="ref"&&(h[y]=l[y])}else h=l;return zl(t),l=Is(e,t,n,h,s,i),y=Js(),e!==null&&!dt?(Ws(e,t,i),zn(e,t,i)):(ke&&y&&zs(t),t.flags|=1,gt(e,t,l,i),t.child)}function Gm(e,t,n,l,i){if(e===null){var s=n.type;return typeof s=="function"&&!Os(s)&&s.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=s,qm(e,t,s,l,i)):(e=Sr(n.type,null,l,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(s=e.child,!No(e,i)){var h=s.memoizedProps;if(n=n.compare,n=n!==null?n:ai,n(h,l)&&e.ref===t.ref)return zn(e,t,i)}return t.flags|=1,e=Tn(s,l),e.ref=t.ref,e.return=t,t.child=e}function qm(e,t,n,l,i){if(e!==null){var s=e.memoizedProps;if(ai(s,l)&&e.ref===t.ref)if(dt=!1,t.pendingProps=l=s,No(e,i))(e.flags&131072)!==0&&(dt=!0);else return t.lanes=e.lanes,zn(e,t,i)}return vo(e,t,n,l,i)}function Vm(e,t,n){var l=t.pendingProps,i=l.children,s=e!==null?e.memoizedState:null;if(l.mode==="hidden"){if((t.flags&128)!==0){if(l=s!==null?s.baseLanes|n:n,e!==null){for(i=t.child=e.child,s=0;i!==null;)s=s|i.lanes|i.childLanes,i=i.sibling;t.childLanes=s&~l}else t.childLanes=0,t.child=null;return Ym(e,t,l,n)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Cr(t,s!==null?s.cachePool:null),s!==null?qd(t,s):$s(),_m(t);else return t.lanes=t.childLanes=536870912,Ym(e,t,s!==null?s.baseLanes|n:n,n)}else s!==null?(Cr(t,s.cachePool),qd(t,s),Wn(),t.memoizedState=null):(e!==null&&Cr(t,null),$s(),Wn());return gt(e,t,i,n),t.child}function Ym(e,t,n,l){var i=Vs();return i=i===null?null:{parent:rt._currentValue,pool:i},t.memoizedState={baseLanes:n,cachePool:i},e!==null&&Cr(t,null),$s(),_m(t),e!==null&&oi(e,t,l,!0),null}function Yr(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!="function"&&typeof n!="object")throw Error(c(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function vo(e,t,n,l,i){return zl(t),n=Is(e,t,n,l,void 0,i),l=Js(),e!==null&&!dt?(Ws(e,t,i),zn(e,t,i)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,i),t.child)}function Xm(e,t,n,l,i,s){return zl(t),t.updateQueue=null,n=Yd(t,l,n,i),Vd(e),l=Js(),e!==null&&!dt?(Ws(e,t,s),zn(e,t,s)):(ke&&l&&zs(t),t.flags|=1,gt(e,t,n,s),t.child)}function Qm(e,t,n,l,i){if(zl(t),t.stateNode===null){var s=sa,h=n.contextType;typeof h=="object"&&h!==null&&(s=wt(h)),s=new n(l,s),t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,s.updater=ho,t.stateNode=s,s._reactInternals=t,s=t.stateNode,s.props=l,s.state=t.memoizedState,s.refs={},Xs(t),h=n.contextType,s.context=typeof h=="object"&&h!==null?wt(h):sa,s.state=t.memoizedState,h=n.getDerivedStateFromProps,typeof h=="function"&&(mo(t,n,h,l),s.state=t.memoizedState),typeof n.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(h=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),h!==s.state&&ho.enqueueReplaceState(s,s.state,null),vi(t,l,s,i),gi(),s.state=t.memoizedState),typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!0}else if(e===null){s=t.stateNode;var y=t.memoizedProps,A=Hl(n,y);s.props=A;var k=s.context,V=n.contextType;h=sa,typeof V=="object"&&V!==null&&(h=wt(V));var $=n.getDerivedStateFromProps;V=typeof $=="function"||typeof s.getSnapshotBeforeUpdate=="function",y=t.pendingProps!==y,V||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(y||k!==h)&&Om(t,s,l,h),$n=!1;var H=t.memoizedState;s.state=H,vi(t,l,s,i),gi(),k=t.memoizedState,y||H!==k||$n?(typeof $=="function"&&(mo(t,n,$,l),k=t.memoizedState),(A=$n||Rm(t,n,A,l,H,k,h))?(V||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount()),typeof s.componentDidMount=="function"&&(t.flags|=4194308)):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=l,t.memoizedState=k),s.props=l,s.state=k,s.context=h,l=A):(typeof s.componentDidMount=="function"&&(t.flags|=4194308),l=!1)}else{s=t.stateNode,Qs(e,t),h=t.memoizedProps,V=Hl(n,h),s.props=V,$=t.pendingProps,H=s.context,k=n.contextType,A=sa,typeof k=="object"&&k!==null&&(A=wt(k)),y=n.getDerivedStateFromProps,(k=typeof y=="function"||typeof s.getSnapshotBeforeUpdate=="function")||typeof s.UNSAFE_componentWillReceiveProps!="function"&&typeof s.componentWillReceiveProps!="function"||(h!==$||H!==A)&&Om(t,s,l,A),$n=!1,H=t.memoizedState,s.state=H,vi(t,l,s,i),gi();var L=t.memoizedState;h!==$||H!==L||$n||e!==null&&e.dependencies!==null&&Ar(e.dependencies)?(typeof y=="function"&&(mo(t,n,y,l),L=t.memoizedState),(V=$n||Rm(t,n,V,l,H,L,A)||e!==null&&e.dependencies!==null&&Ar(e.dependencies))?(k||typeof s.UNSAFE_componentWillUpdate!="function"&&typeof s.componentWillUpdate!="function"||(typeof s.componentWillUpdate=="function"&&s.componentWillUpdate(l,L,A),typeof s.UNSAFE_componentWillUpdate=="function"&&s.UNSAFE_componentWillUpdate(l,L,A)),typeof s.componentDidUpdate=="function"&&(t.flags|=4),typeof s.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),t.memoizedProps=l,t.memoizedState=L),s.props=l,s.state=L,s.context=A,l=V):(typeof s.componentDidUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof s.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),l=!1)}return s=l,Yr(e,t),l=(t.flags&128)!==0,s||l?(s=t.stateNode,n=l&&typeof n.getDerivedStateFromError!="function"?null:s.render(),t.flags|=1,e!==null&&l?(t.child=ya(t,e.child,null,i),t.child=ya(t,null,n,i)):gt(e,t,n,i),t.memoizedState=s.state,e=t.child):e=zn(e,t,i),e}function Zm(e,t,n,l){return ci(),t.flags|=256,gt(e,t,n,l),t.child}var po={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function yo(e){return{baseLanes:e,cachePool:Dd()}}function xo(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=$t),e}function Km(e,t,n){var l=t.pendingProps,i=!1,s=(t.flags&128)!==0,h;if((h=s)||(h=e!==null&&e.memoizedState===null?!1:(ct.current&2)!==0),h&&(i=!0,t.flags&=-129),h=(t.flags&32)!==0,t.flags&=-33,e===null){if(ke){if(i?Jn(t):Wn(),ke){var y=$e,A;if(A=y){e:{for(A=y,y=mn;A.nodeType!==8;){if(!y){y=null;break e}if(A=en(A.nextSibling),A===null){y=null;break e}}y=A}y!==null?(t.memoizedState={dehydrated:y,treeContext:_l!==null?{id:jn,overflow:_n}:null,retryLane:536870912,hydrationErrors:null},A=Dt(18,null,null,0),A.stateNode=y,A.return=t,t.child=A,At=t,$e=null,A=!0):A=!1}A||Ml(t)}if(y=t.memoizedState,y!==null&&(y=y.dehydrated,y!==null))return nu(y)?t.lanes=32:t.lanes=536870912,null;Dn(t)}return y=l.children,l=l.fallback,i?(Wn(),i=t.mode,y=Xr({mode:"hidden",children:y},i),l=jl(l,i,n,null),y.return=t,l.return=t,y.sibling=l,t.child=y,i=t.child,i.memoizedState=yo(n),i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),bo(t,y))}if(A=e.memoizedState,A!==null&&(y=A.dehydrated,y!==null)){if(s)t.flags&256?(Jn(t),t.flags&=-257,t=So(e,t,n)):t.memoizedState!==null?(Wn(),t.child=e.child,t.flags|=128,t=null):(Wn(),i=l.fallback,y=t.mode,l=Xr({mode:"visible",children:l.children},y),i=jl(i,y,n,null),i.flags|=2,l.return=t,i.return=t,l.sibling=i,t.child=l,ya(t,e.child,null,n),l=t.child,l.memoizedState=yo(n),l.childLanes=xo(e,h,n),t.memoizedState=po,t=i);else if(Jn(t),nu(y)){if(h=y.nextSibling&&y.nextSibling.dataset,h)var k=h.dgst;h=k,l=Error(c(419)),l.stack="",l.digest=h,si({value:l,source:null,stack:null}),t=So(e,t,n)}else if(dt||oi(e,t,n,!1),h=(n&e.childLanes)!==0,dt||h){if(h=Xe,h!==null&&(l=n&-n,l=(l&42)!==0?1:ns(l),l=(l&(h.suspendedLanes|n))!==0?0:l,l!==0&&l!==A.retryLane))throw A.retryLane=l,ca(e,l),Lt(h,e,l),Lm;y.data==="$?"||Bo(),t=So(e,t,n)}else y.data==="$?"?(t.flags|=192,t.child=e.child,t=null):(e=A.treeContext,$e=en(y.nextSibling),At=t,ke=!0,Ol=null,mn=!1,e!==null&&(Qt[Zt++]=jn,Qt[Zt++]=_n,Qt[Zt++]=_l,jn=e.id,_n=e.overflow,_l=t),t=bo(t,l.children),t.flags|=4096);return t}return i?(Wn(),i=l.fallback,y=t.mode,A=e.child,k=A.sibling,l=Tn(A,{mode:"hidden",children:l.children}),l.subtreeFlags=A.subtreeFlags&65011712,k!==null?i=Tn(k,i):(i=jl(i,y,n,null),i.flags|=2),i.return=t,l.return=t,l.sibling=i,t.child=l,l=i,i=t.child,y=e.child.memoizedState,y===null?y=yo(n):(A=y.cachePool,A!==null?(k=rt._currentValue,A=A.parent!==k?{parent:k,pool:k}:A):A=Dd(),y={baseLanes:y.baseLanes|n,cachePool:A}),i.memoizedState=y,i.childLanes=xo(e,h,n),t.memoizedState=po,l):(Jn(t),n=e.child,e=n.sibling,n=Tn(n,{mode:"visible",children:l.children}),n.return=t,n.sibling=null,e!==null&&(h=t.deletions,h===null?(t.deletions=[e],t.flags|=16):h.push(e)),t.child=n,t.memoizedState=null,n)}function bo(e,t){return t=Xr({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function Xr(e,t){return e=Dt(22,e,null,t),e.lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function So(e,t,n){return ya(t,e.child,null,n),e=bo(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function $m(e,t,n){e.lanes|=t;var l=e.alternate;l!==null&&(l.lanes|=t),Ls(e.return,t,n)}function wo(e,t,n,l,i){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:l,tail:n,tailMode:i}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=l,s.tail=n,s.tailMode=i)}function Fm(e,t,n){var l=t.pendingProps,i=l.revealOrder,s=l.tail;if(gt(e,t,l.children,n),l=ct.current,(l&2)!==0)l=l&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&$m(e,n,t);else if(e.tag===19)$m(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}l&=1}switch(P(ct,l),i){case"forwards":for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&Gr(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),wo(t,!1,i,n,s);break;case"backwards":for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&Gr(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}wo(t,!0,n,null,s);break;case"together":wo(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function zn(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),al|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(oi(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(c(153));if(t.child!==null){for(e=t.child,n=Tn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Tn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function No(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Ar(e)))}function fb(e,t,n){switch(t.tag){case 3:oe(t,t.stateNode.containerInfo),Kn(t,rt,e.memoizedState.cache),ci();break;case 27:case 5:_e(t);break;case 4:oe(t,t.stateNode.containerInfo);break;case 10:Kn(t,t.type,t.memoizedProps.value);break;case 13:var l=t.memoizedState;if(l!==null)return l.dehydrated!==null?(Jn(t),t.flags|=128,null):(n&t.child.childLanes)!==0?Km(e,t,n):(Jn(t),e=zn(e,t,n),e!==null?e.sibling:null);Jn(t);break;case 19:var i=(e.flags&128)!==0;if(l=(n&t.childLanes)!==0,l||(oi(e,t,n,!1),l=(n&t.childLanes)!==0),i){if(l)return Fm(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),P(ct,ct.current),l)break;return null;case 22:case 23:return t.lanes=0,Vm(e,t,n);case 24:Kn(t,rt,e.memoizedState.cache)}return zn(e,t,n)}function Pm(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)dt=!0;else{if(!No(e,n)&&(t.flags&128)===0)return dt=!1,fb(e,t,n);dt=(e.flags&131072)!==0}else dt=!1,ke&&(t.flags&1048576)!==0&&Cd(t,Nr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var l=t.elementType,i=l._init;if(l=i(l._payload),t.type=l,typeof l=="function")Os(l)?(e=Hl(l,e),t.tag=1,t=Qm(null,t,l,e,n)):(t.tag=0,t=vo(null,t,l,e,n));else{if(l!=null){if(i=l.$$typeof,i===q){t.tag=11,t=Bm(null,t,l,e,n);break e}else if(i===F){t.tag=14,t=Gm(null,t,l,e,n);break e}}throw t=ve(l)||l,Error(c(306,t,""))}}return t;case 0:return vo(e,t,t.type,t.pendingProps,n);case 1:return l=t.type,i=Hl(l,t.pendingProps),Qm(e,t,l,i,n);case 3:e:{if(oe(t,t.stateNode.containerInfo),e===null)throw Error(c(387));l=t.pendingProps;var s=t.memoizedState;i=s.element,Qs(e,t),vi(t,l,null,n);var h=t.memoizedState;if(l=h.cache,Kn(t,rt,l),l!==s.cache&&Bs(t,[rt],n,!0),gi(),l=h.element,s.isDehydrated)if(s={element:l,isDehydrated:!1,cache:h.cache},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){t=Zm(e,t,l,n);break e}else if(l!==i){i=Yt(Error(c(424)),t),si(i),t=Zm(e,t,l,n);break e}else{switch(e=t.stateNode.containerInfo,e.nodeType){case 9:e=e.body;break;default:e=e.nodeName==="HTML"?e.ownerDocument.body:e}for($e=en(e.firstChild),At=t,ke=!0,Ol=null,mn=!0,n=jm(t,null,l,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(ci(),l===i){t=zn(e,t,n);break e}gt(e,t,l,n)}t=t.child}return t;case 26:return Yr(e,t),e===null?(n=eg(t.type,null,t.pendingProps,null))?t.memoizedState=n:ke||(n=t.type,e=t.pendingProps,l=ac(ce.current).createElement(n),l[St]=t,l[Et]=e,pt(l,n,e),ft(l),t.stateNode=l):t.memoizedState=eg(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return _e(t),e===null&&ke&&(l=t.stateNode=Ih(t.type,t.pendingProps,ce.current),At=t,mn=!0,i=$e,sl(t.type)?(lu=i,$e=en(l.firstChild)):$e=i),gt(e,t,t.pendingProps.children,n),Yr(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&ke&&((i=l=$e)&&(l=Bb(l,t.type,t.pendingProps,mn),l!==null?(t.stateNode=l,At=t,$e=en(l.firstChild),mn=!1,i=!0):i=!1),i||Ml(t)),_e(t),i=t.type,s=t.pendingProps,h=e!==null?e.memoizedProps:null,l=s.children,Wo(i,s)?l=null:h!==null&&Wo(i,h)&&(t.flags|=32),t.memoizedState!==null&&(i=Is(e,t,lb,null,null,n),Li._currentValue=i),Yr(e,t),gt(e,t,l,n),t.child;case 6:return e===null&&ke&&((e=n=$e)&&(n=Gb(n,t.pendingProps,mn),n!==null?(t.stateNode=n,At=t,$e=null,e=!0):e=!1),e||Ml(t)),null;case 13:return Km(e,t,n);case 4:return oe(t,t.stateNode.containerInfo),l=t.pendingProps,e===null?t.child=ya(t,null,l,n):gt(e,t,l,n),t.child;case 11:return Bm(e,t,t.type,t.pendingProps,n);case 7:return gt(e,t,t.pendingProps,n),t.child;case 8:return gt(e,t,t.pendingProps.children,n),t.child;case 12:return gt(e,t,t.pendingProps.children,n),t.child;case 10:return l=t.pendingProps,Kn(t,t.type,l.value),gt(e,t,l.children,n),t.child;case 9:return i=t.type._context,l=t.pendingProps.children,zl(t),i=wt(i),l=l(i),t.flags|=1,gt(e,t,l,n),t.child;case 14:return Gm(e,t,t.type,t.pendingProps,n);case 15:return qm(e,t,t.type,t.pendingProps,n);case 19:return Fm(e,t,n);case 31:return l=t.pendingProps,n=t.mode,l={mode:l.mode,children:l.children},e===null?(n=Xr(l,n),n.ref=t.ref,t.child=n,n.return=t,t=n):(n=Tn(e.child,l),n.ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Vm(e,t,n);case 24:return zl(t),l=wt(rt),e===null?(i=Vs(),i===null&&(i=Xe,s=Gs(),i.pooledCache=s,s.refCount++,s!==null&&(i.pooledCacheLanes|=n),i=s),t.memoizedState={parent:l,cache:i},Xs(t),Kn(t,rt,i)):((e.lanes&n)!==0&&(Qs(e,t),vi(t,null,null,n),gi()),i=e.memoizedState,s=t.memoizedState,i.parent!==l?(i={parent:l,cache:l},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),Kn(t,rt,l)):(l=s.cache,Kn(t,rt,l),l!==i.cache&&Bs(t,[rt],n,!0))),gt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(c(156,t.tag))}function kn(e){e.flags|=4}function Im(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!ig(t)){if(t=Kt.current,t!==null&&((Me&4194048)===Me?hn!==null:(Me&62914560)!==Me&&(Me&536870912)===0||t!==hn))throw mi=Ys,zd;e.flags|=8192}}function Qr(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?_f():536870912,e.lanes|=t,wa|=t)}function Ni(e,t){if(!ke)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var l=null;n!==null;)n.alternate!==null&&(l=n),n=n.sibling;l===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:l.sibling=null}}function Ke(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,l=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags&65011712,l|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,l|=i.subtreeFlags,l|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=l,e.childLanes=n,t}function db(e,t,n){var l=t.pendingProps;switch(ks(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ke(t),null;case 1:return Ke(t),null;case 3:return n=t.stateNode,l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),On(rt),De(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ri(t)?kn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,_d())),Ke(t),null;case 26:return n=t.memoizedState,e===null?(kn(t),n!==null?(Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217)):n?n!==e.memoizedState?(kn(t),Ke(t),Im(t,n)):(Ke(t),t.flags&=-16777217):(e.memoizedProps!==l&&kn(t),Ke(t),t.flags&=-16777217),null;case 27:Ne(t),n=ce.current;var i=t.type;if(e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}e=I.current,ri(t)?Td(t):(e=Ih(i,l,n),t.stateNode=e,kn(t))}return Ke(t),null;case 5:if(Ne(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==l&&kn(t);else{if(!l){if(t.stateNode===null)throw Error(c(166));return Ke(t),null}if(e=I.current,ri(t))Td(t);else{switch(i=ac(ce.current),e){case 1:e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=i.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=i.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":e=i.createElement("div"),e.innerHTML=" - + +
diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index 3428921..bde32f5 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -21,9 +21,66 @@ import type { QuadrantsEnum, } from "@/types/reproinventory"; +const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; + +function formatAsYaml(material: ReproInventoryEntry): string { + const lines: string[] = []; + + const addScalar = (key: string, value: string | number | boolean | undefined | null) => { + if (value !== undefined && value !== null && value !== "") { + lines.push(`${key}: ${value}`); + } + }; + + const addList = (key: string, values: string[] | undefined | null) => { + if (values && values.length > 0) { + lines.push(`${key}:`); + values.forEach((v) => lines.push(` - ${v}`)); + } + }; + + addScalar("id", material.id); + addList("tag_team", material.tag_team); + addScalar("course_name", material.course_name); + addScalar("url", material.url); + addList("level", material.level); + addList("platform", material.platform); + addList("keywords", material.keywords); + addScalar("course_length", material.course_length); + addList("instruction_medium", material.instruction_medium); + addList("delivery", material.delivery); + addList("language", material.language); + addList("programming_language", material.programming_language); + addList("neuroimaging_software", material.neuroimaging_software); + addList("imaging_modality", material.imaging_modality); + addScalar("open_dataset", material.open_dataset); + addScalar("last_updated", material.last_updated); + addScalar("functionality", material.functionality); + addScalar("assessment", material.assessment); + addList("prerequisite", material.prerequisite); + addList("source", material.source); + addScalar("review", material.review); + addScalar("exclude_from_repro_inventory", material.exclude_from_repro_inventory); + addScalar("alias_links", material.alias_links); + addScalar("notes", material.notes); + addList("quadrants", material.quadrants); + + return lines.join("\n"); +} + +function openGitHubIssue(material: ReproInventoryEntry) { + const yaml = formatAsYaml(material); + const title = `Edit material: ${material.course_name || "Unknown"} (ID: ${material.id})`; + const body = + `## Edit Training Material Request\n\n` + + `Please update entry **ID: ${material.id}** in \`model/reproinventory_data.yaml\` with the following:\n\n` + + `\`\`\`yaml\n${yaml}\n\`\`\``; + const url = `${GITHUB_REPO}/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + window.open(url, "_blank"); +} + interface EditMaterialDialogProps { material: ReproInventoryEntry; - onSave: (updatedMaterial: ReproInventoryEntry) => void; onClose: () => void; } @@ -39,7 +96,7 @@ const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Fun const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; -const EditMaterialDialog: React.FC = ({ material, onSave, onClose }) => { +const EditMaterialDialog: React.FC = ({ material, onClose }) => { const [editedMaterial, setEditedMaterial] = useState(material); useEffect(() => { @@ -77,7 +134,7 @@ const EditMaterialDialog: React.FC = ({ material, onSav }; const handleSave = () => { - onSave(editedMaterial); + openGitHubIssue(editedMaterial); onClose(); }; @@ -439,7 +496,7 @@ const EditMaterialDialog: React.FC = ({ material, onSav
- +
); diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index ab1a211..dce90fd 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -664,7 +664,7 @@ export default function TrainingMaterialsBrowser() { )} -
+
+
From db5318d0dc0bb1c9aedbadea918e0dadcd8a562d Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 10:34:43 -0400 Subject: [PATCH 03/14] add github actions --- .github/scripts/process_issue.py | 99 +++++++++++++++++++ .github/workflows/create-pr-from-issue.yml | 66 +++++++++++++ .../{index-COgKbmi3.js => index-BN5M8IzP.js} | 6 +- frontend/dist/index.html | 2 +- frontend/src/components/AddMaterialDialog.tsx | 2 +- .../src/components/EditMaterialDialog.tsx | 2 +- frontend/src/training-materials-browser.tsx | 2 +- 7 files changed, 172 insertions(+), 7 deletions(-) create mode 100644 .github/scripts/process_issue.py create mode 100644 .github/workflows/create-pr-from-issue.yml rename frontend/dist/assets/{index-COgKbmi3.js => index-BN5M8IzP.js} (90%) diff --git a/.github/scripts/process_issue.py b/.github/scripts/process_issue.py new file mode 100644 index 0000000..0f4af66 --- /dev/null +++ b/.github/scripts/process_issue.py @@ -0,0 +1,99 @@ +""" +Processes a GitHub issue and updates reproinventory_data.yaml and +frontend/public/data/reproinventory_data.json accordingly. + +Reads: + /tmp/issue_body.txt - full issue body + /tmp/issue_title.txt - issue title + +Environment variables: + ISSUE_LABEL - one of: new-material, edit-material, delete-material + ISSUE_NUMBER - issue number (for logging) +""" + +import os +import re +import json +import yaml + +YAML_PATH = "model/reproinventory_data.yaml" +JSON_PATH = "frontend/public/data/reproinventory_data.json" + +label = os.environ["ISSUE_LABEL"] +issue_number = os.environ["ISSUE_NUMBER"] + +with open("/tmp/issue_body.txt", "r", encoding="utf-8") as f: + issue_body = f.read() + +with open("/tmp/issue_title.txt", "r", encoding="utf-8") as f: + issue_title = f.read().strip() + +# Load current data +with open(YAML_PATH, "r", encoding="utf-8") as f: + data = yaml.safe_load(f) or [] + + +def extract_yaml_block(body): + """Extract the first ```yaml ... ``` block from the issue body.""" + match = re.search(r"```yaml\s*\n(.*?)\n```", body, re.DOTALL) + if not match: + raise ValueError("No YAML block found in issue body.") + return yaml.safe_load(match.group(1)) + + +if label == "new-material": + entry = extract_yaml_block(issue_body) + + # Assign a new numeric ID + numeric_ids = [e["id"] for e in data if isinstance(e.get("id"), int)] + entry["id"] = max(numeric_ids, default=0) + 1 + + data.append(entry) + print(f"Added new entry with ID {entry['id']}: {entry.get('course_name')}") + +elif label == "edit-material": + entry = extract_yaml_block(issue_body) + entry_id = entry.get("id") + + replaced = False + for i, e in enumerate(data): + if str(e.get("id")) == str(entry_id): + data[i] = entry + replaced = True + break + + if not replaced: + raise ValueError(f"Entry with ID '{entry_id}' not found in data.") + print(f"Updated entry ID {entry_id}: {entry.get('course_name')}") + +elif label == "delete-material": + # Extract ID from issue title: "Delete material: Name (ID: 123)" + match = re.search(r"ID:\s*(\S+?)\)", issue_title) + if not match: + raise ValueError(f"Could not extract ID from issue title: {issue_title!r}") + + raw_id = match.group(1) + try: + entry_id = int(raw_id) + except ValueError: + entry_id = raw_id + + original_len = len(data) + data = [e for e in data if str(e.get("id")) != str(entry_id)] + + if len(data) == original_len: + raise ValueError(f"Entry with ID '{entry_id}' not found in data.") + print(f"Deleted entry with ID {entry_id}") + +else: + raise ValueError(f"Unknown label: {label!r}") + +# Write updated YAML +with open(YAML_PATH, "w", encoding="utf-8") as f: + yaml.dump(data, f, sort_keys=False, default_flow_style=False, allow_unicode=True) + +# Write updated JSON +with open(JSON_PATH, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2, ensure_ascii=False) + +print(f"Successfully processed '{label}' for issue #{issue_number}.") diff --git a/.github/workflows/create-pr-from-issue.yml b/.github/workflows/create-pr-from-issue.yml new file mode 100644 index 0000000..09298b3 --- /dev/null +++ b/.github/workflows/create-pr-from-issue.yml @@ -0,0 +1,66 @@ +name: Create PR from Issue + +on: + issues: + types: [labeled] + +jobs: + create-pr: + runs-on: ubuntu-latest + if: contains(fromJSON('["new-material", "edit-material", "delete-material"]'), github.event.label.name) + + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + run: pip install pyyaml + + - name: Write issue data to files + env: + ISSUE_BODY: ${{ github.event.issue.body }} + ISSUE_TITLE: ${{ github.event.issue.title }} + run: | + printf '%s' "$ISSUE_BODY" > /tmp/issue_body.txt + printf '%s' "$ISSUE_TITLE" > /tmp/issue_title.txt + + - name: Process issue and update files + env: + ISSUE_LABEL: ${{ github.event.label.name }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + run: python .github/scripts/process_issue.py + + - name: Create branch and open PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + ISSUE_LABEL: ${{ github.event.label.name }} + ISSUE_TITLE: ${{ github.event.issue.title }} + run: | + BRANCH="auto/${ISSUE_LABEL}-issue-${ISSUE_NUMBER}" + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git checkout -b "$BRANCH" + git add model/reproinventory_data.yaml frontend/public/data/reproinventory_data.json + if git diff --cached --quiet; then + echo "No changes detected — nothing to commit." + exit 1 + fi + git commit -m "${ISSUE_TITLE}" + git push origin "$BRANCH" + gh pr create \ + --title "${ISSUE_TITLE}" \ + --body "Closes #${ISSUE_NUMBER} + +Automatically generated from issue #${ISSUE_NUMBER}." \ + --base main \ + --head "$BRANCH" diff --git a/frontend/dist/assets/index-COgKbmi3.js b/frontend/dist/assets/index-BN5M8IzP.js similarity index 90% rename from frontend/dist/assets/index-COgKbmi3.js rename to frontend/dist/assets/index-BN5M8IzP.js index 93f1fc4..e2a81e2 100644 --- a/frontend/dist/assets/index-COgKbmi3.js +++ b/frontend/dist/assets/index-BN5M8IzP.js @@ -187,13 +187,13 @@ Please update entry **ID: ${a.id}** in \`model/reproinventory_data.yaml\` with t \`\`\`yaml ${r} -\`\`\``,f=`${FE}/issues/new?title=${encodeURIComponent(s)}&body=${encodeURIComponent(c)}`;window.open(f,"_blank")}const JE=["Beginner","Intermediate","Advanced","NA"],WE=["Mac","Windows","Linux","Docker","Jupyter","NA"],eA=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],tA=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],nA=["self-paced","instructor","Hybrid","Discussion needed"],lA=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],aA=["Python","R","shell scripting","Matlab","Git","NA"],iA=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],rA=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],cA=["True","False","NA"],sA=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"],oA=({material:a,onClose:r})=>{const[s,c]=S.useState(a);S.useEffect(()=>{c(a)},[a]);const f=(g,b)=>{c(w=>({...w,[g]:b}))},d=(g,b,w)=>{const _=s[g]||[],M=w?[..._,b]:_.filter(N=>N!==b);f(g,M)},v=(g,b,w)=>{const M=[...s[g]||[]];M[b]=w,f(g,M)},p=g=>{const b=s[g]||[];f(g,[...b,""])},x=(g,b)=>{const _=(s[g]||[]).filter((M,N)=>N!==b);f(g,_)},m=()=>{IE(s),r()};return u.jsxs(Qc,{className:"sm:max-w-[800px] overflow-y-auto max-h-[90vh]",children:[u.jsxs(Zc,{children:[u.jsxs(Kc,{children:["Edit ",s.course_name||"Material"]}),u.jsx($c,{children:"Update the details of this training material."})]}),u.jsxs("div",{className:"grid gap-4 py-4",children:[u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"id",className:"text-right",children:"ID"}),u.jsx(tt,{id:"id",value:s.id,disabled:!0,className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_name",className:"text-right",children:"Course Name"}),u.jsx(tt,{id:"course_name",value:s.course_name||"",onChange:g=>f("course_name",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"url",className:"text-right",children:"URL"}),u.jsx(tt,{id:"url",value:s.url||"",onChange:g=>f("url",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"tag_team",className:"text-right pt-2",children:"Tag Team"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.tag_team||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("tag_team",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("tag_team",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("tag_team"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Tag Team"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"last_updated",className:"text-right",children:"Last Updated"}),u.jsx(tt,{id:"last_updated",value:s.last_updated||"",onChange:g=>f("last_updated",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"functionality",className:"text-right",children:"Functionality"}),u.jsx(tt,{id:"functionality",value:s.functionality||"",onChange:g=>f("functionality",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"assessment",className:"text-right",children:"Assessment"}),u.jsx(tt,{id:"assessment",value:s.assessment||"",onChange:g=>f("assessment",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"prerequisite",className:"text-right pt-2",children:"Prerequisite"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.prerequisite||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("prerequisite",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("prerequisite",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("prerequisite"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Prerequisite"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"source",className:"text-right pt-2",children:"Source"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.source||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("source",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("source",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("source"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Source"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"review",className:"text-right",children:"Review"}),u.jsx(tt,{id:"review",value:s.review||"",onChange:g=>f("review",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"exclude_from_repro_inventory",className:"text-right",children:"Exclude from Repro Inventory"}),u.jsx(tt,{id:"exclude_from_repro_inventory",value:s.exclude_from_repro_inventory||"",onChange:g=>f("exclude_from_repro_inventory",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"alias_links",className:"text-right",children:"Alias Links"}),u.jsx(tt,{id:"alias_links",value:s.alias_links||"",onChange:g=>f("alias_links",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"keywords",className:"text-right pt-2",children:"Keywords"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.keywords||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("keywords",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("keywords",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("keywords"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Keyword"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"notes",className:"text-right",children:"Notes"}),u.jsx(tt,{id:"notes",value:s.notes||"",onChange:g=>f("notes",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Level"}),JE.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`level-${g}`,checked:((b=s.level)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("level",g,w)}),u.jsx(te,{htmlFor:`level-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Platform"}),WE.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`platform-${g}`,checked:((b=s.platform)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("platform",g,w)}),u.jsx(te,{htmlFor:`platform-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Instruction Medium"}),tA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`instruction_medium-${g}`,checked:((b=s.instruction_medium)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("instruction_medium",g,w)}),u.jsx(te,{htmlFor:`instruction_medium-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Delivery"}),nA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`delivery-${g}`,checked:((b=s.delivery)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("delivery",g,w)}),u.jsx(te,{htmlFor:`delivery-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Language"}),lA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`language-${g}`,checked:((b=s.language)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("language",g,w)}),u.jsx(te,{htmlFor:`language-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Programming Language"}),aA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`programming_language-${g}`,checked:((b=s.programming_language)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("programming_language",g,w)}),u.jsx(te,{htmlFor:`programming_language-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Neuroimaging Software"}),iA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`neuroimaging_software-${g}`,checked:((b=s.neuroimaging_software)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("neuroimaging_software",g,w)}),u.jsx(te,{htmlFor:`neuroimaging_software-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Imaging Modality"}),rA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`imaging_modality-${g}`,checked:((b=s.imaging_modality)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("imaging_modality",g,w)}),u.jsx(te,{htmlFor:`imaging_modality-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Quadrants"}),sA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`quadrants-${g}`,checked:((b=s.quadrants)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("quadrants",g,w)}),u.jsx(te,{htmlFor:`quadrants-${g}`,children:g})]},g)})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_length",className:"text-right",children:"Course Length"}),u.jsxs(kc,{value:s.course_length||"",onValueChange:g=>f("course_length",g),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select course length"})}),u.jsx(Ji,{children:eA.map(g=>u.jsx(Wi,{value:g,children:g},g))})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"open_dataset",className:"text-right",children:"Open Dataset"}),u.jsxs(kc,{value:s.open_dataset||"",onValueChange:g=>f("open_dataset",g),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select dataset availability"})}),u.jsx(Ji,{children:cA.map(g=>u.jsx(Wi,{value:g,children:g},g))})]})]})]}),u.jsxs("div",{className:"flex justify-end gap-2",children:[u.jsx(nt,{variant:"outline",onClick:r,children:"Cancel"}),u.jsx(nt,{onClick:m,children:"Submit via GitHub Issue"})]})]})},uA="https://github.com/likeajumprope/ReproInventory",fA=["Beginner","Intermediate","Advanced","NA"],dA=["Mac","Windows","Linux","Docker","Jupyter","NA"],mA=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],hA=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],gA=["self-paced","instructor","Hybrid","Discussion needed"],vA=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],pA=["Python","R","shell scripting","Matlab","Git","NA"],yA=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],xA=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],bA=["True","False","NA"],SA=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"];function wA(a){const r=[],s=(f,d)=>{d!=null&&d!==""&&r.push(`${f}: ${d}`)},c=(f,d)=>{d&&d.length>0&&(r.push(`${f}:`),d.forEach(v=>r.push(` - ${v}`)))};return r.push("id: TBD"),s("course_name",a.course_name),s("url",a.url),c("level",a.level),c("platform",a.platform),c("keywords",a.keywords),s("course_length",a.course_length),c("instruction_medium",a.instruction_medium),c("delivery",a.delivery),c("language",a.language),c("programming_language",a.programming_language),c("neuroimaging_software",a.neuroimaging_software),c("imaging_modality",a.imaging_modality),s("open_dataset",a.open_dataset),s("review",a.review),s("notes",a.notes),c("quadrants",a.quadrants),r.join(` +\`\`\``,f=`${FE}/issues/new?labels=edit-material&title=${encodeURIComponent(s)}&body=${encodeURIComponent(c)}`;window.open(f,"_blank")}const JE=["Beginner","Intermediate","Advanced","NA"],WE=["Mac","Windows","Linux","Docker","Jupyter","NA"],eA=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],tA=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],nA=["self-paced","instructor","Hybrid","Discussion needed"],lA=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],aA=["Python","R","shell scripting","Matlab","Git","NA"],iA=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],rA=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],cA=["True","False","NA"],sA=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"],oA=({material:a,onClose:r})=>{const[s,c]=S.useState(a);S.useEffect(()=>{c(a)},[a]);const f=(g,b)=>{c(w=>({...w,[g]:b}))},d=(g,b,w)=>{const _=s[g]||[],M=w?[..._,b]:_.filter(N=>N!==b);f(g,M)},v=(g,b,w)=>{const M=[...s[g]||[]];M[b]=w,f(g,M)},p=g=>{const b=s[g]||[];f(g,[...b,""])},x=(g,b)=>{const _=(s[g]||[]).filter((M,N)=>N!==b);f(g,_)},m=()=>{IE(s),r()};return u.jsxs(Qc,{className:"sm:max-w-[800px] overflow-y-auto max-h-[90vh]",children:[u.jsxs(Zc,{children:[u.jsxs(Kc,{children:["Edit ",s.course_name||"Material"]}),u.jsx($c,{children:"Update the details of this training material."})]}),u.jsxs("div",{className:"grid gap-4 py-4",children:[u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"id",className:"text-right",children:"ID"}),u.jsx(tt,{id:"id",value:s.id,disabled:!0,className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_name",className:"text-right",children:"Course Name"}),u.jsx(tt,{id:"course_name",value:s.course_name||"",onChange:g=>f("course_name",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"url",className:"text-right",children:"URL"}),u.jsx(tt,{id:"url",value:s.url||"",onChange:g=>f("url",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"tag_team",className:"text-right pt-2",children:"Tag Team"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.tag_team||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("tag_team",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("tag_team",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("tag_team"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Tag Team"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"last_updated",className:"text-right",children:"Last Updated"}),u.jsx(tt,{id:"last_updated",value:s.last_updated||"",onChange:g=>f("last_updated",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"functionality",className:"text-right",children:"Functionality"}),u.jsx(tt,{id:"functionality",value:s.functionality||"",onChange:g=>f("functionality",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"assessment",className:"text-right",children:"Assessment"}),u.jsx(tt,{id:"assessment",value:s.assessment||"",onChange:g=>f("assessment",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"prerequisite",className:"text-right pt-2",children:"Prerequisite"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.prerequisite||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("prerequisite",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("prerequisite",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("prerequisite"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Prerequisite"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"source",className:"text-right pt-2",children:"Source"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.source||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("source",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("source",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("source"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Source"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"review",className:"text-right",children:"Review"}),u.jsx(tt,{id:"review",value:s.review||"",onChange:g=>f("review",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"exclude_from_repro_inventory",className:"text-right",children:"Exclude from Repro Inventory"}),u.jsx(tt,{id:"exclude_from_repro_inventory",value:s.exclude_from_repro_inventory||"",onChange:g=>f("exclude_from_repro_inventory",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"alias_links",className:"text-right",children:"Alias Links"}),u.jsx(tt,{id:"alias_links",value:s.alias_links||"",onChange:g=>f("alias_links",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{htmlFor:"keywords",className:"text-right pt-2",children:"Keywords"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(s.keywords||[]).map((g,b)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:g,onChange:w=>v("keywords",b,w.target.value),className:"flex-grow"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>x("keywords",b),className:"flex-shrink-0",children:u.jsx(Zi,{className:"h-4 w-4"})})]},b)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>p("keywords"),className:"mt-2",children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Keyword"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"notes",className:"text-right",children:"Notes"}),u.jsx(tt,{id:"notes",value:s.notes||"",onChange:g=>f("notes",g.target.value),className:"col-span-3"})]}),u.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Level"}),JE.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`level-${g}`,checked:((b=s.level)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("level",g,w)}),u.jsx(te,{htmlFor:`level-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Platform"}),WE.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`platform-${g}`,checked:((b=s.platform)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("platform",g,w)}),u.jsx(te,{htmlFor:`platform-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Instruction Medium"}),tA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`instruction_medium-${g}`,checked:((b=s.instruction_medium)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("instruction_medium",g,w)}),u.jsx(te,{htmlFor:`instruction_medium-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Delivery"}),nA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`delivery-${g}`,checked:((b=s.delivery)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("delivery",g,w)}),u.jsx(te,{htmlFor:`delivery-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Language"}),lA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`language-${g}`,checked:((b=s.language)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("language",g,w)}),u.jsx(te,{htmlFor:`language-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Programming Language"}),aA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`programming_language-${g}`,checked:((b=s.programming_language)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("programming_language",g,w)}),u.jsx(te,{htmlFor:`programming_language-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Neuroimaging Software"}),iA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`neuroimaging_software-${g}`,checked:((b=s.neuroimaging_software)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("neuroimaging_software",g,w)}),u.jsx(te,{htmlFor:`neuroimaging_software-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Imaging Modality"}),rA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`imaging_modality-${g}`,checked:((b=s.imaging_modality)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("imaging_modality",g,w)}),u.jsx(te,{htmlFor:`imaging_modality-${g}`,children:g})]},g)})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-left",children:"Quadrants"}),sA.map(g=>{var b;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`quadrants-${g}`,checked:((b=s.quadrants)==null?void 0:b.includes(g))||!1,onCheckedChange:w=>d("quadrants",g,w)}),u.jsx(te,{htmlFor:`quadrants-${g}`,children:g})]},g)})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_length",className:"text-right",children:"Course Length"}),u.jsxs(kc,{value:s.course_length||"",onValueChange:g=>f("course_length",g),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select course length"})}),u.jsx(Ji,{children:eA.map(g=>u.jsx(Wi,{value:g,children:g},g))})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"open_dataset",className:"text-right",children:"Open Dataset"}),u.jsxs(kc,{value:s.open_dataset||"",onValueChange:g=>f("open_dataset",g),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select dataset availability"})}),u.jsx(Ji,{children:cA.map(g=>u.jsx(Wi,{value:g,children:g},g))})]})]})]}),u.jsxs("div",{className:"flex justify-end gap-2",children:[u.jsx(nt,{variant:"outline",onClick:r,children:"Cancel"}),u.jsx(nt,{onClick:m,children:"Submit via GitHub Issue"})]})]})},uA="https://github.com/likeajumprope/ReproInventory",fA=["Beginner","Intermediate","Advanced","NA"],dA=["Mac","Windows","Linux","Docker","Jupyter","NA"],mA=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],hA=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],gA=["self-paced","instructor","Hybrid","Discussion needed"],vA=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],pA=["Python","R","shell scripting","Matlab","Git","NA"],yA=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],xA=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],bA=["True","False","NA"],SA=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"];function wA(a){const r=[],s=(f,d)=>{d!=null&&d!==""&&r.push(`${f}: ${d}`)},c=(f,d)=>{d&&d.length>0&&(r.push(`${f}:`),d.forEach(v=>r.push(` - ${v}`)))};return r.push("id: TBD"),s("course_name",a.course_name),s("url",a.url),c("level",a.level),c("platform",a.platform),c("keywords",a.keywords),s("course_length",a.course_length),c("instruction_medium",a.instruction_medium),c("delivery",a.delivery),c("language",a.language),c("programming_language",a.programming_language),c("neuroimaging_software",a.neuroimaging_software),c("imaging_modality",a.imaging_modality),s("open_dataset",a.open_dataset),s("review",a.review),s("notes",a.notes),c("quadrants",a.quadrants),r.join(` `)}function NA(a){const r=wA(a),s=`Add material: ${a.course_name||"New training material"}`,c=`## New Training Material Submission Please review the following training material for addition to ReproInventory. \`\`\`yaml ${r} -\`\`\``,f=`${uA}/issues/new?title=${encodeURIComponent(s)}&body=${encodeURIComponent(c)}`;window.open(f,"_blank")}const EA=({onClose:a})=>{const[r,s]=S.useState({id:"",course_name:"",url:"",level:[],platform:[],keywords:[],course_length:void 0,instruction_medium:[],delivery:[],language:[],programming_language:[],neuroimaging_software:[],imaging_modality:[],open_dataset:void 0,review:"",notes:"",quadrants:[]}),c=(m,g)=>{s(b=>({...b,[m]:g}))},f=(m,g,b)=>{const w=r[m]||[];c(m,b?[...w,g]:w.filter(_=>_!==g))},d=(m,g,b)=>{const w=[...r[m]||[]];w[g]=b,c(m,w)},v=m=>{c(m,[...r[m]||[],""])},p=(m,g)=>{c(m,(r[m]||[]).filter((b,w)=>w!==g))},x=()=>{var m;if(!((m=r.course_name)!=null&&m.trim())){alert("Please provide a course name.");return}NA(r),a()};return u.jsxs(Qc,{className:"sm:max-w-[800px] overflow-y-auto max-h-[90vh]",children:[u.jsxs(Zc,{children:[u.jsx(Kc,{children:"Add New Training Material"}),u.jsx($c,{children:"Fill in the details below. Submitting will open a pre-filled GitHub issue for maintainer review. Only course name is required."})]}),u.jsxs("div",{className:"grid gap-4 py-4",children:[u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_name",className:"text-right",children:"Course Name *"}),u.jsx(tt,{id:"course_name",value:r.course_name||"",onChange:m=>c("course_name",m.target.value),className:"col-span-3",placeholder:"Enter course name"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"url",className:"text-right",children:"URL"}),u.jsx(tt,{id:"url",value:r.url||"",onChange:m=>c("url",m.target.value),className:"col-span-3",placeholder:"https://example.com"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"review",className:"text-right",children:"Description"}),u.jsx(tt,{id:"review",value:r.review||"",onChange:m=>c("review",m.target.value),className:"col-span-3",placeholder:"Brief description of the material"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{className:"text-right pt-2",children:"Keywords"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(r.keywords||[]).map((m,g)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:m,onChange:b=>d("keywords",g,b.target.value),className:"flex-grow",placeholder:"Enter keyword"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>p("keywords",g),children:u.jsx(Zi,{className:"h-4 w-4"})})]},g)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>v("keywords"),children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Keyword"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{className:"text-right",children:"Course Length"}),u.jsxs(kc,{value:r.course_length||"",onValueChange:m=>c("course_length",m),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select course length"})}),u.jsx(Ji,{children:mA.map(m=>u.jsx(Wi,{value:m,children:m},m))})]})]}),u.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Level"}),u.jsx("div",{className:"mt-2 space-y-2",children:fA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-level-${m}`,checked:((g=r.level)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("level",m,b)}),u.jsx(te,{htmlFor:`add-level-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Platform"}),u.jsx("div",{className:"mt-2 space-y-2",children:dA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-platform-${m}`,checked:((g=r.platform)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("platform",m,b)}),u.jsx(te,{htmlFor:`add-platform-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Instruction Medium"}),u.jsx("div",{className:"mt-2 space-y-2",children:hA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-medium-${m}`,checked:((g=r.instruction_medium)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("instruction_medium",m,b)}),u.jsx(te,{htmlFor:`add-medium-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Delivery"}),u.jsx("div",{className:"mt-2 space-y-2",children:gA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-delivery-${m}`,checked:((g=r.delivery)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("delivery",m,b)}),u.jsx(te,{htmlFor:`add-delivery-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Language"}),u.jsx("div",{className:"mt-2 space-y-2",children:vA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-language-${m}`,checked:((g=r.language)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("language",m,b)}),u.jsx(te,{htmlFor:`add-language-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Programming Language"}),u.jsx("div",{className:"mt-2 space-y-2",children:pA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-prog-${m}`,checked:((g=r.programming_language)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("programming_language",m,b)}),u.jsx(te,{htmlFor:`add-prog-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Neuroimaging Software"}),u.jsx("div",{className:"mt-2 space-y-2",children:yA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-neuro-${m}`,checked:((g=r.neuroimaging_software)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("neuroimaging_software",m,b)}),u.jsx(te,{htmlFor:`add-neuro-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Imaging Modality"}),u.jsx("div",{className:"mt-2 space-y-2",children:xA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-modality-${m}`,checked:((g=r.imaging_modality)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("imaging_modality",m,b)}),u.jsx(te,{htmlFor:`add-modality-${m}`,className:"text-sm",children:m})]},m)})})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{className:"text-right",children:"Open Dataset"}),u.jsxs(kc,{value:r.open_dataset||"",onValueChange:m=>c("open_dataset",m),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select dataset availability"})}),u.jsx(Ji,{children:bA.map(m=>u.jsx(Wi,{value:m,children:m},m))})]})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Quadrants"}),u.jsx("div",{className:"mt-2 space-y-2",children:SA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-quadrant-${m}`,checked:((g=r.quadrants)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("quadrants",m,b)}),u.jsx(te,{htmlFor:`add-quadrant-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"notes",className:"text-right",children:"Notes"}),u.jsx(tt,{id:"notes",value:r.notes||"",onChange:m=>c("notes",m.target.value),className:"col-span-3",placeholder:"Additional notes"})]})]}),u.jsxs("div",{className:"flex justify-end gap-2",children:[u.jsx(nt,{variant:"outline",onClick:a,children:"Cancel"}),u.jsx(nt,{onClick:x,children:"Submit via GitHub Issue"})]})]})};function AA(){const[a,r]=S.useState([]),[s,c]=S.useState(!0),[f,d]=S.useState(null),[v,p]=S.useState(null),[x,m]=S.useState(null),[g,b]=S.useState(!1);S.useEffect(()=>{(async()=>{try{const fe=await fetch("/ReproInventory/data/reproinventory_data.json");if(!fe.ok)throw new Error(`HTTP error! status: ${fe.status}`);const Ot=await fe.json();r(Ot)}catch(fe){d(fe.message)}finally{c(!1)}})()},[]);const[w,_]=S.useState(""),[M,N]=S.useState([]),[T,z]=S.useState([]),[j,U]=S.useState([]),[q,G]=S.useState([]),[J,F]=S.useState([]),[X,ie]=S.useState([]),[me,xe]=S.useState([]),[ue,be]=S.useState([]),[ve,de]=S.useState([]),[R,K]=S.useState(""),[B,re]=S.useState([]),[A,Y]=S.useState(!1),[W,P]=S.useState(!1),I=(Q,fe,Ot)=>{Q(un=>Ot?[...un,fe]:un.filter(fn=>fn!==fe))},ye=["Beginner","Intermediate","Advanced","NA"],ce=["Mac","Windows","Linux","Docker","Jupyter","NA"],ee=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],oe=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],De=["self-paced","instructor","Hybrid","Discussion needed"],je=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],Ne=["Python","R","shell scripting","Matlab","Git","NA"],Ee=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],lt=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],xt=["True","False","NA"],En=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"],Pt=S.useMemo(()=>a.filter(fe=>{var un,fn,wl,ht,dn,ot,It,bt,lr;const Ot=[fe.course_name,fe.url,fe.review,fe.notes,...fe.keywords||[]].filter(Boolean).map(String).join(" ").toLowerCase();return!(w&&!Ot.includes(w.toLowerCase())||M.length>0&&!((un=fe.level)!=null&&un.some(it=>M.includes(it)))||T.length>0&&!((fn=fe.platform)!=null&&fn.some(it=>T.includes(it)))||j.length>0&&fe.course_length&&!j.includes(fe.course_length)||q.length>0&&!((wl=fe.instruction_medium)!=null&&wl.some(it=>q.includes(it)))||J.length>0&&!((ht=fe.delivery)!=null&&ht.some(it=>J.includes(it)))||X.length>0&&!((dn=fe.language)!=null&&dn.some(it=>X.includes(it)))||me.length>0&&!((ot=fe.programming_language)!=null&&ot.some(it=>me.includes(it)))||ue.length>0&&!((It=fe.neuroimaging_software)!=null&&It.some(it=>ue.includes(it)))||ve.length>0&&!((bt=fe.imaging_modality)!=null&&bt.some(it=>ve.includes(it)))||R&&fe.open_dataset!==R||B.length>0&&!((lr=fe.quadrants)!=null&&lr.some(it=>B.includes(it)))||A&&!fe.assessment)}),[a,w,M,T,j,q,J,X,me,ue,ve,R,B,A,W]),at=()=>{_(""),N([]),z([]),U([]),G([]),F([]),ie([]),xe([]),be([]),de([]),K(""),re([]),Y(!1),P(!1)},Za=Q=>{switch(Q){case"Hands-on tutorial / notebooks":case"website":case"notes":case"reference":case"blog post":case"outline":case"meta-resource":return u.jsx(_g,{className:"w-4 h-4"});case"video":return u.jsx(Q0,{className:"w-4 h-4"});case"lecture":case"slides":return u.jsx(U0,{className:"w-4 h-4"});default:return u.jsx(_g,{className:"w-4 h-4"})}};return u.jsxs("div",{className:"min-h-screen bg-background",children:[u.jsxs("div",{className:"container mx-auto px-4 py-8",children:[u.jsxs("div",{className:"mb-8",children:[u.jsx("h1",{className:"text-3xl font-bold mb-2",children:"ReproInventory - Training"}),u.jsx("p",{className:"text-muted-foreground",children:"Explore our comprehensive collection of research training materials and educational resources"})]}),u.jsxs("div",{className:"grid lg:grid-cols-[300px_1fr] gap-8",children:[u.jsxs("div",{className:"space-y-6",children:[u.jsxs(Su,{children:[u.jsx(wu,{children:u.jsxs(Nu,{className:"flex items-center gap-2",children:[u.jsx(jg,{className:"w-5 h-5"}),"Search & Filters"]})}),u.jsxs(Eu,{className:"space-y-4",children:[u.jsx("div",{children:u.jsx(tt,{placeholder:"Search materials...",value:w,onChange:Q=>_(Q.target.value),className:"w-full"})}),u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:"featured",checked:W,onCheckedChange:Q=>P(Q===!0)}),u.jsx(te,{htmlFor:"featured",className:"text-sm",children:"Featured only"})]}),u.jsxs("div",{className:"flex justify-between items-center",children:[u.jsx("span",{className:"text-sm font-medium",children:"Active Filters"}),u.jsx(nt,{variant:"ghost",size:"sm",onClick:at,children:"Clear All"})]})]})]}),u.jsxs(b1,{defaultValue:"categories",className:"w-full",children:[u.jsxs(S1,{className:"grid w-full grid-cols-2",children:[u.jsx(Lg,{value:"categories",children:"Categories"}),u.jsx(Lg,{value:"attributes",children:"Attributes"})]}),u.jsx(Bg,{value:"categories",className:"space-y-4",children:u.jsxs(Su,{children:[u.jsxs(wu,{children:[u.jsx(Nu,{className:"text-lg",children:"Quadrants"}),u.jsx(Hg,{children:"Filter by Quadrants classification"})]}),u.jsx(Eu,{children:u.jsx("div",{className:"space-y-3",children:En.map(Q=>u.jsxs("div",{className:"flex items-start space-x-2",children:[u.jsx(Ue,{id:`quadrant-${Q}`,checked:B.includes(Q),onCheckedChange:fe=>I(re,Q,fe)}),u.jsx("div",{className:"grid gap-1.5 leading-none",children:u.jsx(te,{htmlFor:`quadrant-${Q}`,className:"text-sm font-medium",children:Q})})]},Q))})})]})}),u.jsx(Bg,{value:"attributes",className:"space-y-4",children:u.jsxs(V1,{type:"multiple",className:"w-full",children:[u.jsxs(tn,{value:"level",children:[u.jsx(nn,{children:"Level"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ye.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`level-${Q}`,checked:M.includes(Q),onCheckedChange:fe=>I(N,Q,fe)}),u.jsx(te,{htmlFor:`level-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"platform",children:[u.jsx(nn,{children:"Platform"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ce.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`platform-${Q}`,checked:T.includes(Q),onCheckedChange:fe=>I(z,Q,fe)}),u.jsx(te,{htmlFor:`platform-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"course-length",children:[u.jsx(nn,{children:"Course Length"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ee.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`length-${Q}`,checked:j.includes(Q),onCheckedChange:fe=>I(U,Q,fe)}),u.jsx(te,{htmlFor:`length-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"instruction-medium",children:[u.jsx(nn,{children:"Instruction Medium"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:oe.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`medium-${Q}`,checked:q.includes(Q),onCheckedChange:fe=>I(G,Q,fe)}),u.jsx(te,{htmlFor:`medium-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"delivery",children:[u.jsx(nn,{children:"Delivery"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:De.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`delivery-${Q}`,checked:J.includes(Q),onCheckedChange:fe=>I(F,Q,fe)}),u.jsx(te,{htmlFor:`delivery-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"language",children:[u.jsx(nn,{children:"Language"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:je.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`language-${Q}`,checked:X.includes(Q),onCheckedChange:fe=>I(ie,Q,fe)}),u.jsx(te,{htmlFor:`language-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"programming-language",children:[u.jsx(nn,{children:"Programming Language"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:Ne.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`programming-language-${Q}`,checked:me.includes(Q),onCheckedChange:fe=>I(xe,Q,fe)}),u.jsx(te,{htmlFor:`programming-language-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"neuroimaging-software",children:[u.jsx(nn,{children:"Neuroimaging Software"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:Ee.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`neuroimaging-software-${Q}`,checked:ue.includes(Q),onCheckedChange:fe=>I(be,Q,fe)}),u.jsx(te,{htmlFor:`neuroimaging-software-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"imaging-modality",children:[u.jsx(nn,{children:"Imaging Modality"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:lt.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`imaging-modality-${Q}`,checked:ve.includes(Q),onCheckedChange:fe=>I(de,Q,fe)}),u.jsx(te,{htmlFor:`imaging-modality-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"open-dataset",children:[u.jsx(nn,{children:"Open Dataset"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:xt.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`open-dataset-${Q}`,checked:R===Q,onCheckedChange:()=>K(Q)}),u.jsx(te,{htmlFor:`open-dataset-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"assessment",children:[u.jsx(nn,{children:"Assessment Available"}),u.jsx(ln,{children:u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:"showAssessmentOnly",checked:A,onCheckedChange:Q=>Y(Q)}),u.jsx(te,{htmlFor:"showAssessmentOnly",className:"text-sm",children:"Show only materials with assessment"})]})})]})]})})]})]}),u.jsxs("div",{className:"space-y-6",children:[s&&u.jsx("p",{children:"Loading materials..."}),f&&u.jsxs("p",{className:"text-red-500",children:["Error: ",f]}),!s&&!f&&u.jsxs(u.Fragment,{children:[u.jsxs("div",{className:"flex items-center justify-between",children:[u.jsxs("div",{children:[u.jsxs("h2",{className:"text-xl font-semibold",children:[Pt.length," Training Materials"]}),w&&u.jsxs("p",{className:"text-sm text-muted-foreground",children:['Results for "',w,'"']})]}),u.jsxs(Du,{open:g,onOpenChange:b,children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{children:"Add Material"})}),u.jsx(EA,{onClose:()=>b(!1)})]})]}),u.jsx("div",{className:"grid gap-6 md:grid-cols-2 xl:grid-cols-3",children:Pt.map(Q=>{var fe,Ot,un,fn,wl;return u.jsxs(Su,{className:"hover:shadow-lg transition-shadow",children:[u.jsxs(wu,{children:[u.jsxs("div",{className:"flex items-start justify-between",children:[u.jsxs("div",{className:"flex items-center gap-2",children:[Za(((fe=Q.instruction_medium)==null?void 0:fe[0])||""),u.jsx(Da,{variant:"secondary",children:((Ot=Q.instruction_medium)==null?void 0:Ot[0])||"N/A"})]}),Q.assessment&&u.jsx(Da,{variant:"default",children:"Assessment"})]}),u.jsx(Nu,{className:"text-lg",children:Q.course_name}),u.jsx(Hg,{children:Q.review})]}),u.jsxs(Eu,{className:"space-y-4",children:[u.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[u.jsxs("div",{className:"flex items-center gap-1",children:[u.jsx(M0,{className:"w-4 h-4"}),Q.course_length||"N/A"]}),Q.level&&u.jsx(Da,{variant:"outline",children:Q.level.join(", ")})]}),u.jsxs("div",{className:"space-y-2",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"KEYWORDS"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(un=Q.keywords)==null?void 0:un.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"PROGRAMMING LANGUAGE"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(fn=Q.programming_language)==null?void 0:fn.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"PLATFORM"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(wl=Q.platform)==null?void 0:wl.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),Q.url&&u.jsxs("a",{href:Q.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline flex items-center gap-1",children:["Access Material ",u.jsx(z0,{className:"w-4 h-4"})]})]}),u.jsxs("div",{className:"flex gap-2 flex-wrap",children:[u.jsxs(Du,{children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto",onClick:()=>p(Q),children:"View Raw Data"})}),u.jsxs(Qc,{className:"sm:max-w-[800px]",children:[u.jsxs(Zc,{children:[u.jsxs(Kc,{children:["Raw Data for ",v==null?void 0:v.course_name]}),u.jsx($c,{children:"This is the raw JSON data for the selected training material."})]}),u.jsx("div",{className:"max-h-[60vh] overflow-auto rounded-md bg-zinc-900 p-4 text-zinc-50",children:u.jsx("pre",{className:"text-xs",children:v?JSON.stringify(v,null,2):"No data selected"})})]})]}),u.jsxs(Du,{onOpenChange:ht=>{ht||m(null)},children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto",onClick:()=>m(Q),children:"Edit"})}),x&&u.jsx(oA,{material:x,onClose:()=>m(null)})]}),u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto text-red-600 hover:text-red-700",onClick:()=>{const ht=`Delete material: ${Q.course_name} (ID: ${Q.id})`,dn=`## Delete Training Material Request +\`\`\``,f=`${uA}/issues/new?labels=new-material&title=${encodeURIComponent(s)}&body=${encodeURIComponent(c)}`;window.open(f,"_blank")}const EA=({onClose:a})=>{const[r,s]=S.useState({id:"",course_name:"",url:"",level:[],platform:[],keywords:[],course_length:void 0,instruction_medium:[],delivery:[],language:[],programming_language:[],neuroimaging_software:[],imaging_modality:[],open_dataset:void 0,review:"",notes:"",quadrants:[]}),c=(m,g)=>{s(b=>({...b,[m]:g}))},f=(m,g,b)=>{const w=r[m]||[];c(m,b?[...w,g]:w.filter(_=>_!==g))},d=(m,g,b)=>{const w=[...r[m]||[]];w[g]=b,c(m,w)},v=m=>{c(m,[...r[m]||[],""])},p=(m,g)=>{c(m,(r[m]||[]).filter((b,w)=>w!==g))},x=()=>{var m;if(!((m=r.course_name)!=null&&m.trim())){alert("Please provide a course name.");return}NA(r),a()};return u.jsxs(Qc,{className:"sm:max-w-[800px] overflow-y-auto max-h-[90vh]",children:[u.jsxs(Zc,{children:[u.jsx(Kc,{children:"Add New Training Material"}),u.jsx($c,{children:"Fill in the details below. Submitting will open a pre-filled GitHub issue for maintainer review. Only course name is required."})]}),u.jsxs("div",{className:"grid gap-4 py-4",children:[u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"course_name",className:"text-right",children:"Course Name *"}),u.jsx(tt,{id:"course_name",value:r.course_name||"",onChange:m=>c("course_name",m.target.value),className:"col-span-3",placeholder:"Enter course name"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"url",className:"text-right",children:"URL"}),u.jsx(tt,{id:"url",value:r.url||"",onChange:m=>c("url",m.target.value),className:"col-span-3",placeholder:"https://example.com"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"review",className:"text-right",children:"Description"}),u.jsx(tt,{id:"review",value:r.review||"",onChange:m=>c("review",m.target.value),className:"col-span-3",placeholder:"Brief description of the material"})]}),u.jsxs("div",{className:"grid grid-cols-4 items-start gap-4",children:[u.jsx(te,{className:"text-right pt-2",children:"Keywords"}),u.jsxs("div",{className:"col-span-3 space-y-2",children:[(r.keywords||[]).map((m,g)=>u.jsxs("div",{className:"flex items-center gap-2",children:[u.jsx(tt,{value:m,onChange:b=>d("keywords",g,b.target.value),className:"flex-grow",placeholder:"Enter keyword"}),u.jsx(nt,{variant:"outline",size:"icon",onClick:()=>p("keywords",g),children:u.jsx(Zi,{className:"h-4 w-4"})})]},g)),u.jsxs(nt,{variant:"outline",size:"sm",onClick:()=>v("keywords"),children:[u.jsx(Ki,{className:"h-4 w-4 mr-2"})," Add Keyword"]})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{className:"text-right",children:"Course Length"}),u.jsxs(kc,{value:r.course_length||"",onValueChange:m=>c("course_length",m),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select course length"})}),u.jsx(Ji,{children:mA.map(m=>u.jsx(Wi,{value:m,children:m},m))})]})]}),u.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Level"}),u.jsx("div",{className:"mt-2 space-y-2",children:fA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-level-${m}`,checked:((g=r.level)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("level",m,b)}),u.jsx(te,{htmlFor:`add-level-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Platform"}),u.jsx("div",{className:"mt-2 space-y-2",children:dA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-platform-${m}`,checked:((g=r.platform)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("platform",m,b)}),u.jsx(te,{htmlFor:`add-platform-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Instruction Medium"}),u.jsx("div",{className:"mt-2 space-y-2",children:hA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-medium-${m}`,checked:((g=r.instruction_medium)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("instruction_medium",m,b)}),u.jsx(te,{htmlFor:`add-medium-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Delivery"}),u.jsx("div",{className:"mt-2 space-y-2",children:gA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-delivery-${m}`,checked:((g=r.delivery)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("delivery",m,b)}),u.jsx(te,{htmlFor:`add-delivery-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Language"}),u.jsx("div",{className:"mt-2 space-y-2",children:vA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-language-${m}`,checked:((g=r.language)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("language",m,b)}),u.jsx(te,{htmlFor:`add-language-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Programming Language"}),u.jsx("div",{className:"mt-2 space-y-2",children:pA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-prog-${m}`,checked:((g=r.programming_language)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("programming_language",m,b)}),u.jsx(te,{htmlFor:`add-prog-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Neuroimaging Software"}),u.jsx("div",{className:"mt-2 space-y-2",children:yA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-neuro-${m}`,checked:((g=r.neuroimaging_software)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("neuroimaging_software",m,b)}),u.jsx(te,{htmlFor:`add-neuro-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Imaging Modality"}),u.jsx("div",{className:"mt-2 space-y-2",children:xA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-modality-${m}`,checked:((g=r.imaging_modality)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("imaging_modality",m,b)}),u.jsx(te,{htmlFor:`add-modality-${m}`,className:"text-sm",children:m})]},m)})})]})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{className:"text-right",children:"Open Dataset"}),u.jsxs(kc,{value:r.open_dataset||"",onValueChange:m=>c("open_dataset",m),children:[u.jsx(Ii,{className:"col-span-3",children:u.jsx(Uc,{placeholder:"Select dataset availability"})}),u.jsx(Ji,{children:bA.map(m=>u.jsx(Wi,{value:m,children:m},m))})]})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-sm font-medium",children:"Quadrants"}),u.jsx("div",{className:"mt-2 space-y-2",children:SA.map(m=>{var g;return u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`add-quadrant-${m}`,checked:((g=r.quadrants)==null?void 0:g.includes(m))||!1,onCheckedChange:b=>f("quadrants",m,b)}),u.jsx(te,{htmlFor:`add-quadrant-${m}`,className:"text-sm",children:m})]},m)})})]}),u.jsxs("div",{className:"grid grid-cols-4 items-center gap-4",children:[u.jsx(te,{htmlFor:"notes",className:"text-right",children:"Notes"}),u.jsx(tt,{id:"notes",value:r.notes||"",onChange:m=>c("notes",m.target.value),className:"col-span-3",placeholder:"Additional notes"})]})]}),u.jsxs("div",{className:"flex justify-end gap-2",children:[u.jsx(nt,{variant:"outline",onClick:a,children:"Cancel"}),u.jsx(nt,{onClick:x,children:"Submit via GitHub Issue"})]})]})};function AA(){const[a,r]=S.useState([]),[s,c]=S.useState(!0),[f,d]=S.useState(null),[v,p]=S.useState(null),[x,m]=S.useState(null),[g,b]=S.useState(!1);S.useEffect(()=>{(async()=>{try{const fe=await fetch("/ReproInventory/data/reproinventory_data.json");if(!fe.ok)throw new Error(`HTTP error! status: ${fe.status}`);const Ot=await fe.json();r(Ot)}catch(fe){d(fe.message)}finally{c(!1)}})()},[]);const[w,_]=S.useState(""),[M,N]=S.useState([]),[T,z]=S.useState([]),[j,U]=S.useState([]),[q,G]=S.useState([]),[J,F]=S.useState([]),[X,ie]=S.useState([]),[me,xe]=S.useState([]),[ue,be]=S.useState([]),[ve,de]=S.useState([]),[R,K]=S.useState(""),[B,re]=S.useState([]),[A,Y]=S.useState(!1),[W,P]=S.useState(!1),I=(Q,fe,Ot)=>{Q(un=>Ot?[...un,fe]:un.filter(fn=>fn!==fe))},ye=["Beginner","Intermediate","Advanced","NA"],ce=["Mac","Windows","Linux","Docker","Jupyter","NA"],ee=["<1 hr","1-4 hrs","1 day","1-3 days","1 week","1+ weeks","NA"],oe=["Hands-on tutorial / notebooks","lecture","video","notes","blog post","reference","slides","website","outline","meta-resource","NA"],De=["self-paced","instructor","Hybrid","Discussion needed"],je=["English","French","Spanish","Chinese","German","English, French","English, German","Other","NA"],Ne=["Python","R","shell scripting","Matlab","Git","NA"],Ee=["AFNI","SPM","FSL","Freesurfer","Python","Multiple","NA"],lt=["DWI","Structural","Functional","Task-based","Resting-State","EEG","Behavioral","MEG","MRI","NA"],xt=["True","False","NA"],En=["information-oriented (reference)","understanding-oriented (explanation)","learning-oriented (tutorials)","problem-oriented (how to guides)","NA"],Pt=S.useMemo(()=>a.filter(fe=>{var un,fn,wl,ht,dn,ot,It,bt,lr;const Ot=[fe.course_name,fe.url,fe.review,fe.notes,...fe.keywords||[]].filter(Boolean).map(String).join(" ").toLowerCase();return!(w&&!Ot.includes(w.toLowerCase())||M.length>0&&!((un=fe.level)!=null&&un.some(it=>M.includes(it)))||T.length>0&&!((fn=fe.platform)!=null&&fn.some(it=>T.includes(it)))||j.length>0&&fe.course_length&&!j.includes(fe.course_length)||q.length>0&&!((wl=fe.instruction_medium)!=null&&wl.some(it=>q.includes(it)))||J.length>0&&!((ht=fe.delivery)!=null&&ht.some(it=>J.includes(it)))||X.length>0&&!((dn=fe.language)!=null&&dn.some(it=>X.includes(it)))||me.length>0&&!((ot=fe.programming_language)!=null&&ot.some(it=>me.includes(it)))||ue.length>0&&!((It=fe.neuroimaging_software)!=null&&It.some(it=>ue.includes(it)))||ve.length>0&&!((bt=fe.imaging_modality)!=null&&bt.some(it=>ve.includes(it)))||R&&fe.open_dataset!==R||B.length>0&&!((lr=fe.quadrants)!=null&&lr.some(it=>B.includes(it)))||A&&!fe.assessment)}),[a,w,M,T,j,q,J,X,me,ue,ve,R,B,A,W]),at=()=>{_(""),N([]),z([]),U([]),G([]),F([]),ie([]),xe([]),be([]),de([]),K(""),re([]),Y(!1),P(!1)},Za=Q=>{switch(Q){case"Hands-on tutorial / notebooks":case"website":case"notes":case"reference":case"blog post":case"outline":case"meta-resource":return u.jsx(_g,{className:"w-4 h-4"});case"video":return u.jsx(Q0,{className:"w-4 h-4"});case"lecture":case"slides":return u.jsx(U0,{className:"w-4 h-4"});default:return u.jsx(_g,{className:"w-4 h-4"})}};return u.jsxs("div",{className:"min-h-screen bg-background",children:[u.jsxs("div",{className:"container mx-auto px-4 py-8",children:[u.jsxs("div",{className:"mb-8",children:[u.jsx("h1",{className:"text-3xl font-bold mb-2",children:"ReproInventory - Training"}),u.jsx("p",{className:"text-muted-foreground",children:"Explore our comprehensive collection of research training materials and educational resources"})]}),u.jsxs("div",{className:"grid lg:grid-cols-[300px_1fr] gap-8",children:[u.jsxs("div",{className:"space-y-6",children:[u.jsxs(Su,{children:[u.jsx(wu,{children:u.jsxs(Nu,{className:"flex items-center gap-2",children:[u.jsx(jg,{className:"w-5 h-5"}),"Search & Filters"]})}),u.jsxs(Eu,{className:"space-y-4",children:[u.jsx("div",{children:u.jsx(tt,{placeholder:"Search materials...",value:w,onChange:Q=>_(Q.target.value),className:"w-full"})}),u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:"featured",checked:W,onCheckedChange:Q=>P(Q===!0)}),u.jsx(te,{htmlFor:"featured",className:"text-sm",children:"Featured only"})]}),u.jsxs("div",{className:"flex justify-between items-center",children:[u.jsx("span",{className:"text-sm font-medium",children:"Active Filters"}),u.jsx(nt,{variant:"ghost",size:"sm",onClick:at,children:"Clear All"})]})]})]}),u.jsxs(b1,{defaultValue:"categories",className:"w-full",children:[u.jsxs(S1,{className:"grid w-full grid-cols-2",children:[u.jsx(Lg,{value:"categories",children:"Categories"}),u.jsx(Lg,{value:"attributes",children:"Attributes"})]}),u.jsx(Bg,{value:"categories",className:"space-y-4",children:u.jsxs(Su,{children:[u.jsxs(wu,{children:[u.jsx(Nu,{className:"text-lg",children:"Quadrants"}),u.jsx(Hg,{children:"Filter by Quadrants classification"})]}),u.jsx(Eu,{children:u.jsx("div",{className:"space-y-3",children:En.map(Q=>u.jsxs("div",{className:"flex items-start space-x-2",children:[u.jsx(Ue,{id:`quadrant-${Q}`,checked:B.includes(Q),onCheckedChange:fe=>I(re,Q,fe)}),u.jsx("div",{className:"grid gap-1.5 leading-none",children:u.jsx(te,{htmlFor:`quadrant-${Q}`,className:"text-sm font-medium",children:Q})})]},Q))})})]})}),u.jsx(Bg,{value:"attributes",className:"space-y-4",children:u.jsxs(V1,{type:"multiple",className:"w-full",children:[u.jsxs(tn,{value:"level",children:[u.jsx(nn,{children:"Level"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ye.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`level-${Q}`,checked:M.includes(Q),onCheckedChange:fe=>I(N,Q,fe)}),u.jsx(te,{htmlFor:`level-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"platform",children:[u.jsx(nn,{children:"Platform"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ce.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`platform-${Q}`,checked:T.includes(Q),onCheckedChange:fe=>I(z,Q,fe)}),u.jsx(te,{htmlFor:`platform-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"course-length",children:[u.jsx(nn,{children:"Course Length"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:ee.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`length-${Q}`,checked:j.includes(Q),onCheckedChange:fe=>I(U,Q,fe)}),u.jsx(te,{htmlFor:`length-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"instruction-medium",children:[u.jsx(nn,{children:"Instruction Medium"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:oe.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`medium-${Q}`,checked:q.includes(Q),onCheckedChange:fe=>I(G,Q,fe)}),u.jsx(te,{htmlFor:`medium-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"delivery",children:[u.jsx(nn,{children:"Delivery"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:De.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`delivery-${Q}`,checked:J.includes(Q),onCheckedChange:fe=>I(F,Q,fe)}),u.jsx(te,{htmlFor:`delivery-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"language",children:[u.jsx(nn,{children:"Language"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:je.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`language-${Q}`,checked:X.includes(Q),onCheckedChange:fe=>I(ie,Q,fe)}),u.jsx(te,{htmlFor:`language-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"programming-language",children:[u.jsx(nn,{children:"Programming Language"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:Ne.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`programming-language-${Q}`,checked:me.includes(Q),onCheckedChange:fe=>I(xe,Q,fe)}),u.jsx(te,{htmlFor:`programming-language-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"neuroimaging-software",children:[u.jsx(nn,{children:"Neuroimaging Software"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:Ee.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`neuroimaging-software-${Q}`,checked:ue.includes(Q),onCheckedChange:fe=>I(be,Q,fe)}),u.jsx(te,{htmlFor:`neuroimaging-software-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"imaging-modality",children:[u.jsx(nn,{children:"Imaging Modality"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:lt.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`imaging-modality-${Q}`,checked:ve.includes(Q),onCheckedChange:fe=>I(de,Q,fe)}),u.jsx(te,{htmlFor:`imaging-modality-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"open-dataset",children:[u.jsx(nn,{children:"Open Dataset"}),u.jsx(ln,{children:u.jsx("div",{className:"space-y-2",children:xt.map(Q=>u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:`open-dataset-${Q}`,checked:R===Q,onCheckedChange:()=>K(Q)}),u.jsx(te,{htmlFor:`open-dataset-${Q}`,className:"text-sm",children:Q})]},Q))})})]}),u.jsxs(tn,{value:"assessment",children:[u.jsx(nn,{children:"Assessment Available"}),u.jsx(ln,{children:u.jsxs("div",{className:"flex items-center space-x-2",children:[u.jsx(Ue,{id:"showAssessmentOnly",checked:A,onCheckedChange:Q=>Y(Q)}),u.jsx(te,{htmlFor:"showAssessmentOnly",className:"text-sm",children:"Show only materials with assessment"})]})})]})]})})]})]}),u.jsxs("div",{className:"space-y-6",children:[s&&u.jsx("p",{children:"Loading materials..."}),f&&u.jsxs("p",{className:"text-red-500",children:["Error: ",f]}),!s&&!f&&u.jsxs(u.Fragment,{children:[u.jsxs("div",{className:"flex items-center justify-between",children:[u.jsxs("div",{children:[u.jsxs("h2",{className:"text-xl font-semibold",children:[Pt.length," Training Materials"]}),w&&u.jsxs("p",{className:"text-sm text-muted-foreground",children:['Results for "',w,'"']})]}),u.jsxs(Du,{open:g,onOpenChange:b,children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{children:"Add Material"})}),u.jsx(EA,{onClose:()=>b(!1)})]})]}),u.jsx("div",{className:"grid gap-6 md:grid-cols-2 xl:grid-cols-3",children:Pt.map(Q=>{var fe,Ot,un,fn,wl;return u.jsxs(Su,{className:"hover:shadow-lg transition-shadow",children:[u.jsxs(wu,{children:[u.jsxs("div",{className:"flex items-start justify-between",children:[u.jsxs("div",{className:"flex items-center gap-2",children:[Za(((fe=Q.instruction_medium)==null?void 0:fe[0])||""),u.jsx(Da,{variant:"secondary",children:((Ot=Q.instruction_medium)==null?void 0:Ot[0])||"N/A"})]}),Q.assessment&&u.jsx(Da,{variant:"default",children:"Assessment"})]}),u.jsx(Nu,{className:"text-lg",children:Q.course_name}),u.jsx(Hg,{children:Q.review})]}),u.jsxs(Eu,{className:"space-y-4",children:[u.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[u.jsxs("div",{className:"flex items-center gap-1",children:[u.jsx(M0,{className:"w-4 h-4"}),Q.course_length||"N/A"]}),Q.level&&u.jsx(Da,{variant:"outline",children:Q.level.join(", ")})]}),u.jsxs("div",{className:"space-y-2",children:[u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"KEYWORDS"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(un=Q.keywords)==null?void 0:un.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"PROGRAMMING LANGUAGE"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(fn=Q.programming_language)==null?void 0:fn.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),u.jsxs("div",{children:[u.jsx(te,{className:"text-xs font-medium text-muted-foreground",children:"PLATFORM"}),u.jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:(wl=Q.platform)==null?void 0:wl.map(ht=>u.jsx(Da,{variant:"outline",className:"text-xs",children:ht},ht))})]}),Q.url&&u.jsxs("a",{href:Q.url,target:"_blank",rel:"noopener noreferrer",className:"text-blue-500 hover:underline flex items-center gap-1",children:["Access Material ",u.jsx(z0,{className:"w-4 h-4"})]})]}),u.jsxs("div",{className:"flex gap-2 flex-wrap",children:[u.jsxs(Du,{children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto",onClick:()=>p(Q),children:"View Raw Data"})}),u.jsxs(Qc,{className:"sm:max-w-[800px]",children:[u.jsxs(Zc,{children:[u.jsxs(Kc,{children:["Raw Data for ",v==null?void 0:v.course_name]}),u.jsx($c,{children:"This is the raw JSON data for the selected training material."})]}),u.jsx("div",{className:"max-h-[60vh] overflow-auto rounded-md bg-zinc-900 p-4 text-zinc-50",children:u.jsx("pre",{className:"text-xs",children:v?JSON.stringify(v,null,2):"No data selected"})})]})]}),u.jsxs(Du,{onOpenChange:ht=>{ht||m(null)},children:[u.jsx(zu,{asChild:!0,children:u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto",onClick:()=>m(Q),children:"Edit"})}),x&&u.jsx(oA,{material:x,onClose:()=>m(null)})]}),u.jsx(nt,{variant:"outline",className:"w-fit text-xs px-2 py-1 h-auto text-red-600 hover:text-red-700",onClick:()=>{const ht=`Delete material: ${Q.course_name} (ID: ${Q.id})`,dn=`## Delete Training Material Request -Please remove entry **ID: ${Q.id}** ("${Q.course_name}") from \`model/reproinventory_data.yaml\`.`,ot=`https://github.com/likeajumprope/ReproInventory/issues/new?title=${encodeURIComponent(ht)}&body=${encodeURIComponent(dn)}`;window.open(ot,"_blank")},children:"Delete"})]})]})]},Q.id)})}),Pt.length===0&&u.jsxs("div",{className:"text-center py-12",children:[u.jsx("div",{className:"mx-auto w-24 h-24 bg-muted rounded-full flex items-center justify-center mb-4",children:u.jsx(jg,{className:"w-8 h-8 text-muted-foreground"})}),u.jsx("h3",{className:"text-lg font-semibold mb-2",children:"No materials found"}),u.jsx("p",{className:"text-muted-foreground mb-4",children:"Try adjusting your search criteria or clearing some filters"}),u.jsx(nt,{onClick:at,children:"Clear All Filters"})]})]})]})]})]}),u.jsx($0,{})]})}function CA(){return u.jsx(AA,{})}b0.createRoot(document.getElementById("root")).render(u.jsx(S.StrictMode,{children:u.jsx(CA,{})})); +Please remove entry **ID: ${Q.id}** ("${Q.course_name}") from \`model/reproinventory_data.yaml\`.`,ot=`https://github.com/likeajumprope/ReproInventory/issues/new?labels=delete-material&title=${encodeURIComponent(ht)}&body=${encodeURIComponent(dn)}`;window.open(ot,"_blank")},children:"Delete"})]})]})]},Q.id)})}),Pt.length===0&&u.jsxs("div",{className:"text-center py-12",children:[u.jsx("div",{className:"mx-auto w-24 h-24 bg-muted rounded-full flex items-center justify-center mb-4",children:u.jsx(jg,{className:"w-8 h-8 text-muted-foreground"})}),u.jsx("h3",{className:"text-lg font-semibold mb-2",children:"No materials found"}),u.jsx("p",{className:"text-muted-foreground mb-4",children:"Try adjusting your search criteria or clearing some filters"}),u.jsx(nt,{onClick:at,children:"Clear All Filters"})]})]})]})]})]}),u.jsx($0,{})]})}function CA(){return u.jsx(AA,{})}b0.createRoot(document.getElementById("root")).render(u.jsx(S.StrictMode,{children:u.jsx(CA,{})})); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index b71ab89..e310748 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,7 +4,7 @@ ReproInventory - + diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx index 1befdd7..d3a8ec8 100644 --- a/frontend/src/components/AddMaterialDialog.tsx +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -79,7 +79,7 @@ function openGitHubIssue(material: ReproInventoryEntry) { `## New Training Material Submission\n\n` + `Please review the following training material for addition to ReproInventory.\n\n` + `\`\`\`yaml\n${yaml}\n\`\`\``; - const url = `${GITHUB_REPO}/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `${GITHUB_REPO}/issues/new?labels=new-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); } diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index bde32f5..0d62879 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -75,7 +75,7 @@ function openGitHubIssue(material: ReproInventoryEntry) { `## Edit Training Material Request\n\n` + `Please update entry **ID: ${material.id}** in \`model/reproinventory_data.yaml\` with the following:\n\n` + `\`\`\`yaml\n${yaml}\n\`\`\``; - const url = `${GITHUB_REPO}/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `${GITHUB_REPO}/issues/new?labels=edit-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); } diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index dce90fd..25e6060 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -716,7 +716,7 @@ export default function TrainingMaterialsBrowser() { const body = `## Delete Training Material Request\n\n` + `Please remove entry **ID: ${material.id}** ("${material.course_name}") from \`model/reproinventory_data.yaml\`.`; - const url = `https://github.com/likeajumprope/ReproInventory/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `https://github.com/likeajumprope/ReproInventory/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); }} > From 1e83b6df74044871979bcfb408d084b9d14b6828 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 10:45:31 -0400 Subject: [PATCH 04/14] create-pr-from-issue.yml update --- .github/workflows/create-pr-from-issue.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-pr-from-issue.yml b/.github/workflows/create-pr-from-issue.yml index 09298b3..076c030 100644 --- a/.github/workflows/create-pr-from-issue.yml +++ b/.github/workflows/create-pr-from-issue.yml @@ -57,10 +57,11 @@ jobs: fi git commit -m "${ISSUE_TITLE}" git push origin "$BRANCH" + PR_BODY="Closes #${ISSUE_NUMBER} + +Automatically generated from issue #${ISSUE_NUMBER}." gh pr create \ --title "${ISSUE_TITLE}" \ - --body "Closes #${ISSUE_NUMBER} - -Automatically generated from issue #${ISSUE_NUMBER}." \ + --body "$PR_BODY" \ --base main \ --head "$BRANCH" From 24845e688b9bf5b5da96c0e533582a1889f1717f Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 10:47:41 -0400 Subject: [PATCH 05/14] update --- .github/workflows/create-pr-from-issue.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/create-pr-from-issue.yml b/.github/workflows/create-pr-from-issue.yml index 076c030..f327012 100644 --- a/.github/workflows/create-pr-from-issue.yml +++ b/.github/workflows/create-pr-from-issue.yml @@ -58,8 +58,6 @@ jobs: git commit -m "${ISSUE_TITLE}" git push origin "$BRANCH" PR_BODY="Closes #${ISSUE_NUMBER} - -Automatically generated from issue #${ISSUE_NUMBER}." gh pr create \ --title "${ISSUE_TITLE}" \ --body "$PR_BODY" \ From 6a8252c318b5efcb65b1a7569a3db5198c5c2afa Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 10:53:46 -0400 Subject: [PATCH 06/14] update --- .github/workflows/create-pr-from-issue.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/create-pr-from-issue.yml b/.github/workflows/create-pr-from-issue.yml index f327012..a2e7451 100644 --- a/.github/workflows/create-pr-from-issue.yml +++ b/.github/workflows/create-pr-from-issue.yml @@ -57,9 +57,9 @@ jobs: fi git commit -m "${ISSUE_TITLE}" git push origin "$BRANCH" - PR_BODY="Closes #${ISSUE_NUMBER} + PR_BODY=$(printf "Closes #%s\n\nAutomatically generated from issue #%s." "${ISSUE_NUMBER}" "${ISSUE_NUMBER}") gh pr create \ --title "${ISSUE_TITLE}" \ - --body "$PR_BODY" \ + --body "${PR_BODY}" \ --base main \ - --head "$BRANCH" + --head "${BRANCH}" From 39d29c8968fcc4d8e74948c1fd26e9d60e318a97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Mar 2026 14:56:30 +0000 Subject: [PATCH 07/14] Add material: test course --- frontend/public/data/reproinventory_data.json | 34 +++++++++++-------- model/reproinventory_data.yaml | 6 ++-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json index 699bb27..f204d4d 100644 --- a/frontend/public/data/reproinventory_data.json +++ b/frontend/public/data/reproinventory_data.json @@ -1502,7 +1502,7 @@ "SS", "JB" ], - "course_name": "The Princeton Handbook for Reproducible Neuroimaging\u00b6", + "course_name": "The Princeton Handbook for Reproducible Neuroimaging¶", "url": "https://brainhack-princeton.github.io/handbook/", "level": [ "Beginner" @@ -1601,7 +1601,7 @@ ] }, { - "id": 51, + "id": 50, "tag_team": [ "CF", "SS", @@ -2027,10 +2027,10 @@ "JB" ], "course_name": "ABCD Repronim ML course", - "url": null, - "level": null, + "url": "https://www.abcd-repronim.org/ml.html", + "level": "intermediate", "platform": null, - "keywords": null, + "keywords": "Machine Learning", "course_length": "NA", "instruction_medium": null, "delivery": null, @@ -2039,18 +2039,18 @@ "neuroimaging_software": null, "imaging_modality": null, "open_dataset": "NA", - "last_updated": null, + "last_updated": 2025, "functionality": null, - "assessment": null, + "assessment": true, "prerequisite": null, "source": null, - "review": null, + "review": "3 week machone learning course", "alias_links": null, "notes": null, "quadrants": null }, { - "id": null, + "id": 61, "tag_team": [ "JB" ], @@ -2058,23 +2058,27 @@ "url": "https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html", "level": null, "platform": null, - "keywords": null, - "course_length": "NA", + "keywords": "Reproducible Pipelines, Best Practices, Data Visualization", + "course_length": null, "instruction_medium": null, "delivery": null, "language": "English", - "programming_language": null, + "programming_language": "Python", "neuroimaging_software": null, "imaging_modality": null, "open_dataset": "NA", - "last_updated": null, + "last_updated": 2025, "functionality": null, "assessment": null, "prerequisite": null, "source": null, - "review": null, + "review": "Comprehensive website describing the necessity of reproducible research and how to achieve it (notebooks, visualisation)", "alias_links": null, "notes": null, "quadrants": null + }, + { + "id": 62, + "course_name": "test course" } -] +] \ No newline at end of file diff --git a/model/reproinventory_data.yaml b/model/reproinventory_data.yaml index 70cd334..2b3c83b 100644 --- a/model/reproinventory_data.yaml +++ b/model/reproinventory_data.yaml @@ -1152,7 +1152,7 @@ - CF - SS - JB - course_name: "The Princeton Handbook for Reproducible Neuroimaging\xB6" + course_name: The Princeton Handbook for Reproducible Neuroimaging¶ url: https://brainhack-princeton.github.io/handbook/ level: - Beginner @@ -1602,7 +1602,7 @@ level: null platform: null keywords: Reproducible Pipelines, Best Practices, Data Visualization - course_length: + course_length: null instruction_medium: null delivery: null language: English @@ -1620,3 +1620,5 @@ alias_links: null notes: null quadrants: null +- id: 62 + course_name: test course From 194e7b6f146b440a4e6ea7f12e4bf87971d20d35 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 11:11:59 -0400 Subject: [PATCH 08/14] add normalizing step before recreating the json --- .github/scripts/process_issue.py | 20 +++++++++++--- frontend/public/data/reproinventory_data.json | 26 ++++++++++++------- model/reproinventory_data.yaml | 19 +++++++++----- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/.github/scripts/process_issue.py b/.github/scripts/process_issue.py index 0f4af66..c44f832 100644 --- a/.github/scripts/process_issue.py +++ b/.github/scripts/process_issue.py @@ -19,6 +19,20 @@ YAML_PATH = "model/reproinventory_data.yaml" JSON_PATH = "frontend/public/data/reproinventory_data.json" +ARRAY_FIELDS = [ + "tag_team", "level", "platform", "keywords", "instruction_medium", + "delivery", "language", "programming_language", "neuroimaging_software", + "imaging_modality", "quadrants", "source", +] + +def normalize_entry(entry): + """Ensure all array fields are lists, not scalars.""" + for field in ARRAY_FIELDS: + val = entry.get(field) + if val is not None and not isinstance(val, list): + entry[field] = [val] + return entry + label = os.environ["ISSUE_LABEL"] issue_number = os.environ["ISSUE_NUMBER"] @@ -30,7 +44,7 @@ # Load current data with open(YAML_PATH, "r", encoding="utf-8") as f: - data = yaml.safe_load(f) or [] + data = [normalize_entry(e) for e in (yaml.safe_load(f) or [])] def extract_yaml_block(body): @@ -42,7 +56,7 @@ def extract_yaml_block(body): if label == "new-material": - entry = extract_yaml_block(issue_body) + entry = normalize_entry(extract_yaml_block(issue_body)) # Assign a new numeric ID numeric_ids = [e["id"] for e in data if isinstance(e.get("id"), int)] @@ -52,7 +66,7 @@ def extract_yaml_block(body): print(f"Added new entry with ID {entry['id']}: {entry.get('course_name')}") elif label == "edit-material": - entry = extract_yaml_block(issue_body) + entry = normalize_entry(extract_yaml_block(issue_body)) entry_id = entry.get("id") replaced = False diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json index f204d4d..939a633 100644 --- a/frontend/public/data/reproinventory_data.json +++ b/frontend/public/data/reproinventory_data.json @@ -2028,9 +2028,13 @@ ], "course_name": "ABCD Repronim ML course", "url": "https://www.abcd-repronim.org/ml.html", - "level": "intermediate", + "level": [ + "Intermediate" + ], "platform": null, - "keywords": "Machine Learning", + "keywords": [ + "Machine Learning" + ], "course_length": "NA", "instruction_medium": null, "delivery": null, @@ -2058,12 +2062,20 @@ "url": "https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html", "level": null, "platform": null, - "keywords": "Reproducible Pipelines, Best Practices, Data Visualization", + "keywords": [ + "Reproducible Pipelines", + "Best Practices", + "Data Visualization" + ], "course_length": null, "instruction_medium": null, "delivery": null, - "language": "English", - "programming_language": "Python", + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], "neuroimaging_software": null, "imaging_modality": null, "open_dataset": "NA", @@ -2076,9 +2088,5 @@ "alias_links": null, "notes": null, "quadrants": null - }, - { - "id": 62, - "course_name": "test course" } ] \ No newline at end of file diff --git a/model/reproinventory_data.yaml b/model/reproinventory_data.yaml index 2b3c83b..10423a8 100644 --- a/model/reproinventory_data.yaml +++ b/model/reproinventory_data.yaml @@ -1574,9 +1574,11 @@ - JB course_name: ABCD Repronim ML course url: https://www.abcd-repronim.org/ml.html - level: intermediate + level: + - Intermediate platform: null - keywords: Machine Learning + keywords: + - Machine Learning course_length: NA instruction_medium: null delivery: null @@ -1601,12 +1603,17 @@ url: https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html level: null platform: null - keywords: Reproducible Pipelines, Best Practices, Data Visualization + keywords: + - Reproducible Pipelines + - Best Practices + - Data Visualization course_length: null instruction_medium: null delivery: null - language: English - programming_language: Python + language: + - English + programming_language: + - Python neuroimaging_software: null imaging_modality: null open_dataset: NA @@ -1620,5 +1627,3 @@ alias_links: null notes: null quadrants: null -- id: 62 - course_name: test course From 54e93766d537e24c9f972479008c64a70051127c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Mar 2026 15:12:35 +0000 Subject: [PATCH 09/14] Add material: test course --- frontend/public/data/reproinventory_data.json | 16 ++++++++++++++++ model/reproinventory_data.yaml | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json index 939a633..3803ac5 100644 --- a/frontend/public/data/reproinventory_data.json +++ b/frontend/public/data/reproinventory_data.json @@ -2088,5 +2088,21 @@ "alias_links": null, "notes": null, "quadrants": null + }, + { + "id": 62, + "course_name": "test course", + "platform": [ + "Mac" + ], + "instruction_medium": [ + "blog post" + ], + "delivery": [ + "instructor" + ], + "imaging_modality": [ + "Behavioral" + ] } ] \ No newline at end of file diff --git a/model/reproinventory_data.yaml b/model/reproinventory_data.yaml index 10423a8..122cfcc 100644 --- a/model/reproinventory_data.yaml +++ b/model/reproinventory_data.yaml @@ -1627,3 +1627,13 @@ alias_links: null notes: null quadrants: null +- id: 62 + course_name: test course + platform: + - Mac + instruction_medium: + - blog post + delivery: + - instructor + imaging_modality: + - Behavioral From 477f0caa94fe8699cab8ec0495bfc0d61d5784f1 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 11:31:59 -0400 Subject: [PATCH 10/14] changes for edit --- .../src/components/EditMaterialDialog.tsx | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index 0d62879..8f31795 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -96,11 +96,28 @@ const imagingModalityOptions: ImagingModalityEnum[] = ["DWI", "Structural", "Fun const openDatasetOptions: OpenDatasetEnum[] = ["True", "False", "NA"]; const quadrantsOptions: QuadrantsEnum[] = ["information-oriented (reference)", "understanding-oriented (explanation)", "learning-oriented (tutorials)", "problem-oriented (how to guides)", "NA"]; +const ARRAY_FIELDS: (keyof ReproInventoryEntry)[] = [ + "tag_team", "level", "platform", "keywords", "instruction_medium", + "delivery", "language", "programming_language", "neuroimaging_software", + "imaging_modality", "quadrants", "source", "prerequisite", +]; + +function normalizeMaterial(m: ReproInventoryEntry): ReproInventoryEntry { + const normalized = { ...m }; + for (const field of ARRAY_FIELDS) { + const val = normalized[field]; + if (val !== null && val !== undefined && !Array.isArray(val)) { + (normalized as any)[field] = [val]; + } + } + return normalized; +} + const EditMaterialDialog: React.FC = ({ material, onClose }) => { - const [editedMaterial, setEditedMaterial] = useState(material); + const [editedMaterial, setEditedMaterial] = useState(() => normalizeMaterial(material)); useEffect(() => { - setEditedMaterial(material); + setEditedMaterial(normalizeMaterial(material)); }, [material]); const handleChange = (field: keyof ReproInventoryEntry, value: any) => { From 1c8f170844e3dd79559be4b1a048e7066606f031 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 25 Mar 2026 11:42:38 -0400 Subject: [PATCH 11/14] update layout and edit --- frontend/src/training-materials-browser.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index 25e6060..842c3b9 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -604,17 +604,17 @@ export default function TrainingMaterialsBrowser() { {filteredMaterials.map((material) => ( -
+
{getFormatIcon(material.instruction_medium?.[0] || "")} {material.instruction_medium?.[0] || "N/A"}
- {material.assessment && Assessment} + {material.assessment && Assessment}
- {material.course_name} - {material.review} + {material.course_name} + {material.review}
@@ -659,8 +659,8 @@ export default function TrainingMaterialsBrowser() {
{material.url && ( - - Access Material + + Access Material )}
From d1252a3277b583a1c9fa665de00a3894b99cef7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Mar 2026 15:49:24 +0000 Subject: [PATCH 12/14] Edit material: Andy's brain book (ID: 58) --- frontend/public/data/reproinventory_data.json | 23 ++++--------------- model/reproinventory_data.yaml | 22 ++++-------------- 2 files changed, 9 insertions(+), 36 deletions(-) diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json index 3803ac5..8544292 100644 --- a/frontend/public/data/reproinventory_data.json +++ b/frontend/public/data/reproinventory_data.json @@ -1972,26 +1972,13 @@ ], "course_name": "Andy's brain book", "url": "https://andysbrainbook.readthedocs.io/en/latest/", - "level": null, - "platform": null, - "keywords": null, "course_length": "NA", - "instruction_medium": null, - "delivery": null, - "language": null, - "programming_language": null, - "neuroimaging_software": null, - "imaging_modality": null, + "instruction_medium": [ + "blog post", + "Hands-on tutorial / notebooks" + ], "open_dataset": "NA", - "last_updated": null, - "functionality": null, - "assessment": null, - "prerequisite": null, - "source": null, - "review": null, - "alias_links": null, - "notes": null, - "quadrants": null + "last_updated": 2026 }, { "id": 59, diff --git a/model/reproinventory_data.yaml b/model/reproinventory_data.yaml index 122cfcc..86b7b96 100644 --- a/model/reproinventory_data.yaml +++ b/model/reproinventory_data.yaml @@ -1524,26 +1524,12 @@ - JB course_name: Andy's brain book url: https://andysbrainbook.readthedocs.io/en/latest/ - level: null - platform: null - keywords: null course_length: NA - instruction_medium: null - delivery: null - language: null - programming_language: null - neuroimaging_software: null - imaging_modality: null + instruction_medium: + - blog post + - Hands-on tutorial / notebooks open_dataset: NA - last_updated: null - functionality: null - assessment: null - prerequisite: null - source: null - review: null - alias_links: null - notes: null - quadrants: null + last_updated: 2026 - id: 59 tag_team: - JB From 45c9a1c644cc0bbd8c9f445ff437f1c7f717beb5 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 1 Apr 2026 10:24:51 -0400 Subject: [PATCH 13/14] change constant links to point to the upstream repository --- frontend/src/components/AddMaterialDialog.tsx | 2 +- frontend/src/components/EditMaterialDialog.tsx | 2 +- frontend/src/training-materials-browser.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/AddMaterialDialog.tsx b/frontend/src/components/AddMaterialDialog.tsx index d3a8ec8..1e252ff 100644 --- a/frontend/src/components/AddMaterialDialog.tsx +++ b/frontend/src/components/AddMaterialDialog.tsx @@ -21,7 +21,7 @@ import type { QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; +const GITHUB_REPO = "https://github.com/ReproNim/ReproInventory"; const levelOptions: LevelEnum[] = ["Beginner", "Intermediate", "Advanced", "NA"]; const platformOptions: PlatformEnum[] = ["Mac", "Windows", "Linux", "Docker", "Jupyter", "NA"]; diff --git a/frontend/src/components/EditMaterialDialog.tsx b/frontend/src/components/EditMaterialDialog.tsx index 8f31795..c0a5f54 100644 --- a/frontend/src/components/EditMaterialDialog.tsx +++ b/frontend/src/components/EditMaterialDialog.tsx @@ -21,7 +21,7 @@ import type { QuadrantsEnum, } from "@/types/reproinventory"; -const GITHUB_REPO = "https://github.com/likeajumprope/ReproInventory"; +const GITHUB_REPO = "https://github.com/ReproNim/ReproInventory"; function formatAsYaml(material: ReproInventoryEntry): string { const lines: string[] = []; diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index 842c3b9..fba7826 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -716,7 +716,7 @@ export default function TrainingMaterialsBrowser() { const body = `## Delete Training Material Request\n\n` + `Please remove entry **ID: ${material.id}** ("${material.course_name}") from \`model/reproinventory_data.yaml\`.`; - const url = `https://github.com/likeajumprope/ReproInventory/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; + const url = `https://github.com/ReproNim/ReproInventory/issues/new?labels=delete-material&title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`; window.open(url, "_blank"); }} > From d5c41e7f63e92c9e297e9cfb230ecd2b91438022 Mon Sep 17 00:00:00 2001 From: Johanna Bayer Date: Wed, 1 Apr 2026 10:45:38 -0400 Subject: [PATCH 14/14] Update .github/scripts/process_issue.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .github/scripts/process_issue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/process_issue.py b/.github/scripts/process_issue.py index c44f832..0328e04 100644 --- a/.github/scripts/process_issue.py +++ b/.github/scripts/process_issue.py @@ -22,7 +22,7 @@ ARRAY_FIELDS = [ "tag_team", "level", "platform", "keywords", "instruction_medium", "delivery", "language", "programming_language", "neuroimaging_software", - "imaging_modality", "quadrants", "source", + "imaging_modality", "quadrants", "source", "prerequisite", ] def normalize_entry(entry):