A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Touch device detection

+606 -40
+530
package-lock.json
··· 265 265 "wif": "2.0.6" 266 266 } 267 267 }, 268 + "block-stream": { 269 + "version": "0.0.9", 270 + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 271 + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 272 + "dev": true, 273 + "requires": { 274 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 275 + } 276 + }, 268 277 "blockstack": { 269 278 "version": "0.9.1", 270 279 "resolved": "https://registry.npmjs.org/blockstack/-/blockstack-0.9.1.tgz", ··· 686 695 "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 687 696 "dev": true 688 697 }, 698 + "colors": { 699 + "version": "0.6.2", 700 + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 701 + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", 702 + "dev": true 703 + }, 689 704 "combine-source-map": { 690 705 "version": "http://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", 691 706 "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", ··· 845 860 "randombytes": "http://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" 846 861 } 847 862 }, 863 + "ctype": { 864 + "version": "0.5.3", 865 + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", 866 + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", 867 + "dev": true, 868 + "optional": true 869 + }, 848 870 "custom-protocol-detection-blockstack": { 849 871 "version": "1.1.3", 850 872 "resolved": "https://registry.npmjs.org/custom-protocol-detection-blockstack/-/custom-protocol-detection-blockstack-1.1.3.tgz", 851 873 "integrity": "sha512-iGwXqKU60VAzfjLF/amcJKQYMLeMlXAlzkZttakOQA7IjZw2WFSYAmn9a13d0LOBTzdVpbHnF+zZArNC9csiZw==" 852 874 }, 875 + "cycle": { 876 + "version": "1.0.3", 877 + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 878 + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", 879 + "dev": true 880 + }, 853 881 "dashdash": { 854 882 "version": "1.14.1", 855 883 "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", ··· 949 977 "version": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 950 978 "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", 951 979 "dev": true 980 + }, 981 + "du": { 982 + "version": "0.1.0", 983 + "resolved": "https://registry.npmjs.org/du/-/du-0.1.0.tgz", 984 + "integrity": "sha1-8m40CgnHvFtv1pr2263qYPqMb00=", 985 + "dev": true, 986 + "requires": { 987 + "async": "0.1.22" 988 + }, 989 + "dependencies": { 990 + "async": { 991 + "version": "0.1.22", 992 + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 993 + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", 994 + "dev": true 995 + } 996 + } 952 997 }, 953 998 "duplexer2": { 954 999 "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", ··· 1199 1244 "version": "1.0.2", 1200 1245 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", 1201 1246 "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" 1247 + }, 1248 + "eyes": { 1249 + "version": "0.1.8", 1250 + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 1251 + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 1252 + "dev": true 1202 1253 }, 1203 1254 "filename-regex": { 1204 1255 "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", ··· 2230 2281 } 2231 2282 } 2232 2283 }, 2284 + "fstream": { 2285 + "version": "1.0.11", 2286 + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 2287 + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 2288 + "dev": true, 2289 + "requires": { 2290 + "graceful-fs": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 2291 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2292 + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2293 + "rimraf": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" 2294 + } 2295 + }, 2296 + "fstream-ignore": { 2297 + "version": "1.0.2", 2298 + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.2.tgz", 2299 + "integrity": "sha1-GMiR2wG3gqdKe/+Tag8kmXdBx6s=", 2300 + "dev": true, 2301 + "requires": { 2302 + "fstream": "1.0.11", 2303 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2304 + "minimatch": "2.0.10" 2305 + }, 2306 + "dependencies": { 2307 + "minimatch": { 2308 + "version": "2.0.10", 2309 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 2310 + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 2311 + "dev": true, 2312 + "requires": { 2313 + "brace-expansion": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" 2314 + } 2315 + } 2316 + } 2317 + }, 2233 2318 "function-bind": { 2234 2319 "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", 2235 2320 "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", ··· 2426 2511 "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", 2427 2512 "dev": true 2428 2513 }, 2514 + "i": { 2515 + "version": "0.3.5", 2516 + "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz", 2517 + "integrity": "sha1-HSuFQVjsgWkRPGy39raAHpniEdU=", 2518 + "dev": true 2519 + }, 2429 2520 "iconv-lite": { 2430 2521 "version": "0.4.18", 2431 2522 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", ··· 2539 2630 "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", 2540 2631 "dev": true 2541 2632 }, 2633 + "is-domain": { 2634 + "version": "0.0.1", 2635 + "resolved": "https://registry.npmjs.org/is-domain/-/is-domain-0.0.1.tgz", 2636 + "integrity": "sha1-f/sojVzO1rB8Ty35HJvpFTURNI4=", 2637 + "dev": true 2638 + }, 2542 2639 "is-dotfile": { 2543 2640 "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", 2544 2641 "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", ··· 2787 2884 } 2788 2885 } 2789 2886 }, 2887 + "keypress": { 2888 + "version": "0.1.0", 2889 + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", 2890 + "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", 2891 + "dev": true 2892 + }, 2790 2893 "kind-of": { 2791 2894 "version": "http://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz", 2792 2895 "integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c=", ··· 2932 3035 "brorand": "http://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" 2933 3036 } 2934 3037 }, 3038 + "mime": { 3039 + "version": "1.2.11", 3040 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", 3041 + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", 3042 + "dev": true, 3043 + "optional": true 3044 + }, 2935 3045 "mime-db": { 2936 3046 "version": "1.27.0", 2937 3047 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", ··· 3036 3146 } 3037 3147 } 3038 3148 }, 3149 + "moniker": { 3150 + "version": "0.1.2", 3151 + "resolved": "https://registry.npmjs.org/moniker/-/moniker-0.1.2.tgz", 3152 + "integrity": "sha1-hy37pXXc6o+gSlE1sT1fJL7MyX4=", 3153 + "dev": true 3154 + }, 3155 + "mute-stream": { 3156 + "version": "0.0.7", 3157 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 3158 + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 3159 + "dev": true 3160 + }, 3039 3161 "nan": { 3040 3162 "version": "http://registry.npmjs.org/nan/-/nan-2.5.1.tgz", 3041 3163 "integrity": "sha1-1bAWkSUzJql6K77p5hxV2NYDUeI=", 3042 3164 "dev": true, 3043 3165 "optional": true 3044 3166 }, 3167 + "natives": { 3168 + "version": "1.1.0", 3169 + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", 3170 + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", 3171 + "dev": true 3172 + }, 3173 + "ncp": { 3174 + "version": "0.4.2", 3175 + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", 3176 + "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", 3177 + "dev": true 3178 + }, 3179 + "netrc": { 3180 + "version": "0.1.4", 3181 + "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", 3182 + "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=", 3183 + "dev": true 3184 + }, 3045 3185 "node-elm-compiler": { 3046 3186 "version": "2.3.2", 3047 3187 "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-2.3.2.tgz", ··· 3334 3474 "requires": { 3335 3475 "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" 3336 3476 } 3477 + }, 3478 + "pkginfo": { 3479 + "version": "0.4.0", 3480 + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz", 3481 + "integrity": "sha1-NJ27f/04CB/K3AhT32h/DHdEzWU=", 3482 + "dev": true 3337 3483 }, 3338 3484 "postcss": { 3339 3485 "version": "6.0.7", ··· 3656 3802 "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 3657 3803 "dev": true 3658 3804 }, 3805 + "progress": { 3806 + "version": "1.1.8", 3807 + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 3808 + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 3809 + "dev": true 3810 + }, 3659 3811 "promise": { 3660 3812 "version": "7.3.1", 3661 3813 "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 3662 3814 "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 3663 3815 "requires": { 3664 3816 "asap": "2.0.6" 3817 + } 3818 + }, 3819 + "prompt": { 3820 + "version": "0.2.14", 3821 + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", 3822 + "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", 3823 + "dev": true, 3824 + "requires": { 3825 + "pkginfo": "0.4.0", 3826 + "read": "1.0.5", 3827 + "revalidator": "0.1.8", 3828 + "utile": "0.2.1", 3829 + "winston": "0.8.3" 3665 3830 } 3666 3831 }, 3667 3832 "pseudomap": { ··· 3722 3887 "version": "http://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", 3723 3888 "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" 3724 3889 }, 3890 + "read": { 3891 + "version": "1.0.5", 3892 + "resolved": "https://registry.npmjs.org/read/-/read-1.0.5.tgz", 3893 + "integrity": "sha1-AHo9FpR4qnEKSRcn5FPv+5LnYgM=", 3894 + "dev": true, 3895 + "requires": { 3896 + "mute-stream": "0.0.7" 3897 + } 3898 + }, 3725 3899 "read-cache": { 3726 3900 "version": "1.0.0", 3727 3901 "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", ··· 3873 4047 "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 3874 4048 } 3875 4049 }, 4050 + "revalidator": { 4051 + "version": "0.1.8", 4052 + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", 4053 + "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", 4054 + "dev": true 4055 + }, 3876 4056 "rimraf": { 3877 4057 "version": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 3878 4058 "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", ··· 3989 4169 "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 3990 4170 "dev": true 3991 4171 }, 4172 + "split": { 4173 + "version": "0.3.1", 4174 + "resolved": "https://registry.npmjs.org/split/-/split-0.3.1.tgz", 4175 + "integrity": "sha1-zrzxQr9hu7ZLFBYo5ttIKikUZUw=", 4176 + "dev": true, 4177 + "requires": { 4178 + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 4179 + } 4180 + }, 3992 4181 "sprintf-js": { 3993 4182 "version": "1.1.1", 3994 4183 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", ··· 4015 4204 "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 4016 4205 } 4017 4206 } 4207 + }, 4208 + "stack-trace": { 4209 + "version": "0.0.10", 4210 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 4211 + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", 4212 + "dev": true 4018 4213 }, 4019 4214 "stream-browserify": { 4020 4215 "version": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", ··· 4115 4310 "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 4116 4311 "dev": true 4117 4312 }, 4313 + "surge": { 4314 + "version": "0.19.0", 4315 + "resolved": "https://registry.npmjs.org/surge/-/surge-0.19.0.tgz", 4316 + "integrity": "sha1-rkMN8PKDK6JKo3m3dmWG/mi3I5w=", 4317 + "dev": true, 4318 + "requires": { 4319 + "du": "0.1.0", 4320 + "fstream-ignore": "1.0.2", 4321 + "is-domain": "0.0.1", 4322 + "minimist": "1.1.1", 4323 + "moniker": "0.1.2", 4324 + "netrc": "0.1.4", 4325 + "progress": "1.1.8", 4326 + "prompt": "0.2.14", 4327 + "read": "1.0.5", 4328 + "request": "2.40.0", 4329 + "split": "0.3.1", 4330 + "surge-ignore": "0.2.0", 4331 + "tar": "1.0.0", 4332 + "tar.gz": "0.1.1", 4333 + "url-parse-as-address": "1.0.0" 4334 + }, 4335 + "dependencies": { 4336 + "asn1": { 4337 + "version": "0.1.11", 4338 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", 4339 + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", 4340 + "dev": true, 4341 + "optional": true 4342 + }, 4343 + "assert-plus": { 4344 + "version": "0.1.5", 4345 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", 4346 + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", 4347 + "dev": true, 4348 + "optional": true 4349 + }, 4350 + "async": { 4351 + "version": "0.9.2", 4352 + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 4353 + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", 4354 + "dev": true, 4355 + "optional": true 4356 + }, 4357 + "aws-sign2": { 4358 + "version": "0.5.0", 4359 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", 4360 + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", 4361 + "dev": true, 4362 + "optional": true 4363 + }, 4364 + "boom": { 4365 + "version": "0.4.2", 4366 + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", 4367 + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", 4368 + "dev": true, 4369 + "requires": { 4370 + "hoek": "0.9.1" 4371 + } 4372 + }, 4373 + "combined-stream": { 4374 + "version": "0.0.7", 4375 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", 4376 + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", 4377 + "dev": true, 4378 + "optional": true, 4379 + "requires": { 4380 + "delayed-stream": "0.0.5" 4381 + } 4382 + }, 4383 + "cryptiles": { 4384 + "version": "0.2.2", 4385 + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", 4386 + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", 4387 + "dev": true, 4388 + "optional": true, 4389 + "requires": { 4390 + "boom": "0.4.2" 4391 + } 4392 + }, 4393 + "delayed-stream": { 4394 + "version": "0.0.5", 4395 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", 4396 + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", 4397 + "dev": true, 4398 + "optional": true 4399 + }, 4400 + "forever-agent": { 4401 + "version": "0.5.2", 4402 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", 4403 + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", 4404 + "dev": true 4405 + }, 4406 + "form-data": { 4407 + "version": "0.1.4", 4408 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", 4409 + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", 4410 + "dev": true, 4411 + "optional": true, 4412 + "requires": { 4413 + "async": "0.9.2", 4414 + "combined-stream": "0.0.7", 4415 + "mime": "1.2.11" 4416 + } 4417 + }, 4418 + "hawk": { 4419 + "version": "1.1.1", 4420 + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", 4421 + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", 4422 + "dev": true, 4423 + "optional": true, 4424 + "requires": { 4425 + "boom": "0.4.2", 4426 + "cryptiles": "0.2.2", 4427 + "hoek": "0.9.1", 4428 + "sntp": "0.2.4" 4429 + } 4430 + }, 4431 + "hoek": { 4432 + "version": "0.9.1", 4433 + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", 4434 + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", 4435 + "dev": true 4436 + }, 4437 + "http-signature": { 4438 + "version": "0.10.1", 4439 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", 4440 + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", 4441 + "dev": true, 4442 + "optional": true, 4443 + "requires": { 4444 + "asn1": "0.1.11", 4445 + "assert-plus": "0.1.5", 4446 + "ctype": "0.5.3" 4447 + } 4448 + }, 4449 + "mime-types": { 4450 + "version": "1.0.2", 4451 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", 4452 + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", 4453 + "dev": true 4454 + }, 4455 + "minimist": { 4456 + "version": "1.1.1", 4457 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.1.tgz", 4458 + "integrity": "sha1-G8K8cWWM3KVxJHVoQ2NhWwtPaVs=", 4459 + "dev": true 4460 + }, 4461 + "node-uuid": { 4462 + "version": "1.4.8", 4463 + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", 4464 + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", 4465 + "dev": true 4466 + }, 4467 + "oauth-sign": { 4468 + "version": "0.3.0", 4469 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", 4470 + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", 4471 + "dev": true, 4472 + "optional": true 4473 + }, 4474 + "qs": { 4475 + "version": "1.0.2", 4476 + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", 4477 + "integrity": "sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g=", 4478 + "dev": true 4479 + }, 4480 + "request": { 4481 + "version": "2.40.0", 4482 + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", 4483 + "integrity": "sha1-TdZw9pbx5uhC5mtLXoOTAaub62c=", 4484 + "dev": true, 4485 + "requires": { 4486 + "aws-sign2": "0.5.0", 4487 + "forever-agent": "0.5.2", 4488 + "form-data": "0.1.4", 4489 + "hawk": "1.1.1", 4490 + "http-signature": "0.10.1", 4491 + "json-stringify-safe": "5.0.1", 4492 + "mime-types": "1.0.2", 4493 + "node-uuid": "1.4.8", 4494 + "oauth-sign": "0.3.0", 4495 + "qs": "1.0.2", 4496 + "stringstream": "0.0.5", 4497 + "tough-cookie": "2.3.2", 4498 + "tunnel-agent": "0.4.3" 4499 + } 4500 + }, 4501 + "sntp": { 4502 + "version": "0.2.4", 4503 + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", 4504 + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", 4505 + "dev": true, 4506 + "optional": true, 4507 + "requires": { 4508 + "hoek": "0.9.1" 4509 + } 4510 + }, 4511 + "tunnel-agent": { 4512 + "version": "0.4.3", 4513 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 4514 + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", 4515 + "dev": true, 4516 + "optional": true 4517 + } 4518 + } 4519 + }, 4520 + "surge-ignore": { 4521 + "version": "0.2.0", 4522 + "resolved": "https://registry.npmjs.org/surge-ignore/-/surge-ignore-0.2.0.tgz", 4523 + "integrity": "sha1-Wn+KIKcRiM+edaLP6OsYLekNrzs=", 4524 + "dev": true 4525 + }, 4118 4526 "syntax-error": { 4119 4527 "version": "http://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", 4120 4528 "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", ··· 4167 4575 } 4168 4576 } 4169 4577 }, 4578 + "tar": { 4579 + "version": "1.0.0", 4580 + "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.0.tgz", 4581 + "integrity": "sha1-NmNtduiuErS8EalArGBrXKil/h8=", 4582 + "dev": true, 4583 + "requires": { 4584 + "block-stream": "0.0.9", 4585 + "fstream": "1.0.11", 4586 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 4587 + } 4588 + }, 4589 + "tar.gz": { 4590 + "version": "0.1.1", 4591 + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-0.1.1.tgz", 4592 + "integrity": "sha1-6RTOI7L9xidXX72zSFpbIo7VmUc=", 4593 + "dev": true, 4594 + "requires": { 4595 + "commander": "1.1.1", 4596 + "fstream": "0.1.31", 4597 + "tar": "0.1.20" 4598 + }, 4599 + "dependencies": { 4600 + "commander": { 4601 + "version": "1.1.1", 4602 + "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz", 4603 + "integrity": "sha1-UNFlGGiuYOzP8KLZ80WVN2vGsEE=", 4604 + "dev": true, 4605 + "requires": { 4606 + "keypress": "0.1.0" 4607 + } 4608 + }, 4609 + "fstream": { 4610 + "version": "0.1.31", 4611 + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", 4612 + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", 4613 + "dev": true, 4614 + "requires": { 4615 + "graceful-fs": "3.0.11", 4616 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 4617 + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 4618 + "rimraf": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" 4619 + } 4620 + }, 4621 + "graceful-fs": { 4622 + "version": "3.0.11", 4623 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", 4624 + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", 4625 + "dev": true, 4626 + "requires": { 4627 + "natives": "1.1.0" 4628 + } 4629 + }, 4630 + "tar": { 4631 + "version": "0.1.20", 4632 + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", 4633 + "integrity": "sha1-QpQLrltfIsdEg2mRJvnz8nRJyxM=", 4634 + "dev": true, 4635 + "requires": { 4636 + "block-stream": "0.0.9", 4637 + "fstream": "0.1.31", 4638 + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 4639 + } 4640 + } 4641 + } 4642 + }, 4170 4643 "temp": { 4171 4644 "version": "http://registry.npmjs.org/temp/-/temp-0.8.3.tgz", 4172 4645 "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", ··· 4283 4756 } 4284 4757 } 4285 4758 }, 4759 + "url-parse-as-address": { 4760 + "version": "1.0.0", 4761 + "resolved": "https://registry.npmjs.org/url-parse-as-address/-/url-parse-as-address-1.0.0.tgz", 4762 + "integrity": "sha1-+4CQGIPzOLPL7TU49fqiatr38uc=", 4763 + "dev": true 4764 + }, 4286 4765 "util": { 4287 4766 "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 4288 4767 "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", ··· 4303 4782 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 4304 4783 "dev": true 4305 4784 }, 4785 + "utile": { 4786 + "version": "0.2.1", 4787 + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", 4788 + "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", 4789 + "dev": true, 4790 + "requires": { 4791 + "async": "0.2.10", 4792 + "deep-equal": "0.2.2", 4793 + "i": "0.3.5", 4794 + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 4795 + "ncp": "0.4.2", 4796 + "rimraf": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" 4797 + }, 4798 + "dependencies": { 4799 + "async": { 4800 + "version": "0.2.10", 4801 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 4802 + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 4803 + "dev": true 4804 + } 4805 + } 4806 + }, 4306 4807 "uuid": { 4307 4808 "version": "3.1.0", 4308 4809 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", ··· 4362 4863 "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", 4363 4864 "requires": { 4364 4865 "bs58check": "1.3.4" 4866 + } 4867 + }, 4868 + "winston": { 4869 + "version": "0.8.3", 4870 + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", 4871 + "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", 4872 + "dev": true, 4873 + "requires": { 4874 + "async": "0.2.10", 4875 + "colors": "0.6.2", 4876 + "cycle": "1.0.3", 4877 + "eyes": "0.1.8", 4878 + "isstream": "0.1.2", 4879 + "pkginfo": "0.3.1", 4880 + "stack-trace": "0.0.10" 4881 + }, 4882 + "dependencies": { 4883 + "async": { 4884 + "version": "0.2.10", 4885 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 4886 + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 4887 + "dev": true 4888 + }, 4889 + "pkginfo": { 4890 + "version": "0.3.1", 4891 + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 4892 + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", 4893 + "dev": true 4894 + } 4365 4895 } 4366 4896 }, 4367 4897 "wrap-ansi": {
+2 -1
package.json
··· 6 6 "elm-css": "^0.6.1", 7 7 "elm-doc-test": "^2.2.3", 8 8 "elm-test": "^0.18.2", 9 - "postcss-cli": "^4.1.0" 9 + "postcss-cli": "^4.1.0", 10 + "surge": "^0.19.0" 10 11 }, 11 12 "dependencies": { 12 13 "1-liners": "^0.4.0",
+6
src/App/Ports.elm
··· 1 + port module Ports exposing (..) 2 + 3 + -- 🚽 4 + 5 + 6 + port setIsTouchDevice : (Bool -> msg) -> Sub msg
+10
src/App/State.elm
··· 4 4 import List.Extra as List 5 5 import Maybe.Extra as Maybe 6 6 import Navigation 7 + import Ports 7 8 import Response exposing (..) 8 9 import Response.Ext exposing (do) 9 10 import Task ··· 41 42 initialModel flags location = 42 43 { authenticatedUser = flags.user 43 44 , contextMenu = Nothing 45 + , isTouchDevice = False 44 46 , showLoadingScreen = True 45 47 46 48 ------------------------------------ ··· 100 102 HideLoadingScreen -> 101 103 (!) 102 104 { model | showLoadingScreen = False } 105 + [] 106 + 107 + SetIsTouchDevice bool -> 108 + (!) 109 + { model | isTouchDevice = bool } 103 110 [] 104 111 105 112 SignOut -> ··· 297 304 Sub.batch 298 305 [ -- Time 299 306 Time.every (1 * Time.minute) SetTimestamp 307 + 308 + -- Ports 309 + , Ports.setIsTouchDevice SetIsTouchDevice 300 310 301 311 -- Children 302 312 , Sub.map ConsoleMsg <| Console.subscriptions model.console
+35 -32
src/App/Tracks/View.elm
··· 42 42 , model.tracks.sortDirection 43 43 , model.sources.isProcessing 44 44 , model.sources.collection 45 + , model.isTouchDevice 45 46 ) 46 47 ] 47 48 ··· 143 144 144 145 content : 145 146 List IdentifiedTrack 146 - -> ( SortBy, SortDirection, IsProcessing, List Source ) 147 + -> ( SortBy, SortDirection, IsProcessing, List Source, Bool ) 147 148 -> Html TopLevel.Msg 148 - content resultant ( sortBy, sortDirection, isProcessing, sources ) = 149 + content resultant ( sortBy, sortDirection, isProcessing, sources, isTouchDevice ) = 149 150 div 150 151 [ cssClass TracksChild 151 152 , onScroll (ScrollThroughTable >> TopLevel.TracksMsg) ··· 181 182 [] 182 183 ] 183 184 else 184 - tracksTable resultant sortBy sortDirection 185 + tracksTable resultant sortBy sortDirection isTouchDevice 185 186 ] 186 187 187 188 ··· 234 235 -- Content views 235 236 236 237 237 - tracksTable : List IdentifiedTrack -> SortBy -> SortDirection -> Html TopLevel.Msg 238 - tracksTable tracks activeSortBy sortDirection = 238 + tracksTable : List IdentifiedTrack -> SortBy -> SortDirection -> Bool -> Html TopLevel.Msg 239 + tracksTable tracks activeSortBy sortDirection isTouchDevice = 239 240 let 240 241 sortIcon = 241 242 (if sortDirection == Desc then ··· 265 266 ] 266 267 , Html.Keyed.node 267 268 "tbody" 268 - [ on "dblclick" playTrack 269 - , on "dbltap" playTrack 270 - 271 - -- 272 - , on "click" toggleFavourite 273 - , on "tap" toggleFavourite 274 - 275 - -- 276 - , onWithOptions 277 - "contextmenu" 278 - { stopPropagation = True 279 - , preventDefault = True 280 - } 281 - showContextMenu 282 - , onWithOptions 283 - "longtap" 284 - { stopPropagation = True 285 - , preventDefault = True 286 - } 287 - showContextMenuOnTouch 288 - , onWithOptions 289 - "touchend" 290 - { stopPropagation = False 291 - , preventDefault = True 292 - } 293 - (Decode.succeed TopLevel.NoOp) 294 - ] 269 + (if isTouchDevice then 270 + -- Touch devices 271 + [ on "dbltap" playTrack 272 + , on "tap" toggleFavourite 273 + , onWithOptions 274 + "longtap" 275 + { stopPropagation = True 276 + , preventDefault = True 277 + } 278 + showContextMenuOnTouch 279 + , onWithOptions 280 + "touchend" 281 + { stopPropagation = False 282 + , preventDefault = True 283 + } 284 + (Decode.succeed TopLevel.NoOp) 285 + ] 286 + else 287 + -- Non-Touch devices 288 + [ on "dblclick" playTrack 289 + , on "click" toggleFavourite 290 + , onWithOptions 291 + "contextmenu" 292 + { stopPropagation = True 293 + , preventDefault = True 294 + } 295 + showContextMenu 296 + ] 297 + ) 295 298 (List.indexedMap tracksTableItem tracks) 296 299 ] 297 300
+2
src/App/Types.elm
··· 25 25 = Authenticate AuthMethod 26 26 | ClickAway 27 27 | HideLoadingScreen 28 + | SetIsTouchDevice Bool 28 29 | SignOut 29 30 -- Time 30 31 | SetTimestamp Time ··· 58 59 type alias Model = 59 60 { authenticatedUser : Maybe User 60 61 , contextMenu : Maybe ContextMenu 62 + , isTouchDevice : Bool 61 63 , showLoadingScreen : Bool 62 64 63 65 ------------------------------------
+12 -7
src/App/View.elm
··· 43 43 -- (like with the mouse events) 44 44 case model.equalizer.activeKnob of 45 45 Just _ -> 46 - [ onClick ClickAway 47 - , on "tap" (Decode.succeed ClickAway) 48 - , on "touchmove" Equalizer.Touch.move 49 - , on "touchend" Equalizer.Touch.end 50 - ] 46 + (if model.isTouchDevice then 47 + [ on "tap" (Decode.succeed ClickAway) 48 + , on "touchmove" Equalizer.Touch.move 49 + , on "touchend" Equalizer.Touch.end 50 + ] 51 + else 52 + [ onClick ClickAway ] 53 + ) 51 54 52 55 Nothing -> 53 - [ onClick ClickAway 54 - , on "tap" (Decode.succeed ClickAway) 56 + [ if model.isTouchDevice then 57 + on "tap" (Decode.succeed ClickAway) 58 + else 59 + onClick ClickAway 55 60 ] 56 61 ) 57 62 [ --
+9
src/Js/elm-loader.js
··· 32 32 33 33 initializePorts(app, flags); 34 34 initializeSettings(flags); 35 + initializeTouchDetection(app); 35 36 } 36 37 37 38 ··· 211 212 search.postMessage({ 212 213 action: "update_search_index", 213 214 data: flags.tracks 215 + }); 216 + } 217 + 218 + 219 + function initializeTouchDetection(app) { 220 + window.addEventListener("touchstart", function onFirstTouch() { 221 + app.ports.setIsTouchDevice.send(true); 222 + window.removeEventListener('touchstart', onFirstTouch, false); 214 223 }); 215 224 } 216 225