Example project
Example project with Next.js and TypeScript is found here.
next.config.js
next.config.js
Copy
const { generateScopedName, hash } = require("@camome/utils");
/** @type {import('next').NextConfig} */const nextConfig = { reactStrictMode: true, transpilePackages: ["@camome/core"], webpack: (config) => { // Generate static class names for `@camome/core`. // There's no way to do so without messing up like this. config.module.rules .find(({ oneOf }) => !!oneOf) .oneOf.filter(({ use }) => JSON.stringify(use)?.includes("css-loader")) .reduce((acc, { use }) => acc.concat(use), []) .forEach(({ options }) => { if (options?.modules) { options.modules.getLocalIdent = ( context, localIdentName, localName ) => { const filename = context.resourcePath; // @camome/core depends on static class names // but your own module classes won't. if (!filename.match(/@camome\/core/)) { // Whatever. `hash()` doesn't have any special effect. return localName + "-" + hash(filename); } return generateScopedName(localName, filename); }; } });
return config; },};
module.exports = nextConfig;
import CSS
_app.tsx
Copy
import "@camome/system/dist/theme.css";import "@/styles/globals.css";import type { AppProps } from "next/app";
export default function App({ Component, pageProps }: AppProps) { return <Component {...pageProps} />;}
globals.css
Copy
/* Guaranteed override */.Button { border-radius: 999px;}
page.tsx
Copy
import { Button } from "@camome/core/Button";
export default function HomePage() { return <Button>Button</Button>;}