Skip to content

Commit 8ea5903

Browse files
committed
refactor(eds-core-react): 🎨 introduce global CSS architecture
- Create centralized styles.css file to prevent duplicate CSS imports - Import styles.css in main index.ts entry point - Remove CSS import from Input.new.tsx component file - Add styles.css export to package.json exports - Update Storybook preview to import global styles - Add CSS_ARCHITECTURE.md documentation - Fix lab package jest config to transform style-inject module Benefits: - No duplicate CSS when users import components - Single CSS bundle improves performance - Easier maintenance with centralized CSS imports - Automatic tree-shaking support
1 parent ca1823e commit 8ea5903

6 files changed

Lines changed: 85 additions & 3 deletions

File tree

β€Žpackages/eds-core-react/.storybook/preview.mjsβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import './preview.css'
2+
import '../src/styles.css'
23

34
const preview = {
45
viewMode: 'docs',
@@ -24,6 +25,6 @@ const preview = {
2425
},
2526
},
2627

27-
tags: ['autodocs']
28+
tags: ['autodocs'],
2829
}
2930
export default preview
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Global CSS Architecture
2+
3+
## Overview
4+
5+
Component CSS is now centralized in a global `styles.css` file to prevent duplicate CSS imports when users consume the library.
6+
7+
## Structure
8+
9+
```
10+
src/
11+
β”œβ”€β”€ styles.css # Global CSS entry point
12+
β”œβ”€β”€ index.ts # Imports styles.css once
13+
└── components/
14+
└── Input/
15+
β”œβ”€β”€ Input.new.tsx # No CSS import
16+
└── Input.new.css # Styles imported via styles.css
17+
```
18+
19+
## How It Works
20+
21+
1. **Component CSS files** (`Input.new.css`) contain the styles
22+
2. **Global styles.css** imports all component CSS files
23+
3. **Main index.ts** imports `styles.css` once
24+
4. **Users** get all CSS automatically when they import any component
25+
26+
## Benefits
27+
28+
βœ… **No duplicate CSS** - CSS is imported once at the package level
29+
βœ… **Automatic tree-shaking** - Bundlers can optimize unused CSS
30+
βœ… **Better performance** - Single CSS import instead of per-component
31+
βœ… **Easier maintenance** - All CSS imports in one place
32+
33+
## Adding New Components
34+
35+
When creating a new component with CSS:
36+
37+
1. Create the component CSS file (e.g., `Button.new.css`)
38+
2. Add import to `src/styles.css`:
39+
```css
40+
@import './components/Button/Button.new.css';
41+
```
42+
3. **Do NOT** import CSS in the component `.tsx` file
43+
44+
## Storybook Configuration
45+
46+
The `.storybook/preview.mjs` imports the global CSS file:
47+
48+
```javascript
49+
import './preview.css'
50+
import '../src/styles.css' // Global component styles
51+
```
52+
53+
This ensures all component styles are available in Storybook stories.
54+
55+
## User Consumption
56+
57+
Users automatically get all CSS when importing components:
58+
59+
```tsx
60+
// This imports both the component AND all CSS
61+
import { InputNew } from '@equinor/eds-core-react'
62+
```
63+
64+
Alternatively, users can import just the CSS if needed:
65+
66+
```tsx
67+
import '@equinor/eds-core-react/styles.css'
68+
```
69+
70+
## Package Configuration
71+
72+
The `package.json` includes:
73+
74+
- `"sideEffects": ["**/*.css"]` - Preserves CSS imports during tree-shaking
75+
- `"./styles.css": "./dist/esm/styles.css"` - Exports CSS separately if needed

β€Žpackages/eds-core-react/package.jsonβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
"types": "./dist/types/index.d.ts",
3131
"import": "./dist/esm/index.js",
3232
"require": "./dist/eds-core-react.cjs"
33-
}
33+
},
34+
"./styles.css": "./dist/esm/styles.css"
3435
},
3536
"scripts": {
3637
"build": "rollup -c && tsc -p tsconfig.build.json",

β€Žpackages/eds-core-react/src/index.tsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
'use client'
2+
import './styles.css'
23
/* eslint-disable import/prefer-default-export */
34
export * from './components/Button'
45
export * from './components/Typography'
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/* Global styles for @equinor/eds-core-react */
2+
3+
/* Component styles */
4+
@import './components/Input/Input.new.css';

β€Žpackages/eds-lab-react/jest.config.cjsβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ module.exports = {
1616
testRegex: '(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$',
1717
moduleFileExtensions: ['ts', 'tsx', 'js'],
1818
testEnvironment: 'jest-environment-jsdom',
19-
transformIgnorePatterns: ['node_modules/(?!.pnpm|ramda)'],
19+
transformIgnorePatterns: ['node_modules/(?!.pnpm|ramda|style-inject)'],
2020
testPathIgnorePatterns: ['/dist/'],
2121
}

0 commit comments

Comments
Β (0)