Learn 3D effects in CSS/SCSS - live demos, explanations and copy-paste snippets. Pure CSS vs CSS + JS.
TypeScript
4
107 commits
updated Sep 19, 2026
A free gallery of 3D models built with CSS — each one live, with a step-by-step "how it works" and copy-paste code you can edit in the page.
Live: https://css3dlab.edgarasneverdauskas.com/
135 models in eight groups (shapes, products, text, buttons & forms, cards & galleries, loaders, scenes, data), in two honest categories:
/models/<id>/) and per group (/groups/<group>/), and the same detail in
a dialog on the home page: a larger live stage, a step-by-step explanation, and tabs with
?raw, so it cannot drift).localStorage, and can be reset. "Copy" and "Copy as one HTML file" buttons.scripts/measure-models.mjs).npm install
npm run dev
npm run build
See docs/ADDING-MODELS.md: the three parts of a model, the size limits and
the rules learned from real bugs. After a build, node scripts/qa.mjs plays every model the way
its badge promises and reports any that do not react or spill out of their card, and
node scripts/contact-sheet.mjs <id...> photographs models into one image for a visual review.
Pushing to main deploys to GitHub Pages via .github/workflows/deploy.yml.
MIT — see LICENSE. Every snippet is free to use in your own projects.
npm run media (after npm run build) screenshots every model in a headless browser into
dist/media/<id>.jpg: the social preview image (og:image) of each model page. It runs in the
deploy workflow./embed/<id>/, plus Share and Embed buttons.npm run reels -- <id...> (or --all, after npm run build) films models as 4K, 60 fps MP4s
into reels/ (not committed, not deployed): --ratio 9:16 (default, 2160 × 3840 for Reels /
Shorts / TikTok), --ratio 16:9 (3840 × 2160 for YouTube) or --ratio both. Frames are
rendered one by one with time stepped by hand, so motion is perfectly smooth; the page is laid
out at 4K (not upscaled), so 3D layers stay sharp. Quality is visually lossless (CRF 10);
--mbps 60 pins a bitrate instead. Needs ffmpeg on PATH or npm i --no-save ffmpeg-static.npm run reels -- --all --clean --scale 2 --crf 18 --jobs 3 (1080 × 1920, just
the model and a small corner mark), then
node scripts/publish-reels.mjs --all uploads them to the reels GitHub release and records
their sizes in src/reels.json; commit that file. The buttons link straight to the release
(its downloads do not count toward GitHub Pages bandwidth); the deploy fails if a listed file
is missing or a different size, so a button always has its file. Videos are never in git.107 commits
TypeScript
56.2%
SCSS
32.8%
JavaScript
5.0%
HTML
4.5%
CSS
1.5%
Learn 3D effects in CSS/SCSS - live demos, explanations and copy-paste snippets. Pure CSS vs CSS + JS.
TypeScript
4
107 commits
updated Sep 19, 2026
A free gallery of 3D models built with CSS — each one live, with a step-by-step "how it works" and copy-paste code you can edit in the page.
Live: https://css3dlab.edgarasneverdauskas.com/
135 models in eight groups (shapes, products, text, buttons & forms, cards & galleries, loaders, scenes, data), in two honest categories:
/models/<id>/) and per group (/groups/<group>/), and the same detail in
a dialog on the home page: a larger live stage, a step-by-step explanation, and tabs with
?raw, so it cannot drift).localStorage, and can be reset. "Copy" and "Copy as one HTML file" buttons.scripts/measure-models.mjs).npm install
npm run dev
npm run build
See docs/ADDING-MODELS.md: the three parts of a model, the size limits and
the rules learned from real bugs. After a build, node scripts/qa.mjs plays every model the way
its badge promises and reports any that do not react or spill out of their card, and
node scripts/contact-sheet.mjs <id...> photographs models into one image for a visual review.
Pushing to main deploys to GitHub Pages via .github/workflows/deploy.yml.
MIT — see LICENSE. Every snippet is free to use in your own projects.
npm run media (after npm run build) screenshots every model in a headless browser into
dist/media/<id>.jpg: the social preview image (og:image) of each model page. It runs in the
deploy workflow./embed/<id>/, plus Share and Embed buttons.npm run reels -- <id...> (or --all, after npm run build) films models as 4K, 60 fps MP4s
into reels/ (not committed, not deployed): --ratio 9:16 (default, 2160 × 3840 for Reels /
Shorts / TikTok), --ratio 16:9 (3840 × 2160 for YouTube) or --ratio both. Frames are
rendered one by one with time stepped by hand, so motion is perfectly smooth; the page is laid
out at 4K (not upscaled), so 3D layers stay sharp. Quality is visually lossless (CRF 10);
--mbps 60 pins a bitrate instead. Needs ffmpeg on PATH or npm i --no-save ffmpeg-static.npm run reels -- --all --clean --scale 2 --crf 18 --jobs 3 (1080 × 1920, just
the model and a small corner mark), then
node scripts/publish-reels.mjs --all uploads them to the reels GitHub release and records
their sizes in src/reels.json; commit that file. The buttons link straight to the release
(its downloads do not count toward GitHub Pages bandwidth); the deploy fails if a listed file
is missing or a different size, so a button always has its file. Videos are never in git.107 commits
TypeScript
56.2%
SCSS
32.8%
JavaScript
5.0%
HTML
4.5%
CSS
1.5%