Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@designcodeio/threeui",
"version": "1.1.0",
"version": "1.2.0",
"description": "Open-source React components and interactive templates from ThreeUI Community.",
"license": "MIT",
"type": "module",
Expand Down
130 changes: 116 additions & 14 deletions public/community-sync-report.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"schemaVersion": 1,
"generatedAt": "2026-08-25T10:26:00.704Z",
"sourceCommit": "bab60dad20e2290cf8e35753bf4fec14c017567e",
"generatedAt": "2026-08-31T16:05:46.996Z",
"sourceCommit": "6b65f2dbec22ac58c56474f028aec5590e62d3c9",
"communityParents": 43,
"communityRoutes": 104,
"communityVariants": 147,
"excludedProParents": 86,
"communityVariants": 163,
"excludedProParents": 108,
"excludedBetaParents": 23,
"layoutStylesSha256": "5400401f66eb773d05a7b22a6e2fd16651b732a5bd366eee1ab8b479e0327f0d",
"rendererStylesSha256": "6d975e7d3332aa85d7bc1a55cdff592d63b0403f0988dfefa905dbe4c341d328",
"layoutStylesSha256": "cee8ebe47ad857149f52f12bb12324a83856fc403ea1431f238aec4ecc385760",
"rendererStylesSha256": "dc36aeb914df4c554164304292d75738a770e454b1e2710bac1ce4169d5fee2a",
"components": [
{
"id": "kage-landing-page",
Expand Down Expand Up @@ -136,7 +136,12 @@
},
{
"id": "crt",
"variantIds": [],
"variantIds": [
"terminal",
"cinematic",
"blue-screen",
"nintendo"
],
"controlKeys": [
"speed",
"typeSpeed",
Expand All @@ -146,7 +151,41 @@
"brightness",
"opacity"
],
"variantControlKeys": {}
"variantControlKeys": {
"terminal": [
"speed",
"typeSpeed",
"motion",
"hue",
"saturation",
"brightness",
"opacity"
],
"cinematic": [
"speed",
"motion",
"hue",
"saturation",
"brightness",
"opacity"
],
"blue-screen": [
"speed",
"motion",
"hue",
"saturation",
"brightness",
"opacity"
],
"nintendo": [
"speed",
"motion",
"hue",
"saturation",
"brightness",
"opacity"
]
}
},
{
"id": "energy-orb",
Expand Down Expand Up @@ -769,13 +808,23 @@
},
{
"id": "woven-cloth",
"variantIds": [],
"variantIds": [
"woven-cloth",
"iridescent",
"atelier",
"washi"
],
"controlKeys": [
"hue",
"saturation",
"brightness"
],
"variantControlKeys": {}
"variantControlKeys": {
"woven-cloth": [],
"iridescent": [],
"atelier": [],
"washi": []
}
},
{
"id": "performance-gauges",
Expand Down Expand Up @@ -863,7 +912,12 @@
},
{
"id": "animated-top-dock",
"variantIds": [],
"variantIds": [
"sable",
"modern",
"retro",
"glass"
],
"controlKeys": [
"proximity",
"spring",
Expand All @@ -872,7 +926,44 @@
"heightGrowth",
"drop"
],
"variantControlKeys": {}
"variantControlKeys": {
"sable": [
"proximity",
"spring",
"damping",
"widthGrowth",
"heightGrowth",
"drop"
],
"modern": [
"proximity",
"spring",
"damping",
"widthGrowth",
"heightGrowth",
"drop"
],
"retro": [
"pixelSize",
"levels",
"noise",
"scanlines",
"speed",
"proximity",
"widthGrowth"
],
"glass": [
"particles",
"thickness",
"dispersion",
"specular",
"rim",
"drift",
"proximity",
"heightGrowth",
"drop"
]
}
},
{
"id": "sketchbook",
Expand Down Expand Up @@ -966,16 +1057,27 @@
},
{
"id": "skeuomorphic-toggle",
"variantIds": [],
"variantIds": [
"skeuomorphic-toggle",
"modern",
"glass",
"shader"
],
"controlKeys": [
"mode",
"speed",
"size",
"opacity",
"hue",
"saturation",
"brightness"
],
"variantControlKeys": {}
"variantControlKeys": {
"skeuomorphic-toggle": [],
"modern": [],
"glass": [],
"shader": []
}
},
{
"id": "matrix-field",
Expand Down
218 changes: 190 additions & 28 deletions public/source-code.json

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions scripts/generate-library-entry.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@ const exports = [
...[...catalog.matchAll(eagerPattern)].map((match) => ({ path: match[2].replace("../", "./"), name: match[1] })),
];

const compatibilityExports = [
{ name: "SkeuomorphicToggle", path: "./shaders/neuform-isolated/NeuformBatchEffects" },
];

for (const compatibilityExport of compatibilityExports) {
const current = exports.find((item) => item.name === compatibilityExport.name);
if (current && current.path !== compatibilityExport.path) {
throw new Error(`Compatibility export ${compatibilityExport.name} moved from ${compatibilityExport.path} to ${current.path}.`);
}
if (!current) exports.push(compatibilityExport);
}

if (!exports.length) throw new Error("No Community renderer exports were found in src/data/shaders.tsx");

const names = new Set();
Expand Down
10 changes: 10 additions & 0 deletions scripts/library-package.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ const packageJson = JSON.parse(await readFile(resolve(root, "package.json"), "ut
const cliPackageJson = JSON.parse(await readFile(resolve(root, "packages/cli/package.json"), "utf8"));
const catalog = await readFile(resolve(root, "src/data/shaders.tsx"), "utf8");
const generator = await readFile(resolve(root, "scripts/generate-library-entry.mjs"), "utf8");
const libraryEntry = await readFile(resolve(root, "src/index.ts"), "utf8");
const legacyToggleEntry = await readFile(resolve(root, "src/package-components/SkeuomorphicToggle.ts"), "utf8");

test("the npm package is public and exports ESM, types, CSS, and assets", () => {
assert.equal(packageJson.name, "@designcodeio/threeui");
Expand All @@ -33,3 +35,11 @@ test("the generated library surface is derived only from the Community catalog i
assert.doesNotMatch(catalog, /\bProRenderer\b|access:\s*["']pro["']/i);
assert.match(catalog, /CommunityRenderer1/);
});

test("the expanded toggle collection preserves the published toggle imports", () => {
assert.match(generator, /compatibilityExports/);
assert.match(generator, /name: "SkeuomorphicToggle"/);
assert.match(libraryEntry, /export \{ SkeuomorphicToggle \} from "\.\/package-components\/SkeuomorphicToggle"/);
assert.match(libraryEntry, /export \{ SkeuomorphicToggleCollection \} from "\.\/package-components\/SkeuomorphicToggleCollection"/);
assert.match(legacyToggleEntry, /export \{ SkeuomorphicToggle \} from "\.\.\/shaders\/neuform-isolated\/NeuformBatchEffects"/);
});
6 changes: 5 additions & 1 deletion scripts/package-install-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,11 @@ try {
);
execFileSync(
process.execPath,
["--input-type=module", "--eval", "const root = await import('@designcodeio/threeui'); const subpath = await import('@designcodeio/threeui/components/CloudField'); if (Object.keys(root).length < 1 || typeof subpath.CloudField !== 'function') process.exit(1);"],
[
"--input-type=module",
"--eval",
"const root = await import('@designcodeio/threeui'); const cloud = await import('@designcodeio/threeui/components/CloudField'); const legacyToggle = await import('@designcodeio/threeui/components/SkeuomorphicToggle'); const toggleCollection = await import('@designcodeio/threeui/components/SkeuomorphicToggleCollection'); if (typeof root.SkeuomorphicToggle !== 'function' || typeof root.SkeuomorphicToggleCollection !== 'function' || typeof cloud.CloudField !== 'function' || typeof legacyToggle.SkeuomorphicToggle !== 'function' || typeof toggleCollection.SkeuomorphicToggleCollection !== 'function') process.exit(1);",
],
{ cwd: consumerDirectory, stdio: "inherit", env: environment },
);
console.log(`Anonymous install smoke test passed for ${packResult[0].filename}.`);
Expand Down
45 changes: 40 additions & 5 deletions src/browseTaxonomy.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,6 @@ const CATEGORY_CONTENT = Object.freeze({
heading: "Web motion design components",
description: "Browse motion design components for interactive websites, including cinematic transitions, responsive animation, and production-ready source.",
}),
Sections: Object.freeze({
title: "Interactive Website Sections",
heading: "Interactive website sections",
description: "Browse reusable website sections with interactive layouts, polished motion, responsive behavior, and copy-ready implementation source.",
}),
});

const CATEGORY_FAQS = Object.freeze({
Expand Down Expand Up @@ -150,6 +145,42 @@ const CATEGORY_FAQS = Object.freeze({
]),
});

// Keep tag URLs useful as browse filters without automatically asking search
// engines to index every internal catalog descriptor. This list is deliberately
// limited to distinct technologies and visual techniques with substantive
// collections; category synonyms belong to their dedicated category routes.
export const INDEXABLE_BROWSE_TAGS = Object.freeze([
"3d",
"canvas",
"canvas2d",
"crt",
"flow field",
"fluid",
"glsl",
"gsap",
"halftone",
"hover",
"isometric",
"noise",
"parallax",
"particles",
"physics",
"point cloud",
"postprocessing",
"procedural",
"refraction",
"scroll",
"scrolltrigger",
"shader",
"shadermaterial",
"tailwind",
"typography",
"webgl",
"webgl2",
]);

const INDEXABLE_BROWSE_TAG_SET = new Set(INDEXABLE_BROWSE_TAGS);

const TOKEN_LABELS = Object.freeze({
"2d": "2D",
"3d": "3D",
Expand Down Expand Up @@ -193,6 +224,10 @@ export function browseTagLabel(tag) {
.join(" ");
}

export function isIndexableBrowseTag(tag) {
return typeof tag === "string" && INDEXABLE_BROWSE_TAG_SET.has(tag.trim().toLowerCase());
}

export function browseTagContent(tag, resultCount = 0) {
const label = browseTagLabel(tag);
const countText = resultCount > 0 ? `${resultCount} ` : "";
Expand Down
Loading