{"adoption": {"forks": 50, "observed_at": "2026-08-28T04:05:25.955884+00:00", "stars": 1713}, "canonical_url": "https://ross.abutalabs.com/products/theme-change", "card": {"archived": false, "artifact_type": "library", "description": "Change CSS theme with toggle, buttons or select using CSS custom properties and localStorage", "domain": ["frontend", "web-development", "web-design"], "enriched": true, "function": ["theme", "state-management", "ui-components"], "health_score": 72, "homepage": "https://codepen.io/saadeghi/pen/OJypbNM", "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["saadeghi/theme-change"], "name": "saadeghi/theme-change", "platform": ["browser", "cross-platform"], "pushed_at": "2026-06-14T01:19:42+00:00", "repo": "saadeghi/theme-change", "stars": 1713, "tags": ["css-custom-properties", "localstorage", "dark-mode", "theming", "daisyui", "zero-dependency", "nodejs"], "topics": ["theme", "localstorage", "theming", "css-custom-properties", "css-variables", "css-theme", "javascript"], "urls": [], "use_cases": ["add a dark mode toggle to a website", "persist user theme preference in localStorage", "switch between multiple CSS themes with a select dropdown", "cycle through themes with a single rotate button", "sync multiple theme toggle controls on one page", "use daisyUI themes with a theme switcher", "initialize theme switching in React, Vue, Svelte, or Astro"], "what_it_is": "A tiny JavaScript library for switching CSS themes using data attributes, CSS custom properties, and localStorage persistence. It works with buttons, selects, and checkboxes, and syncs all matching theme controls on the page.", "when_to_avoid": ["you need a full styling framework or component library", "your theming requires server-side rendering of theme state or cookie-based persistence", "you need per-component scoped theming rather than document-level themes", "you use CSS-in-JS solutions that don't rely on data-theme attributes"], "when_to_choose": ["you want a lightweight, dependency-free theme switcher", "your theming is based on CSS custom properties or daisyUI data-theme attributes", "you need theme preference persisted across page loads", "you use plain HTML attributes rather than complex state management"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/theme-change", "repo": "saadeghi/theme-change", "role": "main", "score": 71}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:25.955884+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:34:43.590912+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e418e98dc995476a1b825d29d31ca0c0335f3091bc4875a5e99a2878e41e7b4d", "fetched_at": "2026-08-28T04:05:25.955884+00:00", "kind": "readme", "missing": false, "url": "https://github.com/saadeghi/theme-change"}, {"content_hash": "920de996f1389ec1e1d467312074c5ecc1df674fe4287b60e3fb5b40728fa058", "fetched_at": "2026-08-29T11:11:06.042167+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/theme-change"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 87, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2322, "days_push": 81, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 71, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}