Vibeded is a Vite + React field guide for Grounded 2. It presents category-based catalog data for armor, creatures, mutations, resources, statuses, trinkets, and weapons with search, filters, and persistent crafted-item state.
- Category tabs for the main Grounded 2 collections
- Search and facet-style filtering across item metadata
- Crafted-state tracking persisted in
localStorage - Data-driven rendering from static JSON files
- Storybook coverage for the shared UI and catalog components
Install dependencies:
npm installStart the app locally:
npm run devRun a production build:
npm run buildRun the repository linter:
npm run lintRun Storybook locally:
npm run storybookBuild Storybook for deployment or review:
npm run build-storybookThis repository deploys the Vite production build with the GitHub Actions workflow in .github/workflows/deploy.yml. To enable deployment:
- In the repository settings, open Pages → Build and deployment and set Source to GitHub Actions.
- Push or merge a change to
main, or run Deploy to GitHub Pages manually from the Actions tab. - When the workflow finishes, open the published site at
https://<owner>.github.io/vibeded/. The deployed URL is also shown in the workflow'sgithub-pagesenvironment.
The Vite base path is set to /vibeded/ in vite.config.js for this repository's project site. If the repository is renamed, update the base path to match its new URL path. For a site served from a custom domain or the account's root Pages site, use / instead.
There is no dedicated automated test runner configured in this repository. For targeted linting of a single file, run the repo linter directly:
npx oxlint src/components/ArmorList/ArmorList.jsxThe app is intentionally organized around reusable list components and shared data helpers:
src/main.jsxmounts the React app and loads the global Open Props style layer.src/components/App/App.jsxrenders the app shell and wraps it inFieldGuideProvider.src/components/Tabs/Tabs.jsxcontrols the category navigation.src/context/FieldGuideContext.jsxstores checkbox state and persists it tolocalStorageundergrounded2FieldGuideData.src/data/*.jsonis the source of truth for item content for each catalog section.src/components/*List/*.jsxread JSON data, derive filter values, and render category views.src/utils/listFilterUtils.jscentralizes filtering and normalization logic used by multiple lists.src/stories/Components.stories.jsxdocuments important UI states and uses the same fixtures as the app.
- Keep catalog data in
src/data/*.jsonand keep presentation logic in components. - Reuse the shared filter helpers in
src/utils/listFilterUtils.jsinstead of repeating inline logic in each list. - Preserve the checkbox key naming pattern used across the app:
name.toLowerCase().replace(/[^a-z0-9]+/g, '-'). - Use the shared React context for crafted-item toggles rather than introducing another global state layer for simple checkboxes.
- Keep styling consistent with the existing Vite + Open Props setup: import
open-props/styleat the app root and keep local styles near the component they affect. - This repo is JavaScript-first; new files should follow the existing
.jsxand.jsconventions unless a different language is already in use.
When adding new content or tabs, follow this pattern:
- Add or update the category data in
src/data/*.json - Create or extend a matching list component under
src/components/ - Reuse the shared filter helpers for the new category
- Register the category in
src/components/Tabs/Tabs.jsx
This keeps the app consistent with the existing data-driven structure.
To add a new catalog section, mirror the established combination of data + list UI + filters + tab registration:
- Add the source data file under
src/data/with the same JSON shape used by neighboring categories. - Create a list component such as
src/components/ExampleList/ExampleList.jsxthat imports the JSON, derives filter values, and renders the item cards. - Reuse
src/utils/listFilterUtils.jsfor normalization, unique filter values, facet counts, and matching logic rather than hard-coding custom logic in the list. - Wire the new list into
src/components/Tabs/Tabs.jsxand add any category-specific styling alongside the component or in the shared stylesheet pattern. - Validate with
npm run lintand, for UI changes, runnpm run buildor review innpm run storybookwhen the change affects rendering or shared filters.