Lightweight CSS/JS framework — modular, CDN-ready, no dependencies.
- 📦 GitHub : github.com/laurent-webdev/webdev-ui
- 🚀 CDN : jsDelivr
<!-- CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/app.css">
<!-- JS -->
<script type="module" src="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/js/bundle.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/app.min.css">
<script type="module" src="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/js/bundle.min.js"></script><!-- Variables (obligatoire en premier) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/abstracts/variables.css">
<!-- Un composant -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/button.css">
<!-- Un module JS -->
<script type="module">
import Alert from 'https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/js/alert.js';
new Alert();
</script>:root {
--color-primary: #ff6600;
--border-radius: 0.25rem;
}Remplace
@v1par@latestpour toujours avoir la dernière version (déconseillé en production).
Mini framework CSS/JS compilé via Docker + Gulp + esbuild. Aucune installation locale de Node/npm requise.
- Docker Desktop installé et lancé
project/
├── src/
│ ├── scss/
│ │ ├── abstracts/ # variables.scss, colors.scss, breakpoints.scss
│ │ ├── base/ # base.scss, reset.scss
│ │ ├── components/ # button.scss, card.scss, ...
│ │ ├── layouts/ # grid.scss, container.scss, ...
│ │ └── utilities/ # spacing.scss, display.scss, ...
│ └── js/
│ ├── alert.js
│ ├── collapse.js
│ ├── dialog.js
│ └── ...
├── app.js # Point d'entrée JS (bundle)
├── dist/ # Généré automatiquement
│ ├── css/
│ └── js/
├── Dockerfile
├── docker-compose.yml
├── package.json
└── gulpfile.js
FROM node:20-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .services:
builder:
build: .
volumes:
- ./src:/app/src
- ./dist:/app/dist{
"name": "simplecss",
"version": "1.0.0",
"scripts": {
"build": "gulp build"
},
"devDependencies": {
"gulp": "^4.0.2",
"gulp-sass": "^6.0.0",
"sass": "^1.79.0",
"gulp-clean-css": "^4.3.0",
"gulp-rename": "^2.0.0",
"esbuild": "^0.25.0",
"glob": "^10.0.0"
}
}const gulp = require('gulp');
const sass = require('sass');
const gulpSass = require('gulp-sass')(sass);
const cleanCSS = require('gulp-clean-css');
const rename = require('gulp-rename');
const esbuild = require('esbuild');
const glob = require('glob');
const IGNORE = ['!src/scss/**/_*.scss'];
// ── CSS individuel ────────────────────────────────────
function buildCSS() {
return gulp.src(['src/scss/**/*.scss', ...IGNORE])
.pipe(gulpSass({ api: 'modern' }).on('error', gulpSass.logError))
.pipe(gulp.dest('dist/css'));
}
function buildCSSMin() {
return gulp.src(['src/scss/**/*.scss', ...IGNORE])
.pipe(gulpSass({ api: 'modern' }).on('error', gulpSass.logError))
.pipe(cleanCSS())
.pipe(rename({ suffix: '.min' }))
.pipe(gulp.dest('dist/css'));
}
// ── JS individuel ─────────────────────────────────────
async function buildJS() {
const files = glob.sync('src/js/**/*.js');
await Promise.all(files.map(file => {
return esbuild.build({
entryPoints: [file],
outfile: file.replace('src/js', 'dist/js'),
bundle: false,
format: 'esm',
});
}));
}
async function buildJSMin() {
const files = glob.sync('src/js/**/*.js');
await Promise.all(files.map(file => {
return esbuild.build({
entryPoints: [file],
outfile: file.replace('src/js', 'dist/js').replace('.js', '.min.js'),
bundle: false,
minify: true,
format: 'esm',
});
}));
}
// ── JS bundle (app.js) ────────────────────────────────
async function buildJSBundle() {
await esbuild.build({
entryPoints: ['src/app.js'],
outfile: 'dist/js/bundle.js',
bundle: true,
format: 'esm',
});
}
async function buildJSBundleMin() {
await esbuild.build({
entryPoints: ['src/app.js'],
outfile: 'dist/js/bundle.min.js',
bundle: true,
minify: true,
format: 'esm',
});
}
exports.build = gulp.parallel(
buildCSS,
buildCSSMin,
buildJS,
buildJSMin,
buildJSBundle,
buildJSBundleMin
);docker compose buildÀ relancer uniquement si tu modifies
package.json,Dockerfileougulpfile.js.
docker compose run --rm builder npm run build
--rmsupprime le conteneur après l'exécution (évite l'accumulation de conteneurs morts).
dist/
├── css/
│ ├── abstracts/
│ │ └── variables.css / variables.min.css
│ ├── base/
│ │ ├── base.css / base.min.css
│ │ └── reset.css / reset.min.css
│ ├── components/
│ │ ├── button.css / button.min.css
│ │ └── ...
│ ├── layouts/
│ └── utilities/
└── js/
├── alert.js / alert.min.js
├── collapse.js / collapse.min.js
├── ...
├── bundle.js ← tout le JS en un seul fichier
└── bundle.min.js
Voir la section Installation rapide via CDN en haut du README.
L'ordre est obligatoire si tu charges les fichiers à la carte. Chaque couche dépend de la précédente.
<!-- 1. ABSTRACTS — variables CSS globales (obligatoire en premier) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/abstracts/variables.css">
<!-- 2. BASE — reset + styles HTML de base -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/base/reset.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/base/base.css">
<!-- 3. LAYOUTS — structure de page (avant les composants) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/layouts/columns.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/layouts/container.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/layouts/flex.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/layouts/grid.css">
<!-- 4. COMPONENTS — composants UI (dans n'importe quel ordre entre eux) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/accordion.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/alert.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/badge.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/button.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/card.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/collapse.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/dialog.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/dropdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/form.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/link.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/list.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/navbar.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/outline.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/sidebar.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/tab.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/components/table.css">
<!-- 5. UTILITIES — classes utilitaires (toujours en dernier, elles écrasent tout) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/animation.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/background.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/border.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/cursor.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/display.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/font.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/image.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/keyframes.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/overflow.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/position.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/shadow.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/sizing.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/spacing.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/text.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/laurent-webdev/webdev-ui@v1/dist/css/utilities/visibility.css">Règle simple à retenir :
variables→base→layouts→components→utilitiesTu peux sauter des couches entières ou des fichiers individuels, mais jamais inverser l'ordre.
- Les fichiers commençant par
_(ex:_mixins.scss) sont ignorés — ce sont des partiels. - Les fichiers
abstracts/sans_(ex:variables.scss) sont compilés car ils contiennent des CSS custom properties. - Les fichiers
abstracts/avec_(ex:_breakpoints.scss) sont ignorés car ils ne contiennent que des variables SCSS ou mixins.