{"id":13601764,"url":"https://github.com/matthewhudson/current-device","last_synced_at":"2026-04-08T14:32:52.921Z","repository":{"id":4727878,"uuid":"5876519","full_name":"matthewhudson/current-device","owner":"matthewhudson","description":"📱 The easiest way to write conditional CSS and/or JavaScript based on device operating system (iOS, Android, Blackberry, Windows, Firefox OS, MeeGo), orientation (Portrait vs. Landscape), and type (Tablet vs. Mobile).","archived":false,"fork":false,"pushed_at":"2026-03-24T01:50:33.000Z","size":814,"stargazers_count":3939,"open_issues_count":1,"forks_count":577,"subscribers_count":117,"default_branch":"main","last_synced_at":"2026-03-24T19:32:20.227Z","etag":null,"topics":["device-detection","javascript","mobile"],"latest_commit_sha":null,"homepage":"https://matthewhudson.github.io/current-device/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matthewhudson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":"hudsondev","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://www.paypal.me/thematthewhudson"]}},"created_at":"2012-09-19T18:50:42.000Z","updated_at":"2026-03-11T08:14:12.000Z","dependencies_parsed_at":"2026-01-15T03:03:15.451Z","dependency_job_id":null,"html_url":"https://github.com/matthewhudson/current-device","commit_stats":{"total_commits":344,"total_committers":43,"mean_commits":8.0,"dds":0.6075581395348837,"last_synced_commit":"bdc70b857fb03a065e3325ce935f017ef850793d"},"previous_names":["matthewhudson/device.js"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/matthewhudson/current-device","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewhudson%2Fcurrent-device","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewhudson%2Fcurrent-device/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewhudson%2Fcurrent-device/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewhudson%2Fcurrent-device/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matthewhudson","download_url":"https://codeload.github.com/matthewhudson/current-device/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewhudson%2Fcurrent-device/sbom","scorecard":{"id":626652,"data":{"date":"2025-08-11","repo":{"name":"github.com/matthewhudson/current-device","commit":"bdc70b857fb03a065e3325ce935f017ef850793d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":2,"reason":"Found 2/9 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"138 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-42xw-2xvc-qx8m","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-pp7h-53gx-mx7r","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-p28h-cc7q-c4fg","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-9j49-mfvp-vmhm","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-j4f2-536g-r55m","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq","Warn: Project is vulnerable to: GHSA-jp4x-w63m-7wgm","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-282f-qqgm-c34q","Warn: Project is vulnerable to: GHSA-7x7c-qm48-pq9c","Warn: Project is vulnerable to: GHSA-rc3x-jf5g-xvc5","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-82v2-mx6x-wq7q","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-4c7m-wxvm-r7gc","Warn: Project is vulnerable to: GHSA-pch5-whg9-qr2r","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-48ww-j4fc-435p","Warn: Project is vulnerable to: GHSA-hwqf-gcqm-7353","Warn: Project is vulnerable to: GHSA-9h6g-pr28-7cqp","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-35q2-47q7-3pc3","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-hjp8-2cm3-cc45","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-h9rv-jmmf-4pgx","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-fxwf-4rqh-v8g3","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-xfhh-g9f5-x4m4","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-c9g6-9335-x697","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-f523-2f5j-gfcg","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-xc7v-wxcw-j472","Warn: Project is vulnerable to: GHSA-cf4h-3jhx-xvhq","Warn: Project is vulnerable to: GHSA-46c4-8wrp-j99v","Warn: Project is vulnerable to: GHSA-9m6j-fcg5-2442","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-mgfv-m47x-4wqp","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-cf66-xwfp-gvc4","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-72mh-269x-7mh5","Warn: Project is vulnerable to: GHSA-h4j5-c7cj-74xg","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T06:41:00.352Z","repository_id":4727878,"created_at":"2025-08-21T06:41:00.352Z","updated_at":"2025-08-21T06:41:00.352Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31559841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["device-detection","javascript","mobile"],"created_at":"2024-08-01T18:01:07.694Z","updated_at":"2026-04-08T14:32:52.908Z","avatar_url":"https://github.com/matthewhudson.png","language":"TypeScript","funding_links":["https://patreon.com/hudsondev","https://www.paypal.me/thematthewhudson"],"categories":["Web 前端","JavaScript","TypeScript"],"sub_categories":[],"readme":"# [CURRENT-DEVICE](https://matthewhudson.github.io/current-device/)\n\n[![CI](https://github.com/matthewhudson/current-device/actions/workflows/ci.yml/badge.svg)](https://github.com/matthewhudson/current-device/actions/workflows/ci.yml)\n[![Bundle size](https://badgen.net/bundlephobia/minzip/current-device)](https://bundlephobia.com/result?p=current-device)\n[![NPM version](https://badge.fury.io/js/current-device.svg)](http://badge.fury.io/js/current-device)\n[![NPM downloads](https://img.shields.io/npm/dm/current-device.svg)](https://www.npmjs.com/package/current-device)\n\nThis module makes it easy to write conditional CSS _and/or_ JavaScript based on\ndevice operating system (iOS, Android, Blackberry, Windows, macOS, Firefox OS, MeeGo,\nAppleTV, etc), orientation (Portrait vs. Landscape), and type (Tablet vs.\nMobile).\n\n[View the Demo \u0026rarr;](https://matthewhudson.github.io/current-device/)\n\n### EXAMPLES\n\nThis module inserts CSS classes into the `\u003chtml\u003e` element.\n\n#### iPhone\n\n\u003cimg src=\"https://raw.githubusercontent.com/matthewhudson/current-device/main/docs/iphone.png\" /\u003e\n\n#### Android Tablet\n\n\u003cimg src=\"https://raw.githubusercontent.com/matthewhudson/current-device/main/docs/android.png\" /\u003e\n\n#### Blackberry Tablet\n\n\u003cimg src=\"https://raw.githubusercontent.com/matthewhudson/current-device/main/docs/blackberry.png\" /\u003e\n\n### DEVICE SUPPORT\n\n- iOS: iPhone, iPod, iPad\n- macOS\n- Android: Phones \u0026 Tablets\n- Blackberry: Phones \u0026 Tablets\n- Windows: Phones, Tablets, Desktops\n- Firefox OS: Phones \u0026 Tablets\n\n### USAGE\n\nJust include the script. The script then updates the `\u003chtml\u003e` section with the\n[appropriate classes](#conditional-css) based on the device's characteristics.\n\n## Installation\n\n```sh\nnpm install current-device\n```\n\nAnd then import it:\n\n```ts\n// ES modules (recommended)\nimport device from \"current-device\";\n\n// CommonJS\nconst device = require(\"current-device\").default;\n```\n\n### CDN / Script Tag\n\nYou can also include current-device directly via a `\u003cscript\u003e` tag using a CDN:\n\n```html\n\u003cscript src=\"https://unpkg.com/current-device/dist/index.global.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  console.log(device.type); // 'mobile', 'tablet', or 'desktop'\n\u003c/script\u003e\n```\n\n### TypeScript\n\nThis package ships with built-in TypeScript types. You can import the types directly:\n\n```ts\nimport device from \"current-device\";\nimport type { Device, DeviceType, DeviceOs, DeviceOrientation } from \"current-device\";\n\nconst os: DeviceOs = device.os;\nconst type: DeviceType = device.type;\nconst isPhone: boolean = device.mobile();\n```\n\n### CONDITIONAL CSS\n\nThe following tables map which CSS classes are added based on device and\norientation.\n\n#### Device CSS Class Names\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003eDevice\u003c/th\u003e\n\t\t\u003cth\u003eCSS Classes\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPad\u003c/td\u003e\n\t\t\u003ctd\u003eios ipad tablet\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPhone\u003c/td\u003e\n\t\t\u003ctd\u003eios iphone mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPod\u003c/td\u003e\n\t\t\u003ctd\u003eios ipod mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eMac\u003c/td\u003e\n\t\t\u003ctd\u003emacos desktop\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eAndroid Phone\u003c/td\u003e\n\t\t\u003ctd\u003eandroid mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eAndroid Tablet\u003c/td\u003e\n\t\t\u003ctd\u003eandroid tablet\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eBlackBerry Phone\u003c/td\u003e\n\t\t\u003ctd\u003eblackberry mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eBlackBerry Tablet\u003c/td\u003e\n\t\t\u003ctd\u003eblackberry tablet\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows Phone\u003c/td\u003e\n\t\t\u003ctd\u003ewindows mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows Tablet\u003c/td\u003e\n\t\t\u003ctd\u003ewindows tablet\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows Desktop\u003c/td\u003e\n\t\t\u003ctd\u003ewindows desktop\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFirefox OS Phone\u003c/td\u003e\n\t\t\u003ctd\u003efxos mobile\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFirefox OS Tablet\u003c/td\u003e\n\t\t\u003ctd\u003efxos tablet\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eMeeGo\u003c/td\u003e\n\t\t\u003ctd\u003emeego\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eDesktop\u003c/td\u003e\n\t\t\u003ctd\u003edesktop\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eTelevision\u003c/td\u003e\n\t\t\u003ctd\u003etelevision\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Orientation CSS Class Names\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003eOrientation\u003c/th\u003e\n\t\t\u003cth\u003eCSS Classes\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eLandscape\u003c/td\u003e\n\t\t\u003ctd\u003elandscape\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003ePortrait\u003c/td\u003e\n\t\t\u003ctd\u003eportrait\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n### CONDITIONAL JAVASCRIPT\n\nThis module _also_ includes support for conditional JavaScript, allowing you to\nwrite checks on the following device characteristics:\n\n#### Device JavaScript Methods\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003eDevice\u003c/th\u003e\n\t\t\u003cth\u003eJavaScript Method\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eMobile\u003c/td\u003e\n\t\t\u003ctd\u003edevice.mobile()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eTablet\u003c/td\u003e\n\t\t\u003ctd\u003edevice.tablet()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eDesktop\u003c/td\u003e\n\t\t\u003ctd\u003edevice.desktop()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiOS\u003c/td\u003e\n\t\t\u003ctd\u003edevice.ios()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPad\u003c/td\u003e\n\t\t\u003ctd\u003edevice.ipad()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPhone\u003c/td\u003e\n\t\t\u003ctd\u003edevice.iphone()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eiPod\u003c/td\u003e\n\t\t\u003ctd\u003edevice.ipod()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eMac\u003c/td\u003e\n\t\t\u003ctd\u003edevice.macos()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eAndroid\u003c/td\u003e\n\t\t\u003ctd\u003edevice.android()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eAndroid Phone\u003c/td\u003e\n\t\t\u003ctd\u003edevice.androidPhone()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eAndroid Tablet\u003c/td\u003e\n\t\t\u003ctd\u003edevice.androidTablet()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eBlackBerry\u003c/td\u003e\n\t\t\u003ctd\u003edevice.blackberry()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eBlackBerry Phone\u003c/td\u003e\n\t\t\u003ctd\u003edevice.blackberryPhone()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eBlackBerry Tablet\u003c/td\u003e\n\t\t\u003ctd\u003edevice.blackberryTablet()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows\u003c/td\u003e\n\t\t\u003ctd\u003edevice.windows()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows Phone\u003c/td\u003e\n\t\t\u003ctd\u003edevice.windowsPhone()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eWindows Tablet\u003c/td\u003e\n\t\t\u003ctd\u003edevice.windowsTablet()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFirefox OS\u003c/td\u003e\n\t\t\u003ctd\u003edevice.fxos()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFirefox OS Phone\u003c/td\u003e\n\t\t\u003ctd\u003edevice.fxosPhone()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eFirefox OS Tablet\u003c/td\u003e\n\t\t\u003ctd\u003edevice.fxosTablet()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eMeeGo\u003c/td\u003e\n\t\t\u003ctd\u003edevice.meego()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eTelevision\u003c/td\u003e\n\t\t\u003ctd\u003edevice.television()\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Orientation JavaScript Methods\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003eOrientation\u003c/th\u003e\n\t\t\u003cth\u003eJavaScript Method\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003eLandscape\u003c/td\u003e\n\t\t\u003ctd\u003edevice.landscape()\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003ePortrait\u003c/td\u003e\n\t\t\u003ctd\u003edevice.portrait()\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n#### Orientation JavaScript Callback\n\n```ts\ndevice.onChangeOrientation((newOrientation: \"landscape\" | \"portrait\") =\u003e {\n  console.log(`New orientation is ${newOrientation}`);\n});\n```\n\n### Utility Methods\n\n#### device.noConflict()\n\nRun `current-device` in noConflict mode, returning the device variable to its\nprevious owner. Returns a reference to the `device` object.\n\n```ts\nconst currentDevice: Device = device.noConflict();\n```\n\n### Useful Properties\n\nAccess these properties on the `device` object to get the first match on that\nattribute without looping through all of its getter methods.\n\n\u003ctable\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003eJS Property\u003c/th\u003e\n\t\t\u003cth\u003eType\u003c/th\u003e\n\t\t\u003cth\u003eReturns\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003edevice.type\u003c/td\u003e\n\t\t\u003ctd\u003eDeviceType\u003c/td\u003e\n\t\t\u003ctd\u003e'mobile', 'tablet', 'desktop', or 'unknown'\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003edevice.orientation\u003c/td\u003e\n\t\t\u003ctd\u003eDeviceOrientation\u003c/td\u003e\n\t\t\u003ctd\u003e'landscape', 'portrait', or 'unknown'\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003edevice.os\u003c/td\u003e\n\t\t\u003ctd\u003eDeviceOs\u003c/td\u003e\n\t\t\u003ctd\u003e'ios', 'iphone', 'ipad', 'ipod', 'android', 'blackberry', 'windows', 'macos', 'fxos', 'meego', 'television', or 'unknown'\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/table\u003e\n\n### BEST PRACTICES\n\nEnvironment detection has a high rate of misuse. Often times, folks will attempt\nto work around browser feature support problems by checking for the affected\nbrowser and doing something different in response. The preferred solution for\nthose kinds of problems, of course, is to check for the feature, not the browser\n(ala [Modernizr](http://modernizr.com/)).\n\nHowever, that common misuse of device detection doesn't mean it should never be\ndone. For example, `current-device` could be employed to change the interface of\nyour web app such that it uses interaction patterns and UI elements common to\nthe device it's being presented on. Android devices might get a slightly\ndifferent treatment than Windows or iOS, for instance. Another valid use-case is\nguiding users to different app stores depending on the device they're using.\n\nIn short, check for features when you need features, and check for the browser\nwhen you need the browser.\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://hudson.dev\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/320194?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatthew Hudson\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/matthewhudson/current-device/commits?author=matthewhudson\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#maintenance-matthewhudson\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://rteran.com/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/6477537?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRafael Terán\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/matthewhudson/current-device/commits?author=RTeran\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/winternet-studio\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/5200270?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAllan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/matthewhudson/current-device/pulls?q=is%3Apr+reviewed-by%3Awinternet-studio\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://martin-wepner.de\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/12143284?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003emartinwepner\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/matthewhudson/current-device/commits?author=martinwepner\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatthewhudson%2Fcurrent-device","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatthewhudson%2Fcurrent-device","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatthewhudson%2Fcurrent-device/lists"}