❓ Troubleshooting Guide
This guide provides solutions to common issues encountered when integrating, building, and styling Nodeblocks frontend components.
🎨 Broken, Plain, or "Bad" Styles
Symptom
Components render on screen but look completely unstyled. Buttons appear as plain HTML buttons, margins are misaligned, colors are wrong, or default Material-UI elements render instead of the official Basal-branded interface.
Root Cause
Nodeblocks frontend components are styled on top of a unified, customized Material-UI (MUI) design system. If you render blocks without registering the design system at your application's root, they will fallback to unstyled primitives.
Solution
Wrap your React application's root (typically main.tsx, index.tsx, or App.tsx) with the <ThemeProvider> and defaultTheme provided by @nodeblocks/frontend-theme (sourced from @nodeblocks-frontend-blocks/packages/theme/src).
Implementation Example
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import {ThemeProvider, defaultTheme} from '@nodeblocks/frontend-theme';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<ThemeProvider theme={defaultTheme}>
<App />
</ThemeProvider>
</React.StrictMode>,
);
🌐 Server-Side Rendering (SSR) & Hydration Failures
Symptom
When using SSR-based frameworks (like Next.js, Remix, or Docusaurus), builds fail with errors like:
ReferenceError: window is not defined
Or you experience hydration mismatch warnings in the browser console.
Root Cause
Some sub-dependencies and rich interactive blocks access browser-only globals (such as window, document, or navigator) during instantiation, which are unavailable in a Node.js server context.
Solution
In Next.js, use next/dynamic with ssr: false to force client-side rendering:
import dynamic from 'next/dynamic';
const ListUsers = dynamic(() => import('@nodeblocks/frontend-list-users-block').then(mod => mod.ListUsers), {
ssr: false,
});
export default function MyPage() {
return <ListUsers data={[]} listUsersTitle="Members" labels={{}} />;
}
📦 Missing Peer Dependency Errors
Symptom
Installing a Nodeblocks package throws warnings/errors during npm install or yields compilation failures such as:
Module not found: Can't resolve '@mui/material' or @emotion/react
Root Cause
To optimize bundle sizes and avoid multiple versions of the same library in your application, Nodeblocks leaves core UI engines (like Material-UI and Emotion) as peer dependencies. You must supply these peer packages yourself.
Solution
Make sure you have installed the required Material-UI and Emotion engine peer dependencies:
# npm
npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
# yarn
yarn add @mui/material @mui/icons-material @emotion/react @emotion/styled
# pnpm
pnpm add @mui/material @mui/icons-material @emotion/react @emotion/styled
🛑 Action / Click Event Handlers Not Firing
Symptom
Clicking tabs, page changes, searching, or deleting chip filters does not change the table data or update the UI state.
Root Cause
Nodeblocks blocks are built as presentational (stateless) components to allow maximum layout control. They do not maintain internal lists, search keyword states, active tab states, or page counts.
Solution
You must capture events inside callback props (such as onTabChange, onPageChange, onSearchFieldChange, onSearchSubmit) and update your local react state, which is then passed back down as props.
See the code examples in each block's page (e.g. List Users → Quick Start) to see how to hook up these state bindings.