Skip to main content

Configuration

This React library provides powerful configuration capabilities through the ConfigProvider component, enabling global settings that affect all child components. The primary use case is CSS class prefixing for namespace management and framework integration.

Overview

The ConfigProvider component uses React Context to provide configuration settings to all child components. Currently, it supports class prefixing, which allows you to namespace all Bulma CSS classes with a custom prefix.

Why Use Configuration?

Configuration is essential for maintaining organized, conflict-free CSS architecture in modern web applications. While not always necessary, it becomes crucial when integrating multiple CSS frameworks or when you need organized, namespaced CSS that follows your project's conventions.

CSS Class Prefixing

CSS class prefixing adds a namespace to all Bulma classes, transforming them from standard names to prefixed versions:

  • button becomes bulma-button
  • box becomes bulma-box
  • title becomes bulma-title

This helps avoid conflicts with other CSS frameworks and provides better organization.

Basic Usage

Standard Configuration

import { ConfigProvider, Button, Box, Title } from '@allxsmith/bestax-bulma';
import 'bulma/css/versions/bulma-prefixed.min.css';

function App() {
return (
<ConfigProvider classPrefix="bulma-">
<Box p="4">
<Title size="4">Prefixed Components</Title>
<Button color="primary">Prefixed Button</Button>
</Box>
</ConfigProvider>
);
}

This renders HTML with prefixed CSS classes:

<div class="bulma-box p-4">
<h4 class="bulma-title is-4">Prefixed Components</h4>
<button class="bulma-button is-primary">Prefixed Button</button>
</div>

Framework Integration

When using multiple CSS frameworks, prefixing prevents class name conflicts:

function MultiFrameworkApp() {
return (
<div>
{/* Bootstrap section */}
<div className="card p-4 mb-4">
<h4 className="card-title">Bootstrap Components</h4>
<button className="btn btn-primary">Bootstrap Button</button>
</div>

{/* Prefixed Bulma section */}
<ConfigProvider classPrefix="bulma-">
<Box p="4">
<Title size="4">Bulma Components</Title>
<Button color="primary">Bulma Button</Button>
</Box>
</ConfigProvider>
</div>
);
}

Official Prefixed Bulma CSS

Bulma v1 provides official prefixed CSS files that you can use directly:

// Using official prefixed Bulma CSS
import 'bulma/css/versions/bulma-prefixed.min.css';

function App() {
return (
<ConfigProvider classPrefix="bulma-">
<Button color="primary">Uses bulma-button class</Button>
</ConfigProvider>
);
}

Custom Prefix Builds

For teams building custom Bulma CSS with their own prefixes:

1. Install Dependencies

npm install bulma sass

2. Create Custom Sass File

src/styles/mycompany-bulma.scss
@use 'bulma/sass' with (
$class-prefix: 'mycompany-'
);

3. Configure Your Application

src/App.tsx
import { ConfigProvider, Button, Box } from '@allxsmith/bestax-bulma';
import './styles/mycompany-bulma.scss';

function App() {
return (
<ConfigProvider classPrefix="mycompany-">
<Box>
<Button color="primary">Custom Prefixed Button</Button>
</Box>
</ConfigProvider>
);
}

Advanced Configuration

Nested Providers

ConfigProviders can be nested, with inner providers overriding outer settings:

function NestedConfiguration() {
return (
<ConfigProvider classPrefix="outer-">
<Box p="4">
<Title>Outer Prefix (outer-)</Title>

<ConfigProvider classPrefix="inner-">
<Box p="4" mt="3">
<Title>Inner Prefix (inner-)</Title>
<Button color="primary">Inner Button</Button>
</Box>
</ConfigProvider>

<Button color="info" mt="3">
Outer Button
</Button>
</Box>
</ConfigProvider>
);
}

Using Configuration in Custom Components

Access configuration values in your own components:

import { useConfig } from '@allxsmith/bestax-bulma';

function CustomComponent() {
const { classPrefix } = useConfig();
const className = classPrefix
? `${classPrefix}custom-component`
: 'custom-component';

return (
<div className={className}>
Custom component with prefix: {classPrefix || 'none'}
</div>
);
}

Configuration Hooks

The library provides hooks for accessing configuration:

useConfig

Returns the complete configuration context:

import { useConfig } from '@allxsmith/bestax-bulma';

function MyComponent() {
const { classPrefix } = useConfig();
// Use configuration values
}

useClassPrefix

Convenience hook that returns just the class prefix:

import { useClassPrefix } from '@allxsmith/bestax-bulma';

function MyComponent() {
const classPrefix = useClassPrefix(); // Returns prefix or empty string
}

Use Cases

Multi-tenant Applications

Different tenants can have different styling namespaces:

function TenantApp({ tenantName }) {
return (
<ConfigProvider classPrefix={`${tenantName}-`}>
<App />
</ConfigProvider>
);
}

Component Library Wrapping

When creating your own component library that wraps Bulma:

function MyLibraryProvider({ children }) {
return <ConfigProvider classPrefix="mylib-">{children}</ConfigProvider>;
}

Legacy System Integration

When integrating with existing systems that have their own CSS:

function LegacyIntegration() {
return (
<ConfigProvider classPrefix="bulma-">
<ModernBulmaUI />
</ConfigProvider>
);
}

Best Practices

  1. Set at the root level: Apply ConfigProvider at the highest level of your component tree for consistency
  2. Use consistent prefixes: Choose a prefix and stick with it throughout your application
  3. Match CSS and React: Ensure your CSS prefix matches your ConfigProvider prefix
  4. Document your choice: Make sure your team understands why and how you're using prefixes

Integration with Other Features

ConfigProvider works seamlessly with other library features:

function CompleteSetup() {
return (
<ConfigProvider classPrefix="bulma-">
<Theme primaryH="270" primaryS="100%" primaryL="50%" isRoot>
<App />
</Theme>
</ConfigProvider>
);
}

For detailed API documentation and more examples, see the ConfigProvider API reference.