Skip to content

Commit de1e6c9

Browse files
committed
Optimization attempt
1 parent d468a97 commit de1e6c9

File tree

9 files changed

+120
-688
lines changed

9 files changed

+120
-688
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,11 @@ types/
2626

2727
storybook-static
2828
*storybook.log
29+
30+
dist
31+
*.local
32+
.env
33+
.env.*
34+
!.env.example
35+
coverage
36+
.vite

examples/sbanky/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export default defineConfig({
7979
less: {
8080
javascriptEnabled: true,
8181
math: 'always',
82-
additionalData: '@import "@sb1/ffe-core/less/colors.less";'
82+
additionalData: '@import "@sb1/ffe-core/less/ffe.less";'
8383
}
8484
}
8585
}

examples/sbanky/package.json

+15-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
"preview": "vite preview",
99
"prebuild": "node scripts/collect-less.js"
1010
},
11+
"type": "module",
1112
"keywords": [],
1213
"author": "",
1314
"license": "ISC",
1415
"description": "",
1516
"dependencies": {
17+
"@sb1/ffe-accordion": "^11.1.0",
1618
"@sb1/ffe-account-selector-react": "^30.1.7",
1719
"@sb1/ffe-buttons": "^19.1.0",
1820
"@sb1/ffe-buttons-react": "^24.0.27",
@@ -43,9 +45,20 @@
4345
"@sb1/ffe-system-message-react": "^11.0.24",
4446
"@sb1/ffe-tables-react": "^11.0.18",
4547
"@sb1/ffe-tabs-react": "^10.0.15",
46-
"glob": "^11.0.0",
47-
"less": "^4.2.1",
48+
"@sb1/ffe-webfonts": "^5.0.13",
49+
"postcss-preset-env": "^10.1.3",
4850
"react": "^18.3.1",
4951
"react-dom": "^18.3.1"
52+
},
53+
"devDependencies": {
54+
"@fullhuman/postcss-purgecss": "^5.0.0",
55+
"@types/node": "^20.11.0",
56+
"@vitejs/plugin-react": "^4.2.1",
57+
"glob": "^10.3.10",
58+
"less": "^4.2.0",
59+
"postcss": "^8.4.31",
60+
"typescript": "^5.3.3",
61+
"vite": "^6.0.7",
62+
"vite-plugin-static-copy": "^2.2.0"
5063
}
5164
}

examples/sbanky/src/App.tsx

+14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Grid, GridRow, GridCol } from '@sb1/ffe-grid-react';
22
import { ButtonsDemo } from './components/ButtonsDemo';
33
import { Wave } from '@sb1/ffe-core-react';
44
import { ContextMessage } from '@sb1/ffe-messages-react';
5+
import { Accordion, AccordionItem } from '@sb1/ffe-accordion-react';
56

67
export const SbankyWave = () => (
78
<div className="sbanky-wave-wrapper">
@@ -38,6 +39,19 @@ const App = () => {
3839
}
3940
/>
4041
</GridCol>
42+
<GridCol md={{ cols: 12 }} lg={{ cols: 12 }}>
43+
<Accordion headingLevel={2}>
44+
<AccordionItem heading="Tittel">
45+
Skjult innhold
46+
</AccordionItem>
47+
<AccordionItem heading={<span>Enda en tittel</span>}>
48+
Mer skjult innhold
49+
</AccordionItem>
50+
<AccordionItem heading="En siste tittel">
51+
Enda mer innhold
52+
</AccordionItem>
53+
</Accordion>
54+
</GridCol>
4155
</GridRow>
4256
</Grid>
4357
);

examples/sbanky/src/styles/main.less

-15
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,3 @@
1-
@import '@sb1/ffe-core/less/spacing';
2-
@import '@sb1/ffe-core/less/breakpoints';
3-
// Variables
4-
@import '@sb1/ffe-core/less/colors';
5-
@import '@sb1/ffe-core/less/breakpoints';
6-
@import '@sb1/ffe-core/less/dimensions';
7-
@import '@sb1/ffe-core/less/motion';
8-
@import '@sb1/ffe-core/less/spacing';
9-
@import '@sb1/ffe-core/less/theme';
10-
11-
// Basic ypography
12-
@import '@sb1/ffe-core/less/typography';
13-
// Accessbility helpers
14-
@import '@sb1/ffe-core/less/accessibility';
15-
161
.sbanky-home-grid {
172
background-color: @ffe-farge-frost-30;
183
height: 100%;

examples/sbanky/tsconfig.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
"noFallthroughCasesInSwitch": true,
1818
"baseUrl": ".",
1919
"paths": {
20-
"@/*": ["src/*"],
21-
"@components/*": ["src/components/*"],
22-
"@styles/*": ["src/styles/*"]
20+
"@/*": ["./src/*"],
21+
"@src/*": ["./src/*"],
22+
"@components/*": ["./src/components/*"],
23+
"@styles/*": ["./src/styles/*"]
2324
}
2425
},
2526
"include": ["src"],

examples/sbanky/vite.config.ts

+75-63
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,91 @@
1-
// vite.config.ts
21
import { defineConfig } from 'vite';
2+
import type { UserConfig, PluginOption } from 'vite';
33
import react from '@vitejs/plugin-react';
44
import { resolve } from 'path';
55
import { glob } from 'glob';
6+
import purgecss from '@fullhuman/postcss-purgecss';
67

7-
// Function to collect all FFE LESS imports
88
async function collectFfeImports() {
9-
try {
10-
const nodeModulesPath = resolve(__dirname, 'node_modules/@sb1');
11-
console.log('Searching for LESS files in:', nodeModulesPath);
12-
13-
const lessFiles = await glob('**/less/*.less', {
14-
cwd: nodeModulesPath,
15-
ignore: ['**/node_modules/**'],
16-
absolute: false,
17-
});
18-
19-
console.log('Found LESS files:', lessFiles);
20-
21-
// Start with core colors as it's a dependency for other components
22-
const imports = ['@import "@sb1/ffe-core/less/colors";'];
23-
24-
// Add all other FFE imports, excluding core colors
25-
for (const file of lessFiles) {
26-
// Skip if it's colors.less since we already imported it
27-
if (!file.includes('ffe-core/less/colors.less')) {
28-
// Remove the .less extension for the import
29-
const importPath = file.replace('.less', '');
30-
imports.push(`@import "@sb1/${importPath}";`);
31-
}
9+
const nodeModulesPath = resolve(__dirname, 'node_modules/@sb1');
10+
const lessFiles = await glob('**/less/*.less', {
11+
cwd: nodeModulesPath,
12+
ignore: ['**/node_modules/**'],
13+
});
14+
const imports = ['@import "@sb1/ffe-core/less/colors";'];
15+
for (const file of lessFiles) {
16+
if (!file.includes('ffe-core/less/variables.less')) {
17+
const importPath = file.replace('.less', '');
18+
imports.push(`@import "@sb1/${importPath}";`);
3219
}
33-
34-
const finalImports = imports.join('\n');
35-
console.log('Generated imports:', finalImports);
36-
37-
return finalImports;
38-
} catch (error) {
39-
console.error('Error collecting FFE imports:', error);
40-
// Return just the core colors import as fallback
41-
return '@import "@sb1/ffe-core/less/colors";';
4220
}
21+
return imports.join('\n');
4322
}
4423

45-
export default defineConfig(async () => ({
46-
plugins: [react()],
47-
server: {
48-
port: 3000,
49-
open: true,
50-
},
51-
css: {
52-
preprocessorOptions: {
53-
less: {
54-
javascriptEnabled: true,
55-
math: 'always',
56-
additionalData: await collectFfeImports(),
24+
export default defineConfig(async () => {
25+
const { viteStaticCopy } = await import('vite-plugin-static-copy');
26+
const config: UserConfig = {
27+
plugins: [
28+
react() as PluginOption,
29+
viteStaticCopy({
30+
targets: [
31+
{
32+
src: 'node_modules/@sb1/**/fonts/*',
33+
dest: 'assets/fonts',
34+
},
35+
],
36+
}) as PluginOption,
37+
],
38+
css: {
39+
preprocessorOptions: {
40+
less: {
41+
javascriptEnabled: true,
42+
math: 'always',
43+
additionalData: await collectFfeImports(),
44+
paths: [resolve(__dirname, 'node_modules')],
45+
},
46+
},
47+
postcss: {
48+
plugins: [
49+
purgecss({
50+
content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
51+
defaultExtractor: content =>
52+
content.match(/[\w-/:]+(?<!:)/g) || [],
53+
safelist: {
54+
standard: [
55+
/^ffe-/,
56+
/^sb1-/,
57+
'js-focus-visible',
58+
/^data-/,
59+
/^aria-/,
60+
],
61+
deep: [/ffe-.+$/, /sb1-.+$/],
62+
greedy: [/^ffe-.*$/, /^sb1-.*$/, /^js-.*$/],
63+
keyframes: [/^ffe-/, /^sb1-/],
64+
variables: [/^--ffe-/, /^--sb1-/],
65+
},
66+
}),
67+
],
5768
},
5869
},
59-
},
60-
resolve: {
61-
alias: {
62-
'@src': resolve(__dirname, './src'),
63-
'@components': resolve(__dirname, './src/components'),
64-
'@styles': resolve(__dirname, './src/styles'),
70+
resolve: {
71+
alias: {
72+
'@': resolve(__dirname, 'src'),
73+
'@src': resolve(__dirname, 'src'),
74+
'@components': resolve(__dirname, 'src/components'),
75+
'@styles': resolve(__dirname, 'src/styles'),
76+
},
6577
},
66-
},
67-
build: {
68-
outDir: 'dist',
69-
sourcemap: true,
70-
rollupOptions: {
71-
output: {
72-
manualChunks: {
73-
'react-vendor': ['react', 'react-dom'],
74-
'sb1-core': ['@sb1/ffe-core', '@sb1/ffe-core-react'],
78+
build: {
79+
rollupOptions: {
80+
output: {
81+
manualChunks: {
82+
'react-vendor': ['react', 'react-dom'],
83+
'sb1-core': ['@sb1/ffe-core', '@sb1/ffe-core-react'],
84+
},
7585
},
7686
},
87+
cssCodeSplit: true,
7788
},
78-
},
79-
}));
89+
};
90+
return config;
91+
});

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"@axe-core/playwright": "^4.9.0",
4848
"@commitlint/cli": "^19.3.0",
4949
"@commitlint/config-conventional": "^19.2.2",
50+
"@fullhuman/postcss-purgecss": "^7.0.2",
5051
"@playwright/test": "^1.43.1",
5152
"@storybook/addon-essentials": "^8.2.7",
5253
"@storybook/addon-interactions": "^8.2.7",
@@ -85,7 +86,8 @@
8586
"rimraf": "^6.0.1",
8687
"storybook": "^8.2.7",
8788
"typescript": "^5.7.2",
88-
"vite": "^6.0.7"
89+
"vite": "^6.0.7",
90+
"vite-plugin-static-copy": "^2.2.0"
8991
},
9092
"eslintConfig": {
9193
"extends": [

0 commit comments

Comments
 (0)