apps/web ↔ @pambe/ui
apps/web consomme le design system via le workspace package @pambe/ui,
pas via des copies locales :
apps/web/next.config.mjsliste@pambe/uidanstranspilePackages→ Next compile le TS/TSX du package directement depuis les sources.apps/web/tsconfig.jsonmappe@pambe/ui/*→../../packages/ui/src/*et@/*→./*.- Le
package.jsonde@pambe/uiexpose des sous-chemins :./components/*,./lib/*,./hooks/*,./globals.css. On importe@pambe/ui/components/button,@pambe/ui/lib/utils, etc. - Les styles Tailwind v4 vivent dans
packages/ui/src/styles/globals.css, importés une seule fois depuisapps/web/app/layout.tsx.
Ajouter un composant shadcn
Depuis la racine, en ciblant l'app web (les composants atterrissent dans
packages/ui/src/components) :
pnpm dlx shadcn@latest add <component> -c apps/web
Puis import { X } from "@pambe/ui/components/<name>" dans n'importe quelle app.
next.config.mjs
Outre transpilePackages (ci-dessus) et output: "standalone" (image Docker
minimale), la config porte des réglages perf :
images.formats: ["image/avif", "image/webp"]— l'optimizer sert de l'AVIF (puis WebP) plutôt que les PNG/WebP sources : payloads plus légers sur mobile.experimental.optimizePackageImports: ["lucide-react"]— tree-shake les imports d'icônes (seuls les glyphes utilisés sont embarqués).
Côté app/layout.tsx, les polices passent par next/font (display: "swap") :
Plus Jakarta Sans (corps) et Manrope (titres). Le script Microsoft Clarity est
chargé en lazyOnload.
Héritage de config
- TS : les workspaces étendent
@pambe/typescript-config/base.jsonounextjs.json.apps/apia son propretsconfig(NodeNext +jsx: react-jsxavecjsxImportSource: hono/jsx).apps/docsétend@docusaurus/tsconfig(cas à part). - ESLint : flat config. Le
.eslintrc.jsracine ne fait que poser les ignores ; leseslint.config.jspar workspace font autorité.eslint-plugin-only-warnfait remonter la plupart des échecs en warnings. - Prettier :
.prettierrcracine —semi: false, double quotes,printWidth: 80, plugin Tailwind aveccn/cvareconnus.
Détails normatifs : Conventions.