{"id":16760413,"url":"https://github.com/ryanve/ux","last_synced_at":"2025-03-21T23:32:16.948Z","repository":{"id":15381230,"uuid":"18112699","full_name":"ryanve/ux","owner":"ryanve","description":"Website user preference API","archived":false,"fork":false,"pushed_at":"2020-09-10T23:09:34.000Z","size":18,"stargazers_count":30,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-15T21:51:23.850Z","etag":null,"topics":["javascript","preferences"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/ux","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"0bsd","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryanve.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-25T18:58:51.000Z","updated_at":"2023-08-08T21:02:51.000Z","dependencies_parsed_at":"2022-08-30T14:11:10.576Z","dependency_job_id":null,"html_url":"https://github.com/ryanve/ux","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanve%2Fux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryanve","download_url":"https://codeload.github.com/ryanve/ux/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244885267,"owners_count":20526282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","preferences"],"created_at":"2024-10-13T04:23:25.549Z","updated_at":"2025-03-21T23:32:16.662Z","avatar_url":"https://github.com/ryanve.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ux\n#### website user preference API\n\u003cb\u003eux\u003c/b\u003e uses `localStorage` to remember features such as user preferences or display modes.\n\n## API\n\n#### Methods\n\n- [\u003cb\u003eux.enabled\u003c/b\u003e(feature?)](#enabled)\n- [\u003cb\u003eux.disabled\u003c/b\u003e(feature?)](#disabled)\n- [\u003cb\u003eux.known\u003c/b\u003e(feature?)](#known)\n- \u003ca name=\"emitters-group\"\u003e\u003c/a\u003e[\u003cb\u003eEmitters\u003c/b\u003e](#emitters)\n  - [\u003cb\u003eux.enable\u003c/b\u003e(feature)](#enable)\n  - [\u003cb\u003eux.disable\u003c/b\u003e(feature)](#disable)\n  - [\u003cb\u003eux.toggle\u003c/b\u003e(feature)](#toggle)\n  - [\u003cb\u003eux.forget\u003c/b\u003e(feature?)](#forget)\n\n#### Notes\n\n- \u003cvar\u003efeature\u003c/var\u003e can be any string\n- features are either *enabled*, *disabled*, or *unknown*\n\n\u003ca name=\"enabled\"\u003e\u003c/a\u003e\n#### `ux.enabled(feature?)`\n- `ux.enabled()`: Get an \u003cb\u003earray\u003c/b\u003e containing the names of all enabled features\n- `ux.enabled(feature)`: Test if \u003cvar\u003efeature\u003c/var\u003e is enabled. Return \u003cb\u003eboolean\u003c/b\u003e\n\n\u003ca name=\"disabled\"\u003e\u003c/a\u003e\n#### `ux.disabled(feature?)`\n- `ux.disabled()`: Get an \u003cb\u003earray\u003c/b\u003e containing the names of all disabled features\n- `ux.disabled(feature)`: Test if \u003cvar\u003efeature\u003c/var\u003e is disabled. Return \u003cb\u003eboolean\u003c/b\u003e\n\n\u003ca name=\"known\"\u003e\u003c/a\u003e\n#### `ux.known(feature?)`\n- `ux.known()`: Get an \u003cb\u003earray\u003c/b\u003e containing the names of all known features\n- `ux.known(feature)`: Test if \u003cvar\u003efeature\u003c/var\u003e is known. Return \u003cb\u003eboolean\u003c/b\u003e\n\n\u003ca name=\"enable\"\u003e\u003c/a\u003e\n#### `ux.enable(feature)`\n- Enable \u003cvar\u003efeature\u003c/var\u003e, and trigger associated listeners\n\n\u003ca name=\"disable\"\u003e\u003c/a\u003e\n#### `ux.disable(feature)`\n- Disable \u003cvar\u003efeature\u003c/var\u003e, and trigger associated listeners\n\n\u003ca name=\"toggle\"\u003e\u003c/a\u003e\n#### `ux.toggle(feature)`\n- Toggle (either enable or disable) \u003cvar\u003efeature\u003c/var\u003e, and trigger associated listeners\n\n\u003ca name=\"forget\"\u003e\u003c/a\u003e\n#### `ux.forget(feature)`\n- Forget \u003cvar\u003efeature\u003c/var\u003e, and trigger associated listeners\n\n#### `ux.forget()`\n- Forget *all* features\n\n\u003ca name=\"emitters\"\u003e\u003c/a\u003e\n### [Emitters](#emitters-group) have [emitter methods](https://github.com/ryanve/energy/tree/0.4.0#methods)\n\n - `.on(feature, listener)`\n - `.off(feature?, listener?)`\n - `.once(feature, listener)`\n - `.emit(feature, ...args)`\n\n#### Emitter syntax\n\n - `ux.enable.on(feature, listener)`\n - `ux.disable.on(feature, listener)`\n - `ux.forget.on(feature, listener)`\n - `ux.enable.off(feature?, listener?)`\n - `ux.disable.off(feature?, listener?)`\n - `ux.forget.off(feature?, listener?)`\n - etc.\n\n#### Emitter example\n```js\n// Listen for when 'crazycolors' is enabled\nux.enable.on('crazycolors', function(feature) {\n  document.querySelector('html').classList.add(feature)\n  console.log(feature + ' enabled')\n})\n\n// Enable 'crazycolors'\nux.enable('crazycolors')\n```\n\nYou normally would want to also listen for when the same feature is disabled and do an opposing action. You're also likely to have multiple (and maybe related) features. `ux` doesn't care what your features do. It only provides the API for enabling, disabling, and remembering them. Do what makes sense for your features and users :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanve%2Fux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryanve%2Fux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanve%2Fux/lists"}