├── LICENSE ├── README.md ├── build.js ├── credits ├── index.html ├── peep │ ├── aimee.png │ ├── andrew_grondin.png │ ├── andy_ellis.png │ ├── ben_mathes.png │ ├── david_weekly.png │ ├── jared-c.png │ ├── kate.png │ ├── ljt.png │ ├── matt.png │ ├── michael_duke.png │ ├── michael_huff.png │ ├── natalie.png │ ├── nick_sivo.png │ ├── noel.png │ ├── pablo.png │ ├── phil.png │ ├── rafa_font.png │ ├── sean-r.png │ ├── travis.png │ └── yu-han.png ├── peeps.css └── polygon │ ├── a.png │ ├── aaron.png │ ├── abhishek_modi.png │ ├── aditya_bhargava.png │ ├── aiden_clack.png │ ├── aiman_josefsson.png │ ├── aimee_jarboe.png │ ├── alex_dytrych.png │ ├── alex_g.png │ ├── alex_mole.png │ ├── alexander_zacherl.png │ ├── alexandre_barret.png │ ├── allison_cliftjennings.png │ ├── amy_fuchs.png │ ├── amy_traylor.png │ ├── andrea_di_biagio.png │ ├── andrew_grondin.png │ ├── andy_ellis.png │ ├── anshul_dhawan.png │ ├── anthony_pecorella.png │ ├── aran_jger.png │ ├── aria_minaei.png │ ├── ben_kraft.png │ ├── ben_mathes.png │ ├── bob_wise.png │ ├── bohdan_makohin.png │ ├── boondoggle.png │ ├── brianna_bergen.png │ ├── bruce_steinberg.png │ ├── bryan_bell.png │ ├── caelyn_mcaulay.png │ ├── caio_vinicius_do_nascimento.png │ ├── cathy_deng.png │ ├── cedric_rossi.png │ ├── chad_sansing.png │ ├── charlie_stigler.png │ ├── chris_hallacy.png │ ├── chris_makler.png │ ├── christopher_ferrie.png │ ├── christopher_goes.png │ ├── clive_freeman.png │ ├── colin_anderson.png │ ├── cristy_stone.png │ ├── curtis_frye.png │ ├── cyrus_levy.png │ ├── dag_frode_solberg.png │ ├── dave_mcclure.png │ ├── david.png │ ├── david_e_weekly.png │ ├── david_sallmann.png │ ├── denis_tuzhik.png │ ├── dinos_papadopoulos.png │ ├── dominc.png │ ├── dominopivot.png │ ├── dylan_field.png │ ├── eli_jeschke.png │ ├── eric_chisholm.png │ ├── eric_kim.png │ ├── evan_shulman.png │ ├── fiona_nielsen.png │ ├── florencia_herra_vega.png │ ├── franklin_hernandez.png │ ├── fred_ehrsam.png │ ├── fred_tschepp.png │ ├── freddie_firth.png │ ├── fritz_solares.png │ ├── glen_e_ivey.png │ ├── green.png │ ├── grvling.png │ ├── gui_ambros.png │ ├── harry_brisson.png │ ├── hilary_fried.png │ ├── iago_medeiros_cordeiro.png │ ├── iain_kirkpatrick.png │ ├── idahosa_ness.png │ ├── igor_krawczuk.png │ ├── industrialrobot.png │ ├── istvn_hamar.png │ ├── ivo_murrell.png │ ├── jaakko.png │ ├── jack.png │ ├── jacob_christian_munchandersen.png │ ├── jacob_james.png │ ├── jacopo_cascioli.png │ ├── jamieson_taylor.png │ ├── jan_van_nigtevegt.png │ ├── jared_cosulich.png │ ├── jasmine_ren.png │ ├── jason_crawford.png │ ├── jesper_the_end.png │ ├── jessica_osio.png │ ├── jingfeng_chen.png │ ├── joe_shumaker.png │ ├── jonathan_ng.png │ ├── josef_komenda.png │ ├── josh_cheeseness_bush.png │ ├── josh_comeau.png │ ├── josh_koenig.png │ ├── josh_leong.png │ ├── joshua_horowitz.png │ ├── juan_ignacio_terraza.png │ ├── julie_franke.png │ ├── kailys.png │ ├── kaitlin_smith.png │ ├── karen_cooper.png │ ├── kate_fractal.png │ ├── kelvin_nishikawa.png │ ├── kendra_lockman.png │ ├── kevin_zollman.png │ ├── kumara_uttara.png │ ├── laura.png │ ├── laura_baldwin.png │ ├── leopard_dan.png │ ├── leslie_robinson.png │ ├── linda_liukas.png │ ├── ljt.png │ ├── lucas_garron.png │ ├── lukas_wegmann.png │ ├── m.png │ ├── macdiva.png │ ├── maciej.png │ ├── marconi_pereira.png │ ├── mark_govea.png │ ├── matt.png │ ├── matt_hughes.png │ ├── matt_perez.png │ ├── matthew_weber.png │ ├── melon_deau_douce.png │ ├── mga.png │ ├── michael_donatz.png │ ├── michael_duke.png │ ├── michael_handler.png │ ├── michael_huff.png │ ├── michael_merchant.png │ ├── mikayla_hutchinson.png │ ├── mikey.png │ ├── molly_mcfadden.png │ ├── naomi_alderman.png │ ├── nat_alison.png │ ├── natalie_sun.png │ ├── nelson_crespo.png │ ├── nick.png │ ├── nick_gallegos.png │ ├── nimrod_kimhi.png │ ├── nishanth_sudharsanam.png │ ├── nitai_hady.png │ ├── noah_richards.png │ ├── noel.png │ ├── pablo_molins.png │ ├── patrick_bobell.png │ ├── patrick_henderson.png │ ├── paul_daoust.png │ ├── paul_sztajer.png │ ├── peter_kadlot.png │ ├── phil_dougherty.png │ ├── philippe_vallotti.png │ ├── postmillenial.png │ ├── rachel_nabors.png │ ├── rae_mcintosh.png │ ├── rafael_ffont.png │ ├── raspbeguy.png │ ├── raymond_keller.png │ ├── rebecca_wigandt.png │ ├── reed_copperstrand.png │ ├── rob_mckaughan.png │ ├── rob_napier.png │ ├── robert_aran.png │ ├── robert_duncan.png │ ├── rohit_bhat.png │ ├── rory_sutherland.png │ ├── sal_go.png │ ├── sam_dorios.png │ ├── sam_prinssen.png │ ├── sara_hekimian.png │ ├── scott_donaldson.png │ ├── sean_li.png │ ├── sean_riley.png │ ├── serena_casanova.png │ ├── sergiy_protsiv.png │ ├── shakir_alshareef.png │ ├── skylar_little.png │ ├── sonja_amundson.png │ ├── srini_kadamati.png │ ├── stacey_walters.png │ ├── stefan_rausch.png │ ├── stefano_baccianella.png │ ├── steve_krouse.png │ ├── steve_ryman.png │ ├── steve_waldman.png │ ├── tal_rotbart.png │ ├── tamir_bahar.png │ ├── teodor_zhechev.png │ ├── the_arkadia.png │ ├── thomas_de_rego.png │ ├── toby_schachman.png │ ├── todd_siegel.png │ ├── tom_lieber.png │ ├── toph_tucker.png │ ├── travis_ross.png │ ├── trevor_haldenby.png │ ├── tudor_iliescu.png │ ├── upidaisy.png │ ├── will_emigh.png │ ├── william_ohanley.png │ ├── wouter_slegers.png │ ├── yinhung_hsu.png │ ├── yuhan_kuo.png │ ├── yury_melnichek.png │ └── zach_smith.png ├── demo ├── demo.css ├── music │ ├── Music.js │ ├── Tone.min.js │ ├── d3-color.v1.min.js │ ├── d3-interpolate.v1.min.js │ ├── d3-scale.v1.min.js │ ├── index.html │ ├── music-demo.js │ ├── music_icons.png │ └── thumbs │ │ ├── blank.png │ │ ├── fractal.png │ │ ├── random.png │ │ ├── staircase.png │ │ └── waves.png ├── nonlinear │ ├── d3.v4.min.js │ ├── index.html │ ├── nonlinear-demo.js │ └── thumbs │ │ ├── blank.png │ │ ├── disease-old.png │ │ ├── disease.png │ │ ├── prey.png │ │ ├── spring.png │ │ └── waves.png └── turtle │ ├── FuturaHandwritten.ttf │ ├── Turtle.js │ ├── index.html │ ├── thumbs │ ├── blank.png │ ├── flower.png │ ├── spiral.png │ ├── spiral2.png │ └── star.png │ └── turtle-demo.js ├── dist ├── joy.css ├── joy.js └── joy.min.js ├── favicon.png ├── frontpage ├── demo_music.png ├── demo_nonlinear.png ├── demo_turtle.png ├── frontpage.css ├── frontpage.js ├── joy.mp4 ├── music.mp4 ├── nonlinear.mp4 ├── splash.png └── turtle.mp4 ├── getting-started ├── AHHH.png ├── examples │ ├── FuturaHandwritten.ttf │ ├── Turtle.js │ ├── box.html │ └── turtle.html ├── getting-started.css ├── highlight │ ├── highlight.pack.js │ └── zenburn.css └── index.html ├── index.html ├── node_modules ├── .bin │ └── uglifyjs └── uglify-js │ ├── LICENSE │ ├── README.md │ ├── bin │ └── uglifyjs │ ├── lib │ ├── ast.js │ ├── compress.js │ ├── minify.js │ ├── mozilla-ast.js │ ├── output.js │ ├── parse.js │ ├── propmangle.js │ ├── scope.js │ ├── sourcemap.js │ ├── transform.js │ └── utils.js │ ├── node_modules │ ├── commander │ │ ├── Readme.md │ │ ├── index.js │ │ ├── package.json │ │ └── typings │ │ │ └── index.d.ts │ └── source-map │ │ ├── README.md │ │ ├── dist │ │ ├── source-map.debug.js │ │ ├── source-map.js │ │ ├── source-map.min.js │ │ └── source-map.min.js.map │ │ ├── lib │ │ ├── array-set.js │ │ ├── base64-vlq.js │ │ ├── base64.js │ │ ├── binary-search.js │ │ ├── mapping-list.js │ │ ├── quick-sort.js │ │ ├── source-map-consumer.js │ │ ├── source-map-generator.js │ │ ├── source-node.js │ │ └── util.js │ │ ├── package.json │ │ ├── source-map.d.ts │ │ └── source-map.js │ ├── package.json │ └── tools │ ├── domprops.json │ ├── exports.js │ ├── node.js │ └── props.html ├── social ├── Email.png ├── Facebook.png ├── Twitter.png └── thumbnail.png └── src ├── core ├── Joy.js ├── joy-actors-actions.js ├── joy-actors-instructions.js ├── joy-actors-math.js ├── joy-actors-random.js ├── joy-actors-ui.js ├── joy-actors-vars.js ├── joy-modal.js └── joy-ui.js ├── css └── joy.css └── lib ├── -helpers.js ├── lz-string.min.js └── watch.min.js /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](http://ncase.me/joy/social/thumbnail.png) 2 | 3 | **JOY.JS, VERSION ZERO (the crappy version)** 4 | 5 | What the heck is Joy.js? [Check this!](http://ncase.me/joy/) 6 | 7 | Want to get started with Joy.js? [Read this!](http://ncase.me/joy/getting-started/) 8 | 9 | Joy.js is [public domain, yo](https://creativecommons.org/publicdomain/zero/1.0/) -------------------------------------------------------------------------------- /build.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var fs = require('fs'); 4 | var UglifyJS = require("uglify-js"); 5 | 6 | // Get list of files, in order, and concatenate 'em 7 | var files = [ 8 | "src/core/Joy.js", 9 | "src/lib/-helpers.js", 10 | "src/lib/watch.min.js", 11 | "src/lib/lz-string.min.js", 12 | "src/core/joy-ui.js", 13 | "src/core/joy-modal.js", 14 | "src/core/joy-actors-ui.js", 15 | "src/core/joy-actors-actions.js", 16 | "src/core/joy-actors-instructions.js", 17 | "src/core/joy-actors-vars.js", 18 | "src/core/joy-actors-math.js", 19 | "src/core/joy-actors-random.js" 20 | ] 21 | var js = ""; 22 | for(var i=0; i div{ 43 | position: relative; 44 | width: 150px; 45 | height: 210px; 46 | text-align: center; 47 | display: inline-block; 48 | margin-right: -6px; 49 | } 50 | .credits_peeps > div > img:nth-child(1){ 51 | position: absolute; 52 | left: 0; 53 | width: 150px; 54 | bottom: 30px; 55 | } 56 | .credits_peeps > div > img:nth-child(2){ 57 | position: absolute; 58 | width: 50px; 59 | right: 5px; 60 | bottom: 30px; 61 | } 62 | .credits_peeps > div > span{ 63 | display: block; 64 | position: absolute; 65 | bottom:0; 66 | width: 150px; 67 | height: 20px; 68 | text-transform: lowercase; 69 | } 70 | 71 | .credits_polygons{ 72 | margin-top: 15px; 73 | overflow: hidden; 74 | color: #ddd; 75 | font-size: 18px; 76 | padding-bottom: 20px; 77 | text-align: center; 78 | } 79 | .credits_polygons > div{ 80 | display: inline-block; 81 | } 82 | .credits_polygons > div > img{ 83 | width: 40px; 84 | position: relative; 85 | top:10px; 86 | } 87 | .credits_polygons > div > span{ 88 | text-transform: lowercase; 89 | } 90 | 91 | .credits_names{ 92 | margin-top: 30px; 93 | overflow: hidden; 94 | color: #bbb; 95 | font-size: 16px; 96 | padding-bottom: 20px; 97 | text-align: center; 98 | -webkit-columns: 150px 3; 99 | -moz-columns: 150px 3; 100 | columns: 150px 3; 101 | } -------------------------------------------------------------------------------- /credits/polygon/a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/a.png -------------------------------------------------------------------------------- /credits/polygon/aaron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aaron.png -------------------------------------------------------------------------------- /credits/polygon/abhishek_modi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/abhishek_modi.png -------------------------------------------------------------------------------- /credits/polygon/aditya_bhargava.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aditya_bhargava.png -------------------------------------------------------------------------------- /credits/polygon/aiden_clack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aiden_clack.png -------------------------------------------------------------------------------- /credits/polygon/aiman_josefsson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aiman_josefsson.png -------------------------------------------------------------------------------- /credits/polygon/aimee_jarboe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aimee_jarboe.png -------------------------------------------------------------------------------- /credits/polygon/alex_dytrych.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/alex_dytrych.png -------------------------------------------------------------------------------- /credits/polygon/alex_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/alex_g.png -------------------------------------------------------------------------------- /credits/polygon/alex_mole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/alex_mole.png -------------------------------------------------------------------------------- /credits/polygon/alexander_zacherl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/alexander_zacherl.png -------------------------------------------------------------------------------- /credits/polygon/alexandre_barret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/alexandre_barret.png -------------------------------------------------------------------------------- /credits/polygon/allison_cliftjennings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/allison_cliftjennings.png -------------------------------------------------------------------------------- /credits/polygon/amy_fuchs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/amy_fuchs.png -------------------------------------------------------------------------------- /credits/polygon/amy_traylor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/amy_traylor.png -------------------------------------------------------------------------------- /credits/polygon/andrea_di_biagio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/andrea_di_biagio.png -------------------------------------------------------------------------------- /credits/polygon/andrew_grondin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/andrew_grondin.png -------------------------------------------------------------------------------- /credits/polygon/andy_ellis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/andy_ellis.png -------------------------------------------------------------------------------- /credits/polygon/anshul_dhawan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/anshul_dhawan.png -------------------------------------------------------------------------------- /credits/polygon/anthony_pecorella.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/anthony_pecorella.png -------------------------------------------------------------------------------- /credits/polygon/aran_jger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aran_jger.png -------------------------------------------------------------------------------- /credits/polygon/aria_minaei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/aria_minaei.png -------------------------------------------------------------------------------- /credits/polygon/ben_kraft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/ben_kraft.png -------------------------------------------------------------------------------- /credits/polygon/ben_mathes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/ben_mathes.png -------------------------------------------------------------------------------- /credits/polygon/bob_wise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/bob_wise.png -------------------------------------------------------------------------------- /credits/polygon/bohdan_makohin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/bohdan_makohin.png -------------------------------------------------------------------------------- /credits/polygon/boondoggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/boondoggle.png -------------------------------------------------------------------------------- /credits/polygon/brianna_bergen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/brianna_bergen.png -------------------------------------------------------------------------------- /credits/polygon/bruce_steinberg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/bruce_steinberg.png -------------------------------------------------------------------------------- /credits/polygon/bryan_bell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/bryan_bell.png -------------------------------------------------------------------------------- /credits/polygon/caelyn_mcaulay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/caelyn_mcaulay.png -------------------------------------------------------------------------------- /credits/polygon/caio_vinicius_do_nascimento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/caio_vinicius_do_nascimento.png -------------------------------------------------------------------------------- /credits/polygon/cathy_deng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/cathy_deng.png -------------------------------------------------------------------------------- /credits/polygon/cedric_rossi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/cedric_rossi.png -------------------------------------------------------------------------------- /credits/polygon/chad_sansing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/chad_sansing.png -------------------------------------------------------------------------------- /credits/polygon/charlie_stigler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/charlie_stigler.png -------------------------------------------------------------------------------- /credits/polygon/chris_hallacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/chris_hallacy.png -------------------------------------------------------------------------------- /credits/polygon/chris_makler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/chris_makler.png -------------------------------------------------------------------------------- /credits/polygon/christopher_ferrie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/christopher_ferrie.png -------------------------------------------------------------------------------- /credits/polygon/christopher_goes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/christopher_goes.png -------------------------------------------------------------------------------- /credits/polygon/clive_freeman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/clive_freeman.png -------------------------------------------------------------------------------- /credits/polygon/colin_anderson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/colin_anderson.png -------------------------------------------------------------------------------- /credits/polygon/cristy_stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/cristy_stone.png -------------------------------------------------------------------------------- /credits/polygon/curtis_frye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/curtis_frye.png -------------------------------------------------------------------------------- /credits/polygon/cyrus_levy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/cyrus_levy.png -------------------------------------------------------------------------------- /credits/polygon/dag_frode_solberg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dag_frode_solberg.png -------------------------------------------------------------------------------- /credits/polygon/dave_mcclure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dave_mcclure.png -------------------------------------------------------------------------------- /credits/polygon/david.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/david.png -------------------------------------------------------------------------------- /credits/polygon/david_e_weekly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/david_e_weekly.png -------------------------------------------------------------------------------- /credits/polygon/david_sallmann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/david_sallmann.png -------------------------------------------------------------------------------- /credits/polygon/denis_tuzhik.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/denis_tuzhik.png -------------------------------------------------------------------------------- /credits/polygon/dinos_papadopoulos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dinos_papadopoulos.png -------------------------------------------------------------------------------- /credits/polygon/dominc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dominc.png -------------------------------------------------------------------------------- /credits/polygon/dominopivot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dominopivot.png -------------------------------------------------------------------------------- /credits/polygon/dylan_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/dylan_field.png -------------------------------------------------------------------------------- /credits/polygon/eli_jeschke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/eli_jeschke.png -------------------------------------------------------------------------------- /credits/polygon/eric_chisholm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/eric_chisholm.png -------------------------------------------------------------------------------- /credits/polygon/eric_kim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/eric_kim.png -------------------------------------------------------------------------------- /credits/polygon/evan_shulman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/evan_shulman.png -------------------------------------------------------------------------------- /credits/polygon/fiona_nielsen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/fiona_nielsen.png -------------------------------------------------------------------------------- /credits/polygon/florencia_herra_vega.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/florencia_herra_vega.png -------------------------------------------------------------------------------- /credits/polygon/franklin_hernandez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/franklin_hernandez.png -------------------------------------------------------------------------------- /credits/polygon/fred_ehrsam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/fred_ehrsam.png -------------------------------------------------------------------------------- /credits/polygon/fred_tschepp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/fred_tschepp.png -------------------------------------------------------------------------------- /credits/polygon/freddie_firth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/freddie_firth.png -------------------------------------------------------------------------------- /credits/polygon/fritz_solares.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/fritz_solares.png -------------------------------------------------------------------------------- /credits/polygon/glen_e_ivey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/glen_e_ivey.png -------------------------------------------------------------------------------- /credits/polygon/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/green.png -------------------------------------------------------------------------------- /credits/polygon/grvling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/grvling.png -------------------------------------------------------------------------------- /credits/polygon/gui_ambros.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/gui_ambros.png -------------------------------------------------------------------------------- /credits/polygon/harry_brisson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/harry_brisson.png -------------------------------------------------------------------------------- /credits/polygon/hilary_fried.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/hilary_fried.png -------------------------------------------------------------------------------- /credits/polygon/iago_medeiros_cordeiro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/iago_medeiros_cordeiro.png -------------------------------------------------------------------------------- /credits/polygon/iain_kirkpatrick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/iain_kirkpatrick.png -------------------------------------------------------------------------------- /credits/polygon/idahosa_ness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/idahosa_ness.png -------------------------------------------------------------------------------- /credits/polygon/igor_krawczuk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/igor_krawczuk.png -------------------------------------------------------------------------------- /credits/polygon/industrialrobot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/industrialrobot.png -------------------------------------------------------------------------------- /credits/polygon/istvn_hamar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/istvn_hamar.png -------------------------------------------------------------------------------- /credits/polygon/ivo_murrell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/ivo_murrell.png -------------------------------------------------------------------------------- /credits/polygon/jaakko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jaakko.png -------------------------------------------------------------------------------- /credits/polygon/jack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jack.png -------------------------------------------------------------------------------- /credits/polygon/jacob_christian_munchandersen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jacob_christian_munchandersen.png -------------------------------------------------------------------------------- /credits/polygon/jacob_james.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jacob_james.png -------------------------------------------------------------------------------- /credits/polygon/jacopo_cascioli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jacopo_cascioli.png -------------------------------------------------------------------------------- /credits/polygon/jamieson_taylor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jamieson_taylor.png -------------------------------------------------------------------------------- /credits/polygon/jan_van_nigtevegt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jan_van_nigtevegt.png -------------------------------------------------------------------------------- /credits/polygon/jared_cosulich.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jared_cosulich.png -------------------------------------------------------------------------------- /credits/polygon/jasmine_ren.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jasmine_ren.png -------------------------------------------------------------------------------- /credits/polygon/jason_crawford.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jason_crawford.png -------------------------------------------------------------------------------- /credits/polygon/jesper_the_end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jesper_the_end.png -------------------------------------------------------------------------------- /credits/polygon/jessica_osio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jessica_osio.png -------------------------------------------------------------------------------- /credits/polygon/jingfeng_chen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jingfeng_chen.png -------------------------------------------------------------------------------- /credits/polygon/joe_shumaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/joe_shumaker.png -------------------------------------------------------------------------------- /credits/polygon/jonathan_ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/jonathan_ng.png -------------------------------------------------------------------------------- /credits/polygon/josef_komenda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/josef_komenda.png -------------------------------------------------------------------------------- /credits/polygon/josh_cheeseness_bush.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/josh_cheeseness_bush.png -------------------------------------------------------------------------------- /credits/polygon/josh_comeau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/josh_comeau.png -------------------------------------------------------------------------------- /credits/polygon/josh_koenig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/josh_koenig.png -------------------------------------------------------------------------------- /credits/polygon/josh_leong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/josh_leong.png -------------------------------------------------------------------------------- /credits/polygon/joshua_horowitz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/joshua_horowitz.png -------------------------------------------------------------------------------- /credits/polygon/juan_ignacio_terraza.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/juan_ignacio_terraza.png -------------------------------------------------------------------------------- /credits/polygon/julie_franke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/julie_franke.png -------------------------------------------------------------------------------- /credits/polygon/kailys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kailys.png -------------------------------------------------------------------------------- /credits/polygon/kaitlin_smith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kaitlin_smith.png -------------------------------------------------------------------------------- /credits/polygon/karen_cooper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/karen_cooper.png -------------------------------------------------------------------------------- /credits/polygon/kate_fractal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kate_fractal.png -------------------------------------------------------------------------------- /credits/polygon/kelvin_nishikawa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kelvin_nishikawa.png -------------------------------------------------------------------------------- /credits/polygon/kendra_lockman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kendra_lockman.png -------------------------------------------------------------------------------- /credits/polygon/kevin_zollman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kevin_zollman.png -------------------------------------------------------------------------------- /credits/polygon/kumara_uttara.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/kumara_uttara.png -------------------------------------------------------------------------------- /credits/polygon/laura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/laura.png -------------------------------------------------------------------------------- /credits/polygon/laura_baldwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/laura_baldwin.png -------------------------------------------------------------------------------- /credits/polygon/leopard_dan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/leopard_dan.png -------------------------------------------------------------------------------- /credits/polygon/leslie_robinson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/leslie_robinson.png -------------------------------------------------------------------------------- /credits/polygon/linda_liukas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/linda_liukas.png -------------------------------------------------------------------------------- /credits/polygon/ljt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/ljt.png -------------------------------------------------------------------------------- /credits/polygon/lucas_garron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/lucas_garron.png -------------------------------------------------------------------------------- /credits/polygon/lukas_wegmann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/lukas_wegmann.png -------------------------------------------------------------------------------- /credits/polygon/m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/m.png -------------------------------------------------------------------------------- /credits/polygon/macdiva.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/macdiva.png -------------------------------------------------------------------------------- /credits/polygon/maciej.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/maciej.png -------------------------------------------------------------------------------- /credits/polygon/marconi_pereira.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/marconi_pereira.png -------------------------------------------------------------------------------- /credits/polygon/mark_govea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/mark_govea.png -------------------------------------------------------------------------------- /credits/polygon/matt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/matt.png -------------------------------------------------------------------------------- /credits/polygon/matt_hughes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/matt_hughes.png -------------------------------------------------------------------------------- /credits/polygon/matt_perez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/matt_perez.png -------------------------------------------------------------------------------- /credits/polygon/matthew_weber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/matthew_weber.png -------------------------------------------------------------------------------- /credits/polygon/melon_deau_douce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/melon_deau_douce.png -------------------------------------------------------------------------------- /credits/polygon/mga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/mga.png -------------------------------------------------------------------------------- /credits/polygon/michael_donatz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/michael_donatz.png -------------------------------------------------------------------------------- /credits/polygon/michael_duke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/michael_duke.png -------------------------------------------------------------------------------- /credits/polygon/michael_handler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/michael_handler.png -------------------------------------------------------------------------------- /credits/polygon/michael_huff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/michael_huff.png -------------------------------------------------------------------------------- /credits/polygon/michael_merchant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/michael_merchant.png -------------------------------------------------------------------------------- /credits/polygon/mikayla_hutchinson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/mikayla_hutchinson.png -------------------------------------------------------------------------------- /credits/polygon/mikey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/mikey.png -------------------------------------------------------------------------------- /credits/polygon/molly_mcfadden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/molly_mcfadden.png -------------------------------------------------------------------------------- /credits/polygon/naomi_alderman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/naomi_alderman.png -------------------------------------------------------------------------------- /credits/polygon/nat_alison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nat_alison.png -------------------------------------------------------------------------------- /credits/polygon/natalie_sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/natalie_sun.png -------------------------------------------------------------------------------- /credits/polygon/nelson_crespo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nelson_crespo.png -------------------------------------------------------------------------------- /credits/polygon/nick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nick.png -------------------------------------------------------------------------------- /credits/polygon/nick_gallegos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nick_gallegos.png -------------------------------------------------------------------------------- /credits/polygon/nimrod_kimhi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nimrod_kimhi.png -------------------------------------------------------------------------------- /credits/polygon/nishanth_sudharsanam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nishanth_sudharsanam.png -------------------------------------------------------------------------------- /credits/polygon/nitai_hady.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/nitai_hady.png -------------------------------------------------------------------------------- /credits/polygon/noah_richards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/noah_richards.png -------------------------------------------------------------------------------- /credits/polygon/noel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/noel.png -------------------------------------------------------------------------------- /credits/polygon/pablo_molins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/pablo_molins.png -------------------------------------------------------------------------------- /credits/polygon/patrick_bobell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/patrick_bobell.png -------------------------------------------------------------------------------- /credits/polygon/patrick_henderson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/patrick_henderson.png -------------------------------------------------------------------------------- /credits/polygon/paul_daoust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/paul_daoust.png -------------------------------------------------------------------------------- /credits/polygon/paul_sztajer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/paul_sztajer.png -------------------------------------------------------------------------------- /credits/polygon/peter_kadlot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/peter_kadlot.png -------------------------------------------------------------------------------- /credits/polygon/phil_dougherty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/phil_dougherty.png -------------------------------------------------------------------------------- /credits/polygon/philippe_vallotti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/philippe_vallotti.png -------------------------------------------------------------------------------- /credits/polygon/postmillenial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/postmillenial.png -------------------------------------------------------------------------------- /credits/polygon/rachel_nabors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rachel_nabors.png -------------------------------------------------------------------------------- /credits/polygon/rae_mcintosh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rae_mcintosh.png -------------------------------------------------------------------------------- /credits/polygon/rafael_ffont.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rafael_ffont.png -------------------------------------------------------------------------------- /credits/polygon/raspbeguy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/raspbeguy.png -------------------------------------------------------------------------------- /credits/polygon/raymond_keller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/raymond_keller.png -------------------------------------------------------------------------------- /credits/polygon/rebecca_wigandt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rebecca_wigandt.png -------------------------------------------------------------------------------- /credits/polygon/reed_copperstrand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/reed_copperstrand.png -------------------------------------------------------------------------------- /credits/polygon/rob_mckaughan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rob_mckaughan.png -------------------------------------------------------------------------------- /credits/polygon/rob_napier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rob_napier.png -------------------------------------------------------------------------------- /credits/polygon/robert_aran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/robert_aran.png -------------------------------------------------------------------------------- /credits/polygon/robert_duncan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/robert_duncan.png -------------------------------------------------------------------------------- /credits/polygon/rohit_bhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rohit_bhat.png -------------------------------------------------------------------------------- /credits/polygon/rory_sutherland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/rory_sutherland.png -------------------------------------------------------------------------------- /credits/polygon/sal_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sal_go.png -------------------------------------------------------------------------------- /credits/polygon/sam_dorios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sam_dorios.png -------------------------------------------------------------------------------- /credits/polygon/sam_prinssen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sam_prinssen.png -------------------------------------------------------------------------------- /credits/polygon/sara_hekimian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sara_hekimian.png -------------------------------------------------------------------------------- /credits/polygon/scott_donaldson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/scott_donaldson.png -------------------------------------------------------------------------------- /credits/polygon/sean_li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sean_li.png -------------------------------------------------------------------------------- /credits/polygon/sean_riley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sean_riley.png -------------------------------------------------------------------------------- /credits/polygon/serena_casanova.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/serena_casanova.png -------------------------------------------------------------------------------- /credits/polygon/sergiy_protsiv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sergiy_protsiv.png -------------------------------------------------------------------------------- /credits/polygon/shakir_alshareef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/shakir_alshareef.png -------------------------------------------------------------------------------- /credits/polygon/skylar_little.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/skylar_little.png -------------------------------------------------------------------------------- /credits/polygon/sonja_amundson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/sonja_amundson.png -------------------------------------------------------------------------------- /credits/polygon/srini_kadamati.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/srini_kadamati.png -------------------------------------------------------------------------------- /credits/polygon/stacey_walters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/stacey_walters.png -------------------------------------------------------------------------------- /credits/polygon/stefan_rausch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/stefan_rausch.png -------------------------------------------------------------------------------- /credits/polygon/stefano_baccianella.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/stefano_baccianella.png -------------------------------------------------------------------------------- /credits/polygon/steve_krouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/steve_krouse.png -------------------------------------------------------------------------------- /credits/polygon/steve_ryman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/steve_ryman.png -------------------------------------------------------------------------------- /credits/polygon/steve_waldman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/steve_waldman.png -------------------------------------------------------------------------------- /credits/polygon/tal_rotbart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/tal_rotbart.png -------------------------------------------------------------------------------- /credits/polygon/tamir_bahar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/tamir_bahar.png -------------------------------------------------------------------------------- /credits/polygon/teodor_zhechev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/teodor_zhechev.png -------------------------------------------------------------------------------- /credits/polygon/the_arkadia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/the_arkadia.png -------------------------------------------------------------------------------- /credits/polygon/thomas_de_rego.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/thomas_de_rego.png -------------------------------------------------------------------------------- /credits/polygon/toby_schachman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/toby_schachman.png -------------------------------------------------------------------------------- /credits/polygon/todd_siegel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/todd_siegel.png -------------------------------------------------------------------------------- /credits/polygon/tom_lieber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/tom_lieber.png -------------------------------------------------------------------------------- /credits/polygon/toph_tucker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/toph_tucker.png -------------------------------------------------------------------------------- /credits/polygon/travis_ross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/travis_ross.png -------------------------------------------------------------------------------- /credits/polygon/trevor_haldenby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/trevor_haldenby.png -------------------------------------------------------------------------------- /credits/polygon/tudor_iliescu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/tudor_iliescu.png -------------------------------------------------------------------------------- /credits/polygon/upidaisy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/upidaisy.png -------------------------------------------------------------------------------- /credits/polygon/will_emigh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/will_emigh.png -------------------------------------------------------------------------------- /credits/polygon/william_ohanley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/william_ohanley.png -------------------------------------------------------------------------------- /credits/polygon/wouter_slegers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/wouter_slegers.png -------------------------------------------------------------------------------- /credits/polygon/yinhung_hsu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/yinhung_hsu.png -------------------------------------------------------------------------------- /credits/polygon/yuhan_kuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/yuhan_kuo.png -------------------------------------------------------------------------------- /credits/polygon/yury_melnichek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/yury_melnichek.png -------------------------------------------------------------------------------- /credits/polygon/zach_smith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/credits/polygon/zach_smith.png -------------------------------------------------------------------------------- /demo/demo.css: -------------------------------------------------------------------------------- 1 | html{ 2 | width: 100%; 3 | height: 100%; 4 | } 5 | body{ 6 | margin: 0; 7 | font-size: 22px; 8 | font-weight: 100; 9 | line-height: 1.7em; 10 | font-family: Helvetica, Arial, sans-serif; 11 | width: 100%; 12 | height: 100%; 13 | } 14 | pre{ 15 | font-size: 15px; 16 | line-height: 1.2em; 17 | } 18 | 19 | #content{ 20 | overflow: hidden; 21 | } 22 | #container{ 23 | width: 1000px; 24 | height: 500px; 25 | background: #fff; 26 | border: 2px solid #ddd; 27 | margin: 20px auto; 28 | } 29 | #player{ 30 | width:500px; 31 | height:500px; 32 | float:left; 33 | position: relative; 34 | } 35 | #editor{ 36 | width:500px; 37 | height:500px; 38 | float:left; 39 | background: #eee; 40 | 41 | overflow-x: hidden; 42 | overflow-y: scroll; 43 | } 44 | #editor hr{ 45 | border: none; 46 | border-bottom: 2px dashed #ccc; 47 | margin: 1.5em 0; 48 | } 49 | #footer{ 50 | width: 920px; 51 | height: 105px; 52 | margin: 20px auto; 53 | } 54 | #more-shtuff{ 55 | width: 320px; 56 | float: left; 57 | font-size: 14px; 58 | line-height: 1.5em; 59 | } 60 | #demos{ 61 | overflow: hidden; 62 | width: 600px; 63 | text-align: center; 64 | float: right; 65 | } 66 | #demos a{ 67 | display: inline-block; 68 | position: relative; 69 | margin: 0 5px; 70 | } 71 | #demos a img{ 72 | width:100px; height:100px; 73 | border: 2px solid #ddd; 74 | } 75 | #demos a span{ 76 | position: absolute; 77 | top:0; left:0; 78 | display: none; 79 | width:100%; height:100%; 80 | background: rgba(0,0,0,0.7); 81 | color: #fff; 82 | text-decoration: none; 83 | line-height: 100px; 84 | } 85 | #demos a:hover span{ 86 | display: block; 87 | } -------------------------------------------------------------------------------- /demo/music/Music.js: -------------------------------------------------------------------------------- 1 | // A KIND OF PLACEHOLDER THING 2 | function Music(containerID){ 3 | 4 | var self = this; 5 | 6 | var container = document.querySelector(containerID); 7 | 8 | // Create a lil' music canvas 9 | var canvas = document.createElement("canvas"); 10 | canvas.width = 1000; 11 | canvas.height = 1000; 12 | canvas.id = "music_sheet"; 13 | var ctx = canvas.getContext('2d'); 14 | container.appendChild(canvas); 15 | 16 | // And also a play-pause overlay 17 | var overlay = document.createElement("div"); 18 | overlay.id = "overlay"; 19 | container.appendChild(overlay); 20 | 21 | // PLAY/PAUSE 22 | self.isPlaying = true; 23 | var _onclick = function(){ 24 | if(self.isPlaying){ 25 | // Deactivate all notes 26 | self.deactivateAllNotes(); 27 | self.isPlaying = false; 28 | _onmousemove(event); 29 | }else{ 30 | self.isPlaying = true; 31 | } 32 | 33 | // Overlay 34 | overlay.setAttribute("playing", self.isPlaying?"yes":"no"); 35 | 36 | }; 37 | var _onmousemove = function(event){ 38 | if(!self.isPlaying){ 39 | var x = event.offsetX; 40 | if(event.target!=container) x+=event.target.offsetLeft; // HACK 41 | var time = TOTAL_TIME*(x/(canvas.width/2)); 42 | self.currentTime = time; 43 | } 44 | }; 45 | container.addEventListener("click", _onclick, true); 46 | container.addEventListener("mousemove", _onmousemove, true); 47 | 48 | // POOL OF SYNTHS 49 | var MAX_SYNTHS = 16; 50 | //self.synthIndex = 0; 51 | self.synthPool = []; 52 | for(var i=0; iPITCH_HIGHEST) note.pitch=PITCH_HIGHEST; 123 | // 0s < time < 6s (or... loop around?) 124 | if(note.time<0) note.time=0; 125 | if(note.time>TOTAL_TIME) note.time=TOTAL_TIME; 126 | // 0s < length < 6s 127 | if(note.length<0) note.length=0; 128 | if(note.length>TOTAL_TIME) note.length=TOTAL_TIME; 129 | // 0% < volume < 100% 130 | /*if(note.volume<0) note.volume=0; 131 | if(note.volume>100) note.volume=100;*/ 132 | note.volume = 100; 133 | 134 | // NOT ACTIVE 135 | note.active = false; 136 | 137 | // ADD NOTE 138 | self.notes.push(note); 139 | 140 | }; 141 | 142 | // Update, too, I suppose... with DELTA 143 | self.currentTime = 0; 144 | self.update = function(delta){ 145 | 146 | // ONLY WHEN PLAYING 147 | if(self.isPlaying){ 148 | 149 | // Current Time 150 | self.currentTime += delta/1000; 151 | if(self.currentTime>TOTAL_TIME){ 152 | self.deactivateAllNotes(); 153 | joy.update(); // TOTAL HACK, WHATEVER 154 | } 155 | while(self.currentTime>TOTAL_TIME) self.currentTime-=TOTAL_TIME; 156 | 157 | // Active Notes? 158 | for(var i=0; i180||r<-180?r-360*Math.round(r/360):r):Y(isNaN(t)?n:t)}function a(t){return 1==(t=+t)?i:function(n,r){return r-n?o(n,r,t):Y(isNaN(n)?r:n)}}function i(t,n){var r=n-t;return r?e(t,r):Y(isNaN(t)?n:t)}function l(t){return function(r){var e,o,u=r.length,a=new Array(u),i=new Array(u),l=new Array(u);for(e=0;e180?n+=360:n-t>180&&(t+=360),u.push({i:r.push(o(r)+"rotate(",null,e)-2,x:E(t,n)})):n&&r.push(o(r)+"rotate("+n+e)}function i(t,n,r,u){t!==n?u.push({i:r.push(o(r)+"skewX(",null,e)-2,x:E(t,n)}):n&&r.push(o(r)+"skewX("+n+e)}function l(t,n,r,e,u,a){if(t!==r||n!==e){var i=u.push(o(u)+"scale(",null,",",null,")");a.push({i:i-4,x:E(t,r)},{i:i-2,x:E(n,e)})}else 1===r&&1===e||u.push(o(u)+"scale("+r+","+e+")")}return function(n,r){var e=[],o=[];return n=t(n),r=t(r),u(n.translateX,n.translateY,r.translateX,r.translateY,e,o),a(n.rotate,r.rotate,e,o),i(n.skewX,r.skewX,e,o),l(n.scaleX,n.scaleY,r.scaleX,r.scaleY,e,o),n=r=null,function(t){for(var n,r=-1,u=o.length;++r=1?(e=1,n-1):Math.floor(e*n),u=t[o],a=t[o+1],i=o>0?t[o-1]:2*u-a,l=ou&&(o=n.slice(u,o),i[a]?i[a]+=o:i[++a]=o),(r=r[0])===(e=e[0])?i[a]?i[a]+=e:i[++a]=e:(i[++a]=null,l.push({i:a,x:E(r,e)})),u=D.lastIndex;return u 2 | 3 | 4 | 5 | 6 | The Joy of Music 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 |
38 |
39 |
40 |
41 | 79 |
80 | 81 | 82 | 83 | 84 | 85 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /demo/music/music_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/music_icons.png -------------------------------------------------------------------------------- /demo/music/thumbs/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/thumbs/blank.png -------------------------------------------------------------------------------- /demo/music/thumbs/fractal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/thumbs/fractal.png -------------------------------------------------------------------------------- /demo/music/thumbs/random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/thumbs/random.png -------------------------------------------------------------------------------- /demo/music/thumbs/staircase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/thumbs/staircase.png -------------------------------------------------------------------------------- /demo/music/thumbs/waves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/music/thumbs/waves.png -------------------------------------------------------------------------------- /demo/nonlinear/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | The Joy of Nonlinear Dynamics 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 |
37 |
38 |
39 |
40 | 78 |
79 | 80 | 81 | 82 | 83 | 84 | 85 | 126 | 127 | -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/blank.png -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/disease-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/disease-old.png -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/disease.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/disease.png -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/prey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/prey.png -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/spring.png -------------------------------------------------------------------------------- /demo/nonlinear/thumbs/waves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/nonlinear/thumbs/waves.png -------------------------------------------------------------------------------- /demo/turtle/FuturaHandwritten.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/FuturaHandwritten.ttf -------------------------------------------------------------------------------- /demo/turtle/Turtle.js: -------------------------------------------------------------------------------- 1 | Math.TAU = Math.PI*2; 2 | 3 | function Turtle(config){ 4 | 5 | var self = this; 6 | 7 | // Config 8 | var data = config.data || {}; 9 | if(data.frameX===undefined) data.frameX=250; 10 | if(data.frameY===undefined) data.frameY=250; 11 | 12 | // Canvas & Context (Retina!) 13 | self.width = config.width; 14 | self.height = config.height; 15 | var canvas = document.createElement("canvas"); 16 | self.canvas = canvas; 17 | canvas.width = self.width*2; 18 | canvas.height = self.height*2; 19 | canvas.style.width = self.width+"px"; 20 | canvas.style.height = self.height+"px"; 21 | var ctx = canvas.getContext("2d"); 22 | self.context = ctx; 23 | 24 | // Start off like this... 25 | self.reset = function(){ 26 | ctx.setTransform(2, 0, 0, 2, 0, 0); // retina 27 | ctx.clearRect(0, 0, canvas.width, canvas.height); 28 | ctx.translate(self.frameX, self.frameY); 29 | self.color = "#ff4040"; 30 | self.x = self.width/2; 31 | self.y = self.height/2; 32 | self.angle = -Math.TAU/4; // facing up 33 | self.pen = true; // brush is active! 34 | }; 35 | self.reset(); 36 | 37 | // Turtle methods! 38 | self.forward = function(steps){ 39 | 40 | // Move 41 | self.x += Math.cos(self.angle)*steps; 42 | self.y += Math.sin(self.angle)*steps; 43 | 44 | // Draw 45 | if(self.pen){ 46 | ctx.lineTo(self.x, self.y); 47 | } 48 | 49 | }; 50 | self.turn = function(angle){ 51 | self.angle += angle*(Math.TAU/360); 52 | }; 53 | 54 | // Turtle switch color... 55 | self.setColor = function(newColor){ 56 | self.endLine(); 57 | self.color = newColor; 58 | self.startLine(); 59 | }; 60 | 61 | // Pen up (off) or down (up)... 62 | self.setPen = function(pen){ 63 | if(self.pen && !pen) self.endLine(); // Turning OFF pen? End that last line! 64 | if(!self.pen && pen) self.startLine(); // Turning ON a pen? Start a new line! 65 | self.pen = pen; 66 | }; 67 | 68 | // Start & end drawing... 69 | ctx.lineCap = "round"; 70 | ctx.lineJoin = "round"; 71 | self.start = function(x,y){ 72 | 73 | // reset & position 74 | self.reset(); 75 | self.x = 0; 76 | self.y = 0; 77 | 78 | // draw 79 | self.startLine(); 80 | }; 81 | // end... 82 | self.endLine = function(){ 83 | ctx.strokeStyle = self.color; 84 | if(self.pen) ctx.stroke(); 85 | ctx.closePath(); 86 | }; 87 | // ...and new 88 | self.startLine = function(){ 89 | ctx.lineWidth = 5; 90 | ctx.beginPath(); 91 | ctx.moveTo(self.x, self.y); 92 | }; 93 | self.drawTurtle = function(){ 94 | ctx.save(); 95 | ctx.translate(self.x, self.y); 96 | ctx.rotate(self.angle+Math.TAU/4); 97 | // shadow 98 | ctx.fillStyle = "rgba(0,0,0,0.1)"; 99 | ctx.beginPath(); 100 | ctx.arc(0, 0, 16, 0, Math.TAU); 101 | ctx.fill(); 102 | // body 103 | ctx.fillStyle = self.color; 104 | ctx.beginPath(); 105 | ctx.arc(0, 0, 12, 0, Math.TAU); 106 | if(self.pen){ 107 | ctx.fill(); 108 | }else{ 109 | ctx.fillStyle = "#fff"; 110 | ctx.fill(); 111 | ctx.lineWidth = 2; 112 | ctx.stroke(); 113 | } 114 | // eyes 115 | var eyeX = 5.5; 116 | var eyeY = -4; 117 | ctx.fillStyle = "#fff"; 118 | ctx.beginPath(); ctx.arc(-eyeX, eyeY, 4, 0, Math.TAU); ctx.fill(); 119 | ctx.beginPath(); ctx.arc(eyeX, eyeY, 4, 0, Math.TAU); ctx.fill(); 120 | ctx.fillStyle = "#000"; 121 | ctx.beginPath(); ctx.arc(-eyeX, eyeY, 2, 0, Math.TAU); ctx.fill(); 122 | ctx.beginPath(); ctx.arc(eyeX, eyeY, 2, 0, Math.TAU); ctx.fill(); 123 | ctx.restore(); 124 | }; 125 | self.draw = function(){ 126 | self.endLine(); 127 | self.drawTurtle(); 128 | }; 129 | 130 | //////////////////////// 131 | // Set Frame! & Drag! // 132 | //////////////////////// 133 | 134 | if(!config.doNotDrag){ 135 | 136 | self.frameX = 0; 137 | self.frameY = 0; 138 | self.setFrame = function(frameX, frameY){ 139 | self.frameX = frameX; 140 | self.frameY = frameY; 141 | }; 142 | self.ondrag = function(){}; // to implement 143 | 144 | // DRAG IT, BABY 145 | self.canvas.className = "cursor-grab"; 146 | var isDragging = false; 147 | var startDragX, startFrameX, 148 | startDragY, startFrameY; 149 | var _onmousedown = function(event){ 150 | isDragging = true; 151 | startDragX = event.clientX; 152 | startFrameX = self.frameX; 153 | startDragY = event.clientY; 154 | startFrameY = self.frameY; 155 | self.canvas.className = "cursor-grabbing"; 156 | }; 157 | var _onmousemove = function(event){ 158 | if(isDragging){ 159 | var dx = event.clientX - startDragX; 160 | var dy = event.clientY - startDragY; 161 | self.frameX = startFrameX + dx; 162 | self.frameY = startFrameY + dy; 163 | _ondrag(); 164 | } 165 | }; 166 | var _onmouseup = function(){ 167 | isDragging = false; 168 | self.canvas.className = "cursor-grab"; 169 | }; 170 | 171 | // MOUSE EVENTS 172 | self.canvas.addEventListener("mousedown", _onmousedown); 173 | window.addEventListener("mousemove", _onmousemove); 174 | window.addEventListener("mouseup", _onmouseup); 175 | 176 | // On DRAG! 177 | self.setFrame(data.frameX, data.frameY); 178 | var _ondrag = function(){ 179 | data.frameX = self.frameX; 180 | data.frameY = self.frameY; 181 | self.ondrag(); 182 | }; 183 | _ondrag(); 184 | 185 | }else{ 186 | self.frameX = data.frameX; 187 | self.frameY = data.frameY; 188 | } 189 | 190 | /////////////////////// 191 | // Label the turtle! // 192 | /////////////////////// 193 | 194 | self.label = function(label){ 195 | ctx.save(); 196 | ctx.translate(self.x, self.y); 197 | ctx.font = "14px sans-serif"; 198 | ctx.textAlign = "center"; 199 | ctx.fillStyle = "#444"; 200 | var lines = label.split('\n'); 201 | for(var i=0; i 2 | 3 | 4 | 5 | 6 | The Joy of Turtle 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 57 | 58 | 59 |
60 |
61 |
62 |
63 |
64 | 102 |
103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /demo/turtle/thumbs/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/thumbs/blank.png -------------------------------------------------------------------------------- /demo/turtle/thumbs/flower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/thumbs/flower.png -------------------------------------------------------------------------------- /demo/turtle/thumbs/spiral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/thumbs/spiral.png -------------------------------------------------------------------------------- /demo/turtle/thumbs/spiral2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/thumbs/spiral2.png -------------------------------------------------------------------------------- /demo/turtle/thumbs/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/demo/turtle/thumbs/star.png -------------------------------------------------------------------------------- /dist/joy.css: -------------------------------------------------------------------------------- 1 | /* 2 | More prefixing to avoid NAME COLLISIONS 3 | */ 4 | 5 | .joy-master, .joy-actions, .joy-button, .joy-scrubber, .joy-modal-chooser{ 6 | -webkit-user-select: none; 7 | -moz-user-select: none; 8 | -ms-user-select: none; 9 | user-select: none; 10 | cursor:default; 11 | } 12 | 13 | .joy-master{ 14 | display: block; 15 | margin: 1.5em; 16 | } 17 | 18 | /***************/ 19 | /* ACTIONS *****/ 20 | /***************/ 21 | 22 | .joy-actions{ 23 | margin-top: 0.5em; 24 | margin-bottom: 0.5em; 25 | position: relative; 26 | } 27 | 28 | .joy-actions #joy-list{} 29 | 30 | /* Entry */ 31 | .joy-actions #joy-list > div{ 32 | 33 | overflow: hidden; 34 | 35 | /* Thank you https://css-tricks.com/using-flexbox/ */ 36 | display: -webkit-box; 37 | display: -moz-box; 38 | display: -ms-flexbox; 39 | display: -webkit-flex; 40 | display: flex; 41 | 42 | } 43 | .joy-actions #joy-list > div #joy-bullet-container{ 44 | /*float: left;*/ 45 | -webkit-box-flex: 1; 46 | -moz-box-flex: 1; 47 | width: 1.5em; 48 | -webkit-flex: 1; 49 | -ms-flex: 1; 50 | flex: 1; 51 | text-align: left; 52 | } 53 | .joy-actions #joy-list > div #joy-widget{ 54 | /*float: right;*/ 55 | width: calc(100% - 2em); 56 | margin-bottom: 0.3em; 57 | } 58 | 59 | /***************/ 60 | /* SAVE ********/ 61 | /***************/ 62 | 63 | .joy-save{ 64 | position: relative; 65 | } 66 | .joy-save input{ 67 | display: block; 68 | width: calc(100% - 80px); 69 | position: absolute; 70 | top: 0; 71 | right: 0; 72 | } 73 | .joy-save #joy-save-info{ 74 | position: absolute; 75 | bottom: 0px; 76 | left: 81px; 77 | font-size: 12px; 78 | line-height: 1em; 79 | } 80 | 81 | /***************/ 82 | /* BUTTON ******/ 83 | /***************/ 84 | 85 | .joy-button{ 86 | 87 | display: inline-block; 88 | 89 | line-height: 1.5em; 90 | padding: 0 0.3em; 91 | 92 | border-radius: 5px; 93 | border: 2px solid #ccc; 94 | 95 | cursor: pointer; 96 | 97 | } 98 | 99 | .joy-button.joy-bullet{ 100 | 101 | border-radius: 1000px; /* infinite roundness */ 102 | width: 1.5em; 103 | height: 1.5em; 104 | padding: 0; 105 | text-align: center; 106 | 107 | background: none; 108 | border: 1px solid #bebebe; 109 | color: #b7b7b7; 110 | } 111 | .joy-button.joy-bullet:hover{ 112 | background: #fff; 113 | color: #333; 114 | } 115 | 116 | .joy-button.joy-color{ 117 | border-radius: 1000px; /* infinite roundness */ 118 | width: 1.5em; 119 | height: 1.5em; 120 | padding: 0; 121 | border-color: rgba(0,0,0,0.1); 122 | } 123 | 124 | .joy-button.joy-more{ 125 | border: none; 126 | width: 10px; 127 | height: 1em; 128 | padding: 0; 129 | position: relative; 130 | top: 0.1em; 131 | } 132 | /* from: https://css-tricks.com/three-line-menu-navicon/ */ 133 | .joy-button.joy-more:before{ 134 | content: ""; 135 | position: absolute; 136 | right: 3px; 137 | top: 0.24em; 138 | width: 4px; 139 | height: 4px; 140 | background: #bebebe; 141 | border-radius: 4px; 142 | box-shadow: 0 6px 0 0 #bebebe, 0 12px 0 0 #bebebe; 143 | } 144 | .joy-button.joy-math{ 145 | border: none; 146 | line-height: 1em; 147 | padding: 0; 148 | margin: 0 0.1em; 149 | border-radius: 1000px; /* infinite roundness */ 150 | width: 1em; 151 | text-align: center; 152 | } 153 | .joy-button.joy-math:hover{ 154 | background: rgba(0,0,0,0.1); 155 | } 156 | 157 | /***************/ 158 | /* TEXTBOX *****/ 159 | /***************/ 160 | 161 | .joy-textbox{ 162 | font-size: 0.6em; 163 | border-radius: 5px; 164 | border: 1px solid rgba(0,0,0,0.2); 165 | width: 100%; 166 | } 167 | .joy-textbox.box{ 168 | font-family: inherit; 169 | padding: 0.3em 0.4em; 170 | display: block; 171 | background: #333; 172 | color: #fff; 173 | font-size: inherit; 174 | font-size: 0.85em; 175 | } 176 | textarea.joy-textbox{ 177 | resize: none; 178 | } 179 | 180 | /***************/ 181 | /* SCRUBBER ****/ 182 | /***************/ 183 | 184 | .joy-number > span{ 185 | /* prevent number & chooser separating on newline */ 186 | display: inline-block; 187 | } 188 | 189 | .joy-scrubber{ 190 | position: relative; 191 | display: inline; 192 | cursor: col-resize; 193 | min-width: 0.8em; 194 | text-align: center; 195 | 196 | padding-bottom: 0px; 197 | border-bottom: 2px solid #bbb; 198 | } 199 | /* 200 | .joy-scrubber:after{ 201 | content: ''; 202 | display: block; 203 | border-bottom: #aaa 4px dotted; 204 | width: 100%; 205 | position: relative; 206 | top:-0.3em; 207 | }*/ 208 | .joy-scrubber:before{ 209 | content: '↔'; 210 | opacity:0; 211 | position: absolute; 212 | font-size: 0.6em; 213 | color: inherit; 214 | width: 90%; 215 | height: 0px; 216 | text-align: center; 217 | top: -1.5em; 218 | /*top: -1em;*/ 219 | } 220 | .joy-scrubber:hover:before{ 221 | opacity:1; 222 | } 223 | 224 | /***************/ 225 | /* STRING *****/ 226 | /***************/ 227 | 228 | .joy-string{ 229 | position: relative; 230 | display: inline; 231 | padding-bottom: 0px; 232 | border-bottom: 2px solid #bbb; 233 | cursor: text; 234 | } 235 | .joy-string:focus{ 236 | outline: none; 237 | } 238 | 239 | 240 | /*****************/ 241 | /* CHOOSER MODAL */ 242 | /*****************/ 243 | 244 | #joy-modal{ 245 | display: none; 246 | position: fixed; 247 | top:0; left:0; 248 | z-index: 99999; /* the most elegant css */ 249 | width: 100%; 250 | height: 100%; 251 | } 252 | 253 | #joy-modal #joy-bg{ 254 | position: absolute; 255 | width: 100%; 256 | height: 100%; 257 | } 258 | 259 | #joy-modal #joy-box{ 260 | 261 | position: absolute; 262 | 263 | font-size: 0.69em; 264 | line-height: 1.3em; 265 | color: #000; 266 | 267 | padding: 0.2em 0; 268 | border-radius: 0.5em; 269 | 270 | min-width: 50px; 271 | max-width: 400px; 272 | 273 | } 274 | 275 | /* CHOOSER */ 276 | 277 | /* list of categories */ 278 | .joy-modal-chooser > div{ 279 | overflow: hidden; 280 | } 281 | /* category */ 282 | .joy-modal-chooser > div > div{ 283 | overflow: hidden; 284 | margin: 0.2em 0; 285 | } 286 | .joy-modal-chooser > div > div:nth-last-child(n+2){ 287 | border-bottom: 1px solid #ccc; 288 | padding-bottom: 0.4em; 289 | margin-bottom: 0.4em; 290 | } 291 | /* category entry */ 292 | .joy-modal-chooser > div > div > div{ 293 | display: block; 294 | cursor: pointer; 295 | padding: 0 0.65em; 296 | } 297 | .joy-modal-chooser > div > div > div:hover{ 298 | background: #e6e6e6; 299 | } 300 | .joy-modal-chooser > div > div.single-column > div{ 301 | display: block; 302 | padding: 0 0.5em; 303 | } 304 | 305 | /* COLOR */ 306 | 307 | .joy-modal-color{ 308 | /*margin: 5px;*/ 309 | position: relative; 310 | } 311 | .joy-modal-color > canvas{ 312 | position: absolute; 313 | } 314 | 315 | /* Sweet arrow boxes, thx to http://www.cssarrowplease.com/ */ 316 | 317 | .arrow_box{ 318 | position: relative; 319 | background: #ffffff; 320 | border: 2px solid #ccc; 321 | } 322 | .arrow_box:after, .arrow_box:before { 323 | 324 | 325 | border: solid transparent; 326 | content: " "; 327 | height: 0; 328 | width: 0; 329 | position: absolute; 330 | pointer-events: none; 331 | } 332 | .arrow_box:after { 333 | border-color: rgba(255, 255, 255, 0); 334 | border-width: 14px; 335 | 336 | } 337 | .arrow_box:before { 338 | border-color: rgba(221, 221, 221, 0); 339 | border-width: 17px; 340 | } 341 | 342 | /* Below */ 343 | .arrow_box[position=below]:after, .arrow_box[position=below]:before { 344 | bottom: 100%; 345 | left: 50%; 346 | } 347 | .arrow_box[position=below]:after { 348 | border-bottom-color: #ffffff; 349 | margin-left: -14px; 350 | } 351 | .arrow_box[position=below]:before { 352 | border-bottom-color: #ccc; 353 | margin-left: -17px; 354 | } 355 | 356 | /* Left */ 357 | .arrow_box[position=left]:after, .arrow_box[position=left]:before { 358 | left: 100%; 359 | top: 50%; 360 | } 361 | .arrow_box[position=left]:after { 362 | border-left-color: #ffffff; 363 | margin-top: -14px; 364 | } 365 | .arrow_box[position=left]:before { 366 | border-left-color: #ccc; 367 | margin-top: -17px; 368 | } 369 | -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/favicon.png -------------------------------------------------------------------------------- /frontpage/demo_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/demo_music.png -------------------------------------------------------------------------------- /frontpage/demo_nonlinear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/demo_nonlinear.png -------------------------------------------------------------------------------- /frontpage/demo_turtle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/demo_turtle.png -------------------------------------------------------------------------------- /frontpage/frontpage.css: -------------------------------------------------------------------------------- 1 | html{ 2 | width: 100%; 3 | height: 100%; 4 | } 5 | body{ 6 | margin: 0; 7 | font-size: 22px; 8 | font-weight: 100; 9 | line-height: 1.7em; 10 | font-family: Helvetica, Arial, sans-serif; 11 | letter-spacing: 1px; 12 | text-align: justify; 13 | } 14 | 15 | .cool_background{ 16 | color: #111; 17 | background-image: -webkit-linear-gradient( hsl(200, 41%, 61%), hsl(322, 20%, 71%) ); 18 | background-image: -moz-linear-gradient( hsl(200, 41%, 61%), hsl(322, 20%, 71%) ); 19 | background-image: -o-linear-gradient( hsl(200, 41%, 61%), hsl(322, 20%, 71%) ); 20 | background-image: linear-gradient( hsl(200, 41%, 61%), hsl(322, 20%, 71%) ); 21 | } 22 | .dark_background{ 23 | background: hsl(200, 15%, 12%); 24 | color: #eee; 25 | } 26 | a{ 27 | color: hsl(322, 84%, 70%); 28 | } 29 | a:hover{ 30 | color: hsl(322, 84%, 80%); 31 | } 32 | 33 | #splash{ 34 | width: 100%; 35 | height: 540px; 36 | position: relative; 37 | overflow: hidden; 38 | } 39 | #splash_container{ 40 | position: relative; 41 | width: 960px; 42 | height: 500px; 43 | margin: 0 auto; 44 | } 45 | #splash_image{ 46 | position: absolute; 47 | background: url(splash.png); 48 | width: 960px; 49 | height: 550px; 50 | background-size: 100% auto; 51 | } 52 | #splash_video{ 53 | width: 480px; 54 | height: 240px; 55 | background: #fff; 56 | position: absolute; 57 | top: 220px; 58 | left: 154px; 59 | } 60 | #splash_arrow{ 61 | width: 100%; 62 | height: 40px; 63 | overflow: hidden; 64 | position: relative; 65 | } 66 | #splash_arrow div{ 67 | position: absolute; 68 | } 69 | #splash_arrow div:nth-child(1), #splash_arrow div:nth-child(4){ 70 | width: 50%; 71 | height: 40px; 72 | background: hsl(200, 15%, 12%); 73 | } 74 | #splash_arrow div:nth-child(1){ 75 | left:-40px; 76 | } 77 | #splash_arrow div:nth-child(4){ 78 | right:-40px; 79 | } 80 | #splash_arrow div:nth-child(2){ 81 | left: calc(50% - 40px); 82 | width: 0; 83 | height: 0; 84 | border-style: solid; 85 | border-width: 40px 0 0 40px; 86 | border-color: transparent transparent transparent hsl(200, 15%, 12%); 87 | } 88 | #splash_arrow div:nth-child(3){ 89 | right: calc(50% - 40px); 90 | width: 0; 91 | height: 0; 92 | border-style: solid; 93 | border-width: 0 0 40px 40px; 94 | border-color: transparent transparent hsl(200, 15%, 12%) transparent; 95 | } 96 | /* 97 | #splash_arrow div{ 98 | margin: 0 auto; 99 | width: 0; 100 | height: 0; 101 | border-left: 40px solid transparent; 102 | border-right: 40px solid transparent; 103 | border-top: 40px solid hsl(322, 20%, 71%); 104 | } 105 | */ 106 | 107 | #description{ 108 | width: 100%; 109 | overflow: hidden; 110 | } 111 | #description_prologue{ 112 | width: 720px; 113 | margin: 20px auto 50px auto; 114 | overflow: hidden; 115 | } 116 | #description_content{ 117 | width: 960px; 118 | margin: 30px auto 20px auto; 119 | overflow: hidden; 120 | } 121 | #description_content > div{ 122 | float: left; 123 | width: 460px; 124 | height: 260px; 125 | margin-bottom: 20px; 126 | } 127 | #description_content > div:nth-child(2n){ 128 | margin-left: 40px; 129 | } 130 | .desc_mov{ 131 | /*background: rgba(255,255,255,0.2);*/ 132 | } 133 | .desc_info { 134 | font-size: 0.85em; 135 | line-height: 1.7em; 136 | } 137 | .desc_info b{ 138 | display: block; 139 | font-size: 2em; 140 | line-height: 1em; 141 | margin-bottom: 0.4em; 142 | } 143 | 144 | #examples{ 145 | overflow: hidden; 146 | } 147 | #examples_title{ 148 | font-size: 1.08em; 149 | width: 800px; 150 | margin: 50px auto 30px auto; 151 | } 152 | #examples_blocks{ 153 | width: 800px; 154 | height: 250px; 155 | margin: 0 auto; 156 | } 157 | #examples_blocks div{ 158 | width: 250px; 159 | height: 245px; 160 | float: left; 161 | } 162 | .example_button{ 163 | 164 | border-radius: 25px; 165 | border-bottom: 5px solid rgba(0,0,0,0.2); 166 | position: relative; 167 | top:0; 168 | transition: top 0.2s ease-in-out, box-shadow 0.2s ease-in-out; 169 | 170 | box-shadow: 0px 10px 20px 0px rgba(0,0,0,0.5); 171 | 172 | -webkit-user-select: none; 173 | -moz-user-select: none; 174 | -ms-user-select: none; 175 | user-select: none; 176 | 177 | } 178 | .example_button:hover{ 179 | top:-10px; 180 | box-shadow: 0px 20px 30px 0px rgba(0,0,0,0.25); 181 | } 182 | #examples_blocks div#demo_turtle_thumb{ 183 | background: url(demo_turtle.png); 184 | } 185 | #examples_blocks div#demo_music_thumb{ 186 | background: url(demo_music.png); 187 | } 188 | #examples_blocks div#demo_nonlinear_thumb{ 189 | background: url(demo_nonlinear.png); 190 | } 191 | #examples_blocks div span{ 192 | display: block; 193 | text-align: center; 194 | font-weight: bold; 195 | color: #000; 196 | font-size: 30px; 197 | line-height: 1em; 198 | width: 250px; 199 | left: 0; 200 | top: 97px; 201 | position: relative; 202 | } 203 | #examples_blocks a:nth-child(n+2) > div{ 204 | margin-left: 25px; 205 | } 206 | #examples_getting_started{ 207 | width: 640px; 208 | margin: 30px auto 50px auto; 209 | font-size: 1em; 210 | } 211 | #examples_getting_started div{ 212 | width: 500px; 213 | height: 60px; 214 | background: hsl(322, 84%, 70%); 215 | color: #fff; 216 | font-weight: bolder; 217 | border-radius: 10px; 218 | margin: 0.5em auto 0 auto; 219 | text-align: center; 220 | font-size: 30px; 221 | line-height: 60px; 222 | } 223 | 224 | #credits{ 225 | overflow: hidden; 226 | } 227 | #credits_content{ 228 | width: 640px; 229 | margin: 50px auto; 230 | } 231 | 232 | #social{ 233 | background:#111; 234 | padding: 30px 0; 235 | color: #888; 236 | text-align: center; 237 | } 238 | 239 | ul.share-buttons{ 240 | list-style: none; 241 | padding: 0; 242 | display: inline-block; 243 | position: relative; 244 | top: 4px; 245 | } 246 | ul.share-buttons li{ 247 | display: inline; 248 | transition: opacity 0.2s ease-in-out; 249 | opacity: 0.7; 250 | } 251 | ul.share-buttons li:hover{ 252 | opacity: 1.0; 253 | } 254 | ul.share-buttons li img{ 255 | width: 20px; 256 | } -------------------------------------------------------------------------------- /frontpage/frontpage.js: -------------------------------------------------------------------------------- 1 | window.onload = function(){ 2 | 3 | // SCROLL 4 | var splash_container = document.getElementById("splash_container"); 5 | window.onscroll = function(){ 6 | requestAnimationFrame(function(){ 7 | var scrollY = window.pageYOffset; 8 | splash_container.style.top = scrollY*0.5; 9 | }); 10 | }; 11 | window.onscroll(); 12 | 13 | // ANIMATED DEMO THUMBNAILS 14 | var _MakeAnimatedThumb = function(config){ 15 | 16 | var thumb = document.querySelector(config.dom); 17 | 18 | var pxWidth = config.pxWidth; 19 | var pxHeight = config.pxHeight; 20 | var width = config.width; 21 | var height = config.height; 22 | thumb.style.backgroundSize = pxWidth+"px"; 23 | 24 | var isAnimating = false; 25 | var frame = 0; 26 | var totalFrames = config.totalFrames; 27 | var reverse = false; 28 | 29 | thumb.addEventListener("mouseover", function(){ 30 | isAnimating = true; 31 | }); 32 | thumb.addEventListener("mouseout", function(){ 33 | isAnimating = false; 34 | }); 35 | 36 | setInterval(function(){ 37 | if(isAnimating){ 38 | 39 | var x = frame%width; 40 | var y = Math.floor(frame/width); 41 | var squareSize = pxWidth/width; 42 | x = (-x*squareSize)+"px"; 43 | y = (-y*squareSize)+"px"; 44 | thumb.style.backgroundPosition = x+" "+y; 45 | 46 | if(reverse){ 47 | frame--; 48 | if(frame==0){ 49 | reverse = false; 50 | } 51 | }else{ 52 | frame++; 53 | if(config.loop){ 54 | if(frame==totalFrames){ 55 | frame=0; 56 | } 57 | }else{ 58 | if(frame==totalFrames-1){ 59 | reverse = true; 60 | } 61 | } 62 | } 63 | 64 | } 65 | },1000/12); 66 | 67 | }; 68 | 69 | _MakeAnimatedThumb({ 70 | dom: "#demo_turtle_thumb", 71 | pxWidth: 1000, 72 | pxHeight: 750, 73 | width: 4, 74 | height: 3, 75 | totalFrames: 12 76 | }); 77 | 78 | _MakeAnimatedThumb({ 79 | dom: "#demo_music_thumb", 80 | pxWidth: 1750, 81 | pxHeight: 1250, 82 | width: 7, 83 | height: 5, 84 | totalFrames: 32, 85 | loop: true 86 | }); 87 | 88 | _MakeAnimatedThumb({ 89 | dom: "#demo_nonlinear_thumb", 90 | pxWidth: 1500, 91 | pxHeight: 1000, 92 | width: 6, 93 | height: 4, 94 | totalFrames: 23 95 | }); 96 | 97 | }; -------------------------------------------------------------------------------- /frontpage/joy.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/joy.mp4 -------------------------------------------------------------------------------- /frontpage/music.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/music.mp4 -------------------------------------------------------------------------------- /frontpage/nonlinear.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/nonlinear.mp4 -------------------------------------------------------------------------------- /frontpage/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/splash.png -------------------------------------------------------------------------------- /frontpage/turtle.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/frontpage/turtle.mp4 -------------------------------------------------------------------------------- /getting-started/AHHH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/getting-started/AHHH.png -------------------------------------------------------------------------------- /getting-started/examples/FuturaHandwritten.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/getting-started/examples/FuturaHandwritten.ttf -------------------------------------------------------------------------------- /getting-started/examples/Turtle.js: -------------------------------------------------------------------------------- 1 | Math.TAU = Math.PI*2; 2 | 3 | function Turtle(config){ 4 | 5 | var self = this; 6 | 7 | // Config 8 | var data = config.data || {}; 9 | if(data.frameX===undefined) data.frameX=config.width/2; 10 | if(data.frameY===undefined) data.frameY=config.height/2; 11 | 12 | // Canvas & Context (Retina!) 13 | self.width = config.width; 14 | self.height = config.height; 15 | var canvas = document.createElement("canvas"); 16 | self.canvas = canvas; 17 | canvas.width = self.width*2; 18 | canvas.height = self.height*2; 19 | canvas.style.width = self.width+"px"; 20 | canvas.style.height = self.height+"px"; 21 | var ctx = canvas.getContext("2d"); 22 | self.context = ctx; 23 | 24 | // Start off like this... 25 | self.reset = function(){ 26 | ctx.setTransform(2, 0, 0, 2, 0, 0); // retina 27 | ctx.clearRect(0, 0, canvas.width, canvas.height); 28 | ctx.translate(self.frameX, self.frameY); 29 | self.color = "#ff4040"; 30 | self.x = self.width/2; 31 | self.y = self.height/2; 32 | self.angle = -Math.TAU/4; // facing up 33 | self.pen = true; // brush is active! 34 | }; 35 | self.reset(); 36 | 37 | // Turtle methods! 38 | self.forward = function(steps){ 39 | 40 | // Move 41 | self.x += Math.cos(self.angle)*steps; 42 | self.y += Math.sin(self.angle)*steps; 43 | 44 | // Draw 45 | if(self.pen){ 46 | ctx.lineTo(self.x, self.y); 47 | } 48 | 49 | }; 50 | self.turn = function(angle){ 51 | self.angle += angle*(Math.TAU/360); 52 | }; 53 | 54 | // Turtle switch color... 55 | self.setColor = function(newColor){ 56 | self.endLine(); 57 | self.color = newColor; 58 | self.startLine(); 59 | }; 60 | 61 | // Pen up (off) or down (up)... 62 | self.setPen = function(pen){ 63 | if(self.pen && !pen) self.endLine(); // Turning OFF pen? End that last line! 64 | if(!self.pen && pen) self.startLine(); // Turning ON a pen? Start a new line! 65 | self.pen = pen; 66 | }; 67 | 68 | // Start & end drawing... 69 | ctx.lineCap = "round"; 70 | ctx.lineJoin = "round"; 71 | self.start = function(x,y){ 72 | 73 | // reset & position 74 | self.reset(); 75 | self.x = 0; 76 | self.y = 0; 77 | 78 | // draw 79 | self.startLine(); 80 | }; 81 | // end... 82 | self.endLine = function(){ 83 | ctx.strokeStyle = self.color; 84 | if(self.pen) ctx.stroke(); 85 | ctx.closePath(); 86 | }; 87 | // ...and new 88 | self.startLine = function(){ 89 | ctx.lineWidth = 5; 90 | ctx.beginPath(); 91 | ctx.moveTo(self.x, self.y); 92 | }; 93 | self.drawTurtle = function(){ 94 | ctx.save(); 95 | ctx.translate(self.x, self.y); 96 | ctx.rotate(self.angle+Math.TAU/4); 97 | // shadow 98 | ctx.fillStyle = "rgba(0,0,0,0.1)"; 99 | ctx.beginPath(); 100 | ctx.arc(0, 0, 16, 0, Math.TAU); 101 | ctx.fill(); 102 | // body 103 | ctx.fillStyle = self.color; 104 | ctx.beginPath(); 105 | ctx.arc(0, 0, 12, 0, Math.TAU); 106 | if(self.pen){ 107 | ctx.fill(); 108 | }else{ 109 | ctx.fillStyle = "#fff"; 110 | ctx.fill(); 111 | ctx.lineWidth = 2; 112 | ctx.stroke(); 113 | } 114 | // eyes 115 | var eyeX = 5.5; 116 | var eyeY = -4; 117 | ctx.fillStyle = "#fff"; 118 | ctx.beginPath(); ctx.arc(-eyeX, eyeY, 4, 0, Math.TAU); ctx.fill(); 119 | ctx.beginPath(); ctx.arc(eyeX, eyeY, 4, 0, Math.TAU); ctx.fill(); 120 | ctx.fillStyle = "#000"; 121 | ctx.beginPath(); ctx.arc(-eyeX, eyeY, 2, 0, Math.TAU); ctx.fill(); 122 | ctx.beginPath(); ctx.arc(eyeX, eyeY, 2, 0, Math.TAU); ctx.fill(); 123 | ctx.restore(); 124 | }; 125 | self.draw = function(){ 126 | self.endLine(); 127 | self.drawTurtle(); 128 | }; 129 | 130 | //////////////////////// 131 | // Set Frame! & Drag! // 132 | //////////////////////// 133 | 134 | if(!config.doNotDrag){ 135 | 136 | self.frameX = 0; 137 | self.frameY = 0; 138 | self.setFrame = function(frameX, frameY){ 139 | self.frameX = frameX; 140 | self.frameY = frameY; 141 | }; 142 | self.ondrag = function(){}; // to implement 143 | 144 | // DRAG IT, BABY 145 | self.canvas.className = "cursor-grab"; 146 | var isDragging = false; 147 | var startDragX, startFrameX, 148 | startDragY, startFrameY; 149 | var _onmousedown = function(event){ 150 | isDragging = true; 151 | startDragX = event.clientX; 152 | startFrameX = self.frameX; 153 | startDragY = event.clientY; 154 | startFrameY = self.frameY; 155 | self.canvas.className = "cursor-grabbing"; 156 | }; 157 | var _onmousemove = function(event){ 158 | if(isDragging){ 159 | var dx = event.clientX - startDragX; 160 | var dy = event.clientY - startDragY; 161 | self.frameX = startFrameX + dx; 162 | self.frameY = startFrameY + dy; 163 | _ondrag(); 164 | } 165 | }; 166 | var _onmouseup = function(){ 167 | isDragging = false; 168 | self.canvas.className = "cursor-grab"; 169 | }; 170 | 171 | // MOUSE EVENTS 172 | self.canvas.addEventListener("mousedown", _onmousedown); 173 | window.addEventListener("mousemove", _onmousemove); 174 | window.addEventListener("mouseup", _onmouseup); 175 | 176 | // On DRAG! 177 | self.setFrame(data.frameX, data.frameY); 178 | var _ondrag = function(){ 179 | data.frameX = self.frameX; 180 | data.frameY = self.frameY; 181 | self.ondrag(); 182 | }; 183 | _ondrag(); 184 | 185 | }else{ 186 | self.frameX = data.frameX; 187 | self.frameY = data.frameY; 188 | } 189 | 190 | /////////////////////// 191 | // Label the turtle! // 192 | /////////////////////// 193 | 194 | self.label = function(label){ 195 | ctx.save(); 196 | ctx.translate(self.x, self.y); 197 | ctx.font = "14px sans-serif"; 198 | ctx.textAlign = "center"; 199 | ctx.fillStyle = "#444"; 200 | var lines = label.split('\n'); 201 | for(var i=0; i 2 | 3 | 4 | 5 | 22 | 23 | 24 |
25 |
26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /getting-started/examples/turtle.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 44 | 45 | 46 |
47 |
48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /getting-started/getting-started.css: -------------------------------------------------------------------------------- 1 | body{ 2 | margin:0; 3 | font-size: 22px; 4 | font-weight: 100; 5 | font-family: "Helvetica", "Arial", sans-serif; 6 | line-height: 1.5em; 7 | } 8 | #content{ 9 | width:800px; 10 | margin:80px auto; 11 | position: relative; 12 | } 13 | iframe{ 14 | border: 2px solid #ddd; 15 | } 16 | pre{ 17 | font-size: 16px; 18 | line-height: 1.5em; 19 | } 20 | hr{ 21 | border:none; 22 | border-bottom: 2px solid #ccc; 23 | } 24 | 25 | a{ 26 | color: hsl(322, 84%, 70%); 27 | } 28 | a:hover{ 29 | color: hsl(322, 84%, 80%); 30 | } 31 | .code_for_example{ 32 | font-size: 0.8em; 33 | text-align: right; 34 | } -------------------------------------------------------------------------------- /getting-started/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JOY.JS - make happy little programs 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 |
37 |
38 | 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | 52 | 53 |
54 |
55 | Consider the paintbrush: 56 | simple enough for a child, complex enough for an Old Master. 57 | That's what any artistic tool should strive for, 58 | and the art of programming deserves a tool that's more creative, more alive. 59 | Joy.js is a tool for making tools like that. 60 |
61 |
62 | 63 |
64 | 67 |
68 |
69 | EASY & EXPRESSIVE 70 | With regular coding: tweak a number, compile, see the result seconds later, tweak again, repeat 'til bored. 71 | With Joy.js: change the code by clicking / dragging / hovering, and see the result immediately. 72 | This lets you improvize, and discover "happy little accidents"! 73 |
74 | 75 |
76 | SEE WHOLE SYSTEMS 77 | No need to second-guess the program, to "play computer" in your head. 78 | If you want to understand what a system does, 79 | you can simply hover over the step numbers, 80 | and see the system build itself step by step. 81 |
82 |
83 | 86 |
87 | 88 |
89 | 92 |
93 |
94 | SAVE & SHARE 95 | And finally, when you make a tool with Joy.js, your users 96 | will be able to save and share their work, and remix each others' creations! 97 | (Note for developers: Joy.js "saves data" in the URL itself... meaning, no need to set up a server or database!) 98 |
99 | 100 |
101 |
102 | 103 | 104 | 105 |
106 |
107 | Here's some demos you can play with & "program"! (click to open ↓) 108 |
109 | 126 |
127 | Are you a developer, and want to use Joy.js to make a playful, "programmable" tool? 128 | Check out this how-to guide: 129 | 130 |
GETTING STARTED with JOY.JS
131 |
132 |
133 |
134 | 135 | 136 |
137 |
138 |

139 | JOY.js is open source / public domain. 140 | (get source) 141 |

142 |

143 | It was made by 144 | Nicky Case, 145 | with the generous feedback and support of my fans on Patreon! 146 | (see full credits) 147 |

148 |

149 | If you like the interactive stuff I make, feel free to 150 | throw monetary values at me on Patreon? 151 | <3 152 |

153 |
154 |
155 | 156 | 157 |
158 | share: 159 | 160 | 165 |
166 | 167 | 168 | -------------------------------------------------------------------------------- /node_modules/.bin/uglifyjs: -------------------------------------------------------------------------------- 1 | ../uglify-js/bin/uglifyjs -------------------------------------------------------------------------------- /node_modules/uglify-js/LICENSE: -------------------------------------------------------------------------------- 1 | UglifyJS is released under the BSD license: 2 | 3 | Copyright 2012-2013 (c) Mihai Bazon 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions 7 | are met: 8 | 9 | * Redistributions of source code must retain the above 10 | copyright notice, this list of conditions and the following 11 | disclaimer. 12 | 13 | * Redistributions in binary form must reproduce the above 14 | copyright notice, this list of conditions and the following 15 | disclaimer in the documentation and/or other materials 16 | provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY 19 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE 22 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 23 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 27 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 28 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 | SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /node_modules/uglify-js/lib/sourcemap.js: -------------------------------------------------------------------------------- 1 | /*********************************************************************** 2 | 3 | A JavaScript tokenizer / parser / beautifier / compressor. 4 | https://github.com/mishoo/UglifyJS2 5 | 6 | -------------------------------- (C) --------------------------------- 7 | 8 | Author: Mihai Bazon 9 | 10 | http://mihai.bazon.net/blog 11 | 12 | Distributed under the BSD license: 13 | 14 | Copyright 2012 (c) Mihai Bazon 15 | 16 | Redistribution and use in source and binary forms, with or without 17 | modification, are permitted provided that the following conditions 18 | are met: 19 | 20 | * Redistributions of source code must retain the above 21 | copyright notice, this list of conditions and the following 22 | disclaimer. 23 | 24 | * Redistributions in binary form must reproduce the above 25 | copyright notice, this list of conditions and the following 26 | disclaimer in the documentation and/or other materials 27 | provided with the distribution. 28 | 29 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY 30 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 32 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE 33 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 34 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 35 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 36 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 38 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 39 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 | SUCH DAMAGE. 41 | 42 | ***********************************************************************/ 43 | 44 | "use strict"; 45 | 46 | // a small wrapper around fitzgen's source-map library 47 | function SourceMap(options) { 48 | options = defaults(options, { 49 | file : null, 50 | root : null, 51 | orig : null, 52 | 53 | orig_line_diff : 0, 54 | dest_line_diff : 0, 55 | }); 56 | var generator = new MOZ_SourceMap.SourceMapGenerator({ 57 | file : options.file, 58 | sourceRoot : options.root 59 | }); 60 | var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig); 61 | 62 | if (orig_map && Array.isArray(options.orig.sources)) { 63 | orig_map._sources.toArray().forEach(function(source) { 64 | var sourceContent = orig_map.sourceContentFor(source, true); 65 | if (sourceContent) { 66 | generator.setSourceContent(source, sourceContent); 67 | } 68 | }); 69 | } 70 | 71 | function add(source, gen_line, gen_col, orig_line, orig_col, name) { 72 | if (orig_map) { 73 | var info = orig_map.originalPositionFor({ 74 | line: orig_line, 75 | column: orig_col 76 | }); 77 | if (info.source === null) { 78 | return; 79 | } 80 | source = info.source; 81 | orig_line = info.line; 82 | orig_col = info.column; 83 | name = info.name || name; 84 | } 85 | generator.addMapping({ 86 | generated : { line: gen_line + options.dest_line_diff, column: gen_col }, 87 | original : { line: orig_line + options.orig_line_diff, column: orig_col }, 88 | source : source, 89 | name : name 90 | }); 91 | }; 92 | return { 93 | add : add, 94 | get : function() { return generator }, 95 | toString : function() { return JSON.stringify(generator.toJSON()); } 96 | }; 97 | }; 98 | -------------------------------------------------------------------------------- /node_modules/uglify-js/lib/transform.js: -------------------------------------------------------------------------------- 1 | /*********************************************************************** 2 | 3 | A JavaScript tokenizer / parser / beautifier / compressor. 4 | https://github.com/mishoo/UglifyJS2 5 | 6 | -------------------------------- (C) --------------------------------- 7 | 8 | Author: Mihai Bazon 9 | 10 | http://mihai.bazon.net/blog 11 | 12 | Distributed under the BSD license: 13 | 14 | Copyright 2012 (c) Mihai Bazon 15 | 16 | Redistribution and use in source and binary forms, with or without 17 | modification, are permitted provided that the following conditions 18 | are met: 19 | 20 | * Redistributions of source code must retain the above 21 | copyright notice, this list of conditions and the following 22 | disclaimer. 23 | 24 | * Redistributions in binary form must reproduce the above 25 | copyright notice, this list of conditions and the following 26 | disclaimer in the documentation and/or other materials 27 | provided with the distribution. 28 | 29 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY 30 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 32 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE 33 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 34 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 35 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 36 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 38 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 39 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 | SUCH DAMAGE. 41 | 42 | ***********************************************************************/ 43 | 44 | "use strict"; 45 | 46 | // Tree transformer helpers. 47 | 48 | function TreeTransformer(before, after) { 49 | TreeWalker.call(this); 50 | this.before = before; 51 | this.after = after; 52 | } 53 | TreeTransformer.prototype = new TreeWalker; 54 | 55 | (function(undefined){ 56 | 57 | function _(node, descend) { 58 | node.DEFMETHOD("transform", function(tw, in_list){ 59 | var x, y; 60 | tw.push(this); 61 | if (tw.before) x = tw.before(this, descend, in_list); 62 | if (x === undefined) { 63 | if (!tw.after) { 64 | x = this; 65 | descend(x, tw); 66 | } else { 67 | tw.stack[tw.stack.length - 1] = x = this; 68 | descend(x, tw); 69 | y = tw.after(x, in_list); 70 | if (y !== undefined) x = y; 71 | } 72 | } 73 | tw.pop(); 74 | return x; 75 | }); 76 | }; 77 | 78 | function do_list(list, tw) { 79 | return MAP(list, function(node){ 80 | return node.transform(tw, true); 81 | }); 82 | }; 83 | 84 | _(AST_Node, noop); 85 | 86 | _(AST_LabeledStatement, function(self, tw){ 87 | self.label = self.label.transform(tw); 88 | self.body = self.body.transform(tw); 89 | }); 90 | 91 | _(AST_SimpleStatement, function(self, tw){ 92 | self.body = self.body.transform(tw); 93 | }); 94 | 95 | _(AST_Block, function(self, tw){ 96 | self.body = do_list(self.body, tw); 97 | }); 98 | 99 | _(AST_DWLoop, function(self, tw){ 100 | self.condition = self.condition.transform(tw); 101 | self.body = self.body.transform(tw); 102 | }); 103 | 104 | _(AST_For, function(self, tw){ 105 | if (self.init) self.init = self.init.transform(tw); 106 | if (self.condition) self.condition = self.condition.transform(tw); 107 | if (self.step) self.step = self.step.transform(tw); 108 | self.body = self.body.transform(tw); 109 | }); 110 | 111 | _(AST_ForIn, function(self, tw){ 112 | self.init = self.init.transform(tw); 113 | self.object = self.object.transform(tw); 114 | self.body = self.body.transform(tw); 115 | }); 116 | 117 | _(AST_With, function(self, tw){ 118 | self.expression = self.expression.transform(tw); 119 | self.body = self.body.transform(tw); 120 | }); 121 | 122 | _(AST_Exit, function(self, tw){ 123 | if (self.value) self.value = self.value.transform(tw); 124 | }); 125 | 126 | _(AST_LoopControl, function(self, tw){ 127 | if (self.label) self.label = self.label.transform(tw); 128 | }); 129 | 130 | _(AST_If, function(self, tw){ 131 | self.condition = self.condition.transform(tw); 132 | self.body = self.body.transform(tw); 133 | if (self.alternative) self.alternative = self.alternative.transform(tw); 134 | }); 135 | 136 | _(AST_Switch, function(self, tw){ 137 | self.expression = self.expression.transform(tw); 138 | self.body = do_list(self.body, tw); 139 | }); 140 | 141 | _(AST_Case, function(self, tw){ 142 | self.expression = self.expression.transform(tw); 143 | self.body = do_list(self.body, tw); 144 | }); 145 | 146 | _(AST_Try, function(self, tw){ 147 | self.body = do_list(self.body, tw); 148 | if (self.bcatch) self.bcatch = self.bcatch.transform(tw); 149 | if (self.bfinally) self.bfinally = self.bfinally.transform(tw); 150 | }); 151 | 152 | _(AST_Catch, function(self, tw){ 153 | self.argname = self.argname.transform(tw); 154 | self.body = do_list(self.body, tw); 155 | }); 156 | 157 | _(AST_Definitions, function(self, tw){ 158 | self.definitions = do_list(self.definitions, tw); 159 | }); 160 | 161 | _(AST_VarDef, function(self, tw){ 162 | self.name = self.name.transform(tw); 163 | if (self.value) self.value = self.value.transform(tw); 164 | }); 165 | 166 | _(AST_Lambda, function(self, tw){ 167 | if (self.name) self.name = self.name.transform(tw); 168 | self.argnames = do_list(self.argnames, tw); 169 | self.body = do_list(self.body, tw); 170 | }); 171 | 172 | _(AST_Call, function(self, tw){ 173 | self.expression = self.expression.transform(tw); 174 | self.args = do_list(self.args, tw); 175 | }); 176 | 177 | _(AST_Sequence, function(self, tw){ 178 | self.expressions = do_list(self.expressions, tw); 179 | }); 180 | 181 | _(AST_Dot, function(self, tw){ 182 | self.expression = self.expression.transform(tw); 183 | }); 184 | 185 | _(AST_Sub, function(self, tw){ 186 | self.expression = self.expression.transform(tw); 187 | self.property = self.property.transform(tw); 188 | }); 189 | 190 | _(AST_Unary, function(self, tw){ 191 | self.expression = self.expression.transform(tw); 192 | }); 193 | 194 | _(AST_Binary, function(self, tw){ 195 | self.left = self.left.transform(tw); 196 | self.right = self.right.transform(tw); 197 | }); 198 | 199 | _(AST_Conditional, function(self, tw){ 200 | self.condition = self.condition.transform(tw); 201 | self.consequent = self.consequent.transform(tw); 202 | self.alternative = self.alternative.transform(tw); 203 | }); 204 | 205 | _(AST_Array, function(self, tw){ 206 | self.elements = do_list(self.elements, tw); 207 | }); 208 | 209 | _(AST_Object, function(self, tw){ 210 | self.properties = do_list(self.properties, tw); 211 | }); 212 | 213 | _(AST_ObjectProperty, function(self, tw){ 214 | self.value = self.value.transform(tw); 215 | }); 216 | 217 | })(); 218 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/array-set.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2011 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | */ 7 | 8 | var util = require('./util'); 9 | var has = Object.prototype.hasOwnProperty; 10 | var hasNativeMap = typeof Map !== "undefined"; 11 | 12 | /** 13 | * A data structure which is a combination of an array and a set. Adding a new 14 | * member is O(1), testing for membership is O(1), and finding the index of an 15 | * element is O(1). Removing elements from the set is not supported. Only 16 | * strings are supported for membership. 17 | */ 18 | function ArraySet() { 19 | this._array = []; 20 | this._set = hasNativeMap ? new Map() : Object.create(null); 21 | } 22 | 23 | /** 24 | * Static method for creating ArraySet instances from an existing array. 25 | */ 26 | ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { 27 | var set = new ArraySet(); 28 | for (var i = 0, len = aArray.length; i < len; i++) { 29 | set.add(aArray[i], aAllowDuplicates); 30 | } 31 | return set; 32 | }; 33 | 34 | /** 35 | * Return how many unique items are in this ArraySet. If duplicates have been 36 | * added, than those do not count towards the size. 37 | * 38 | * @returns Number 39 | */ 40 | ArraySet.prototype.size = function ArraySet_size() { 41 | return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; 42 | }; 43 | 44 | /** 45 | * Add the given string to this set. 46 | * 47 | * @param String aStr 48 | */ 49 | ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { 50 | var sStr = hasNativeMap ? aStr : util.toSetString(aStr); 51 | var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); 52 | var idx = this._array.length; 53 | if (!isDuplicate || aAllowDuplicates) { 54 | this._array.push(aStr); 55 | } 56 | if (!isDuplicate) { 57 | if (hasNativeMap) { 58 | this._set.set(aStr, idx); 59 | } else { 60 | this._set[sStr] = idx; 61 | } 62 | } 63 | }; 64 | 65 | /** 66 | * Is the given string a member of this set? 67 | * 68 | * @param String aStr 69 | */ 70 | ArraySet.prototype.has = function ArraySet_has(aStr) { 71 | if (hasNativeMap) { 72 | return this._set.has(aStr); 73 | } else { 74 | var sStr = util.toSetString(aStr); 75 | return has.call(this._set, sStr); 76 | } 77 | }; 78 | 79 | /** 80 | * What is the index of the given string in the array? 81 | * 82 | * @param String aStr 83 | */ 84 | ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { 85 | if (hasNativeMap) { 86 | var idx = this._set.get(aStr); 87 | if (idx >= 0) { 88 | return idx; 89 | } 90 | } else { 91 | var sStr = util.toSetString(aStr); 92 | if (has.call(this._set, sStr)) { 93 | return this._set[sStr]; 94 | } 95 | } 96 | 97 | throw new Error('"' + aStr + '" is not in the set.'); 98 | }; 99 | 100 | /** 101 | * What is the element at the given index? 102 | * 103 | * @param Number aIdx 104 | */ 105 | ArraySet.prototype.at = function ArraySet_at(aIdx) { 106 | if (aIdx >= 0 && aIdx < this._array.length) { 107 | return this._array[aIdx]; 108 | } 109 | throw new Error('No element indexed by ' + aIdx); 110 | }; 111 | 112 | /** 113 | * Returns the array representation of this set (which has the proper indices 114 | * indicated by indexOf). Note that this is a copy of the internal array used 115 | * for storing the members so that no one can mess with internal state. 116 | */ 117 | ArraySet.prototype.toArray = function ArraySet_toArray() { 118 | return this._array.slice(); 119 | }; 120 | 121 | exports.ArraySet = ArraySet; 122 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2011 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | * 7 | * Based on the Base 64 VLQ implementation in Closure Compiler: 8 | * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java 9 | * 10 | * Copyright 2011 The Closure Compiler Authors. All rights reserved. 11 | * Redistribution and use in source and binary forms, with or without 12 | * modification, are permitted provided that the following conditions are 13 | * met: 14 | * 15 | * * Redistributions of source code must retain the above copyright 16 | * notice, this list of conditions and the following disclaimer. 17 | * * Redistributions in binary form must reproduce the above 18 | * copyright notice, this list of conditions and the following 19 | * disclaimer in the documentation and/or other materials provided 20 | * with the distribution. 21 | * * Neither the name of Google Inc. nor the names of its 22 | * contributors may be used to endorse or promote products derived 23 | * from this software without specific prior written permission. 24 | * 25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 | */ 37 | 38 | var base64 = require('./base64'); 39 | 40 | // A single base 64 digit can contain 6 bits of data. For the base 64 variable 41 | // length quantities we use in the source map spec, the first bit is the sign, 42 | // the next four bits are the actual value, and the 6th bit is the 43 | // continuation bit. The continuation bit tells us whether there are more 44 | // digits in this value following this digit. 45 | // 46 | // Continuation 47 | // | Sign 48 | // | | 49 | // V V 50 | // 101011 51 | 52 | var VLQ_BASE_SHIFT = 5; 53 | 54 | // binary: 100000 55 | var VLQ_BASE = 1 << VLQ_BASE_SHIFT; 56 | 57 | // binary: 011111 58 | var VLQ_BASE_MASK = VLQ_BASE - 1; 59 | 60 | // binary: 100000 61 | var VLQ_CONTINUATION_BIT = VLQ_BASE; 62 | 63 | /** 64 | * Converts from a two-complement value to a value where the sign bit is 65 | * placed in the least significant bit. For example, as decimals: 66 | * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) 67 | * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) 68 | */ 69 | function toVLQSigned(aValue) { 70 | return aValue < 0 71 | ? ((-aValue) << 1) + 1 72 | : (aValue << 1) + 0; 73 | } 74 | 75 | /** 76 | * Converts to a two-complement value from a value where the sign bit is 77 | * placed in the least significant bit. For example, as decimals: 78 | * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 79 | * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 80 | */ 81 | function fromVLQSigned(aValue) { 82 | var isNegative = (aValue & 1) === 1; 83 | var shifted = aValue >> 1; 84 | return isNegative 85 | ? -shifted 86 | : shifted; 87 | } 88 | 89 | /** 90 | * Returns the base 64 VLQ encoded value. 91 | */ 92 | exports.encode = function base64VLQ_encode(aValue) { 93 | var encoded = ""; 94 | var digit; 95 | 96 | var vlq = toVLQSigned(aValue); 97 | 98 | do { 99 | digit = vlq & VLQ_BASE_MASK; 100 | vlq >>>= VLQ_BASE_SHIFT; 101 | if (vlq > 0) { 102 | // There are still more digits in this value, so we must make sure the 103 | // continuation bit is marked. 104 | digit |= VLQ_CONTINUATION_BIT; 105 | } 106 | encoded += base64.encode(digit); 107 | } while (vlq > 0); 108 | 109 | return encoded; 110 | }; 111 | 112 | /** 113 | * Decodes the next base 64 VLQ value from the given string and returns the 114 | * value and the rest of the string via the out parameter. 115 | */ 116 | exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { 117 | var strLen = aStr.length; 118 | var result = 0; 119 | var shift = 0; 120 | var continuation, digit; 121 | 122 | do { 123 | if (aIndex >= strLen) { 124 | throw new Error("Expected more digits in base 64 VLQ value."); 125 | } 126 | 127 | digit = base64.decode(aStr.charCodeAt(aIndex++)); 128 | if (digit === -1) { 129 | throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); 130 | } 131 | 132 | continuation = !!(digit & VLQ_CONTINUATION_BIT); 133 | digit &= VLQ_BASE_MASK; 134 | result = result + (digit << shift); 135 | shift += VLQ_BASE_SHIFT; 136 | } while (continuation); 137 | 138 | aOutParam.value = fromVLQSigned(result); 139 | aOutParam.rest = aIndex; 140 | }; 141 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/base64.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2011 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | */ 7 | 8 | var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); 9 | 10 | /** 11 | * Encode an integer in the range of 0 to 63 to a single base 64 digit. 12 | */ 13 | exports.encode = function (number) { 14 | if (0 <= number && number < intToCharMap.length) { 15 | return intToCharMap[number]; 16 | } 17 | throw new TypeError("Must be between 0 and 63: " + number); 18 | }; 19 | 20 | /** 21 | * Decode a single base 64 character code digit to an integer. Returns -1 on 22 | * failure. 23 | */ 24 | exports.decode = function (charCode) { 25 | var bigA = 65; // 'A' 26 | var bigZ = 90; // 'Z' 27 | 28 | var littleA = 97; // 'a' 29 | var littleZ = 122; // 'z' 30 | 31 | var zero = 48; // '0' 32 | var nine = 57; // '9' 33 | 34 | var plus = 43; // '+' 35 | var slash = 47; // '/' 36 | 37 | var littleOffset = 26; 38 | var numberOffset = 52; 39 | 40 | // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ 41 | if (bigA <= charCode && charCode <= bigZ) { 42 | return (charCode - bigA); 43 | } 44 | 45 | // 26 - 51: abcdefghijklmnopqrstuvwxyz 46 | if (littleA <= charCode && charCode <= littleZ) { 47 | return (charCode - littleA + littleOffset); 48 | } 49 | 50 | // 52 - 61: 0123456789 51 | if (zero <= charCode && charCode <= nine) { 52 | return (charCode - zero + numberOffset); 53 | } 54 | 55 | // 62: + 56 | if (charCode == plus) { 57 | return 62; 58 | } 59 | 60 | // 63: / 61 | if (charCode == slash) { 62 | return 63; 63 | } 64 | 65 | // Invalid base64 digit. 66 | return -1; 67 | }; 68 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/binary-search.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2011 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | */ 7 | 8 | exports.GREATEST_LOWER_BOUND = 1; 9 | exports.LEAST_UPPER_BOUND = 2; 10 | 11 | /** 12 | * Recursive implementation of binary search. 13 | * 14 | * @param aLow Indices here and lower do not contain the needle. 15 | * @param aHigh Indices here and higher do not contain the needle. 16 | * @param aNeedle The element being searched for. 17 | * @param aHaystack The non-empty array being searched. 18 | * @param aCompare Function which takes two elements and returns -1, 0, or 1. 19 | * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or 20 | * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the 21 | * closest element that is smaller than or greater than the one we are 22 | * searching for, respectively, if the exact element cannot be found. 23 | */ 24 | function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { 25 | // This function terminates when one of the following is true: 26 | // 27 | // 1. We find the exact element we are looking for. 28 | // 29 | // 2. We did not find the exact element, but we can return the index of 30 | // the next-closest element. 31 | // 32 | // 3. We did not find the exact element, and there is no next-closest 33 | // element than the one we are searching for, so we return -1. 34 | var mid = Math.floor((aHigh - aLow) / 2) + aLow; 35 | var cmp = aCompare(aNeedle, aHaystack[mid], true); 36 | if (cmp === 0) { 37 | // Found the element we are looking for. 38 | return mid; 39 | } 40 | else if (cmp > 0) { 41 | // Our needle is greater than aHaystack[mid]. 42 | if (aHigh - mid > 1) { 43 | // The element is in the upper half. 44 | return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); 45 | } 46 | 47 | // The exact needle element was not found in this haystack. Determine if 48 | // we are in termination case (3) or (2) and return the appropriate thing. 49 | if (aBias == exports.LEAST_UPPER_BOUND) { 50 | return aHigh < aHaystack.length ? aHigh : -1; 51 | } else { 52 | return mid; 53 | } 54 | } 55 | else { 56 | // Our needle is less than aHaystack[mid]. 57 | if (mid - aLow > 1) { 58 | // The element is in the lower half. 59 | return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); 60 | } 61 | 62 | // we are in termination case (3) or (2) and return the appropriate thing. 63 | if (aBias == exports.LEAST_UPPER_BOUND) { 64 | return mid; 65 | } else { 66 | return aLow < 0 ? -1 : aLow; 67 | } 68 | } 69 | } 70 | 71 | /** 72 | * This is an implementation of binary search which will always try and return 73 | * the index of the closest element if there is no exact hit. This is because 74 | * mappings between original and generated line/col pairs are single points, 75 | * and there is an implicit region between each of them, so a miss just means 76 | * that you aren't on the very start of a region. 77 | * 78 | * @param aNeedle The element you are looking for. 79 | * @param aHaystack The array that is being searched. 80 | * @param aCompare A function which takes the needle and an element in the 81 | * array and returns -1, 0, or 1 depending on whether the needle is less 82 | * than, equal to, or greater than the element, respectively. 83 | * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or 84 | * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the 85 | * closest element that is smaller than or greater than the one we are 86 | * searching for, respectively, if the exact element cannot be found. 87 | * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. 88 | */ 89 | exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { 90 | if (aHaystack.length === 0) { 91 | return -1; 92 | } 93 | 94 | var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, 95 | aCompare, aBias || exports.GREATEST_LOWER_BOUND); 96 | if (index < 0) { 97 | return -1; 98 | } 99 | 100 | // We have found either the exact element, or the next-closest element than 101 | // the one we are searching for. However, there may be more than one such 102 | // element. Make sure we always return the smallest of these. 103 | while (index - 1 >= 0) { 104 | if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { 105 | break; 106 | } 107 | --index; 108 | } 109 | 110 | return index; 111 | }; 112 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2014 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | */ 7 | 8 | var util = require('./util'); 9 | 10 | /** 11 | * Determine whether mappingB is after mappingA with respect to generated 12 | * position. 13 | */ 14 | function generatedPositionAfter(mappingA, mappingB) { 15 | // Optimized for most common case 16 | var lineA = mappingA.generatedLine; 17 | var lineB = mappingB.generatedLine; 18 | var columnA = mappingA.generatedColumn; 19 | var columnB = mappingB.generatedColumn; 20 | return lineB > lineA || lineB == lineA && columnB >= columnA || 21 | util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; 22 | } 23 | 24 | /** 25 | * A data structure to provide a sorted view of accumulated mappings in a 26 | * performance conscious manner. It trades a neglibable overhead in general 27 | * case for a large speedup in case of mappings being added in order. 28 | */ 29 | function MappingList() { 30 | this._array = []; 31 | this._sorted = true; 32 | // Serves as infimum 33 | this._last = {generatedLine: -1, generatedColumn: 0}; 34 | } 35 | 36 | /** 37 | * Iterate through internal items. This method takes the same arguments that 38 | * `Array.prototype.forEach` takes. 39 | * 40 | * NOTE: The order of the mappings is NOT guaranteed. 41 | */ 42 | MappingList.prototype.unsortedForEach = 43 | function MappingList_forEach(aCallback, aThisArg) { 44 | this._array.forEach(aCallback, aThisArg); 45 | }; 46 | 47 | /** 48 | * Add the given source mapping. 49 | * 50 | * @param Object aMapping 51 | */ 52 | MappingList.prototype.add = function MappingList_add(aMapping) { 53 | if (generatedPositionAfter(this._last, aMapping)) { 54 | this._last = aMapping; 55 | this._array.push(aMapping); 56 | } else { 57 | this._sorted = false; 58 | this._array.push(aMapping); 59 | } 60 | }; 61 | 62 | /** 63 | * Returns the flat, sorted array of mappings. The mappings are sorted by 64 | * generated position. 65 | * 66 | * WARNING: This method returns internal data without copying, for 67 | * performance. The return value must NOT be mutated, and should be treated as 68 | * an immutable borrow. If you want to take ownership, you must make your own 69 | * copy. 70 | */ 71 | MappingList.prototype.toArray = function MappingList_toArray() { 72 | if (!this._sorted) { 73 | this._array.sort(util.compareByGeneratedPositionsInflated); 74 | this._sorted = true; 75 | } 76 | return this._array; 77 | }; 78 | 79 | exports.MappingList = MappingList; 80 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: js; js-indent-level: 2; -*- */ 2 | /* 3 | * Copyright 2011 Mozilla Foundation and contributors 4 | * Licensed under the New BSD license. See LICENSE or: 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | */ 7 | 8 | // It turns out that some (most?) JavaScript engines don't self-host 9 | // `Array.prototype.sort`. This makes sense because C++ will likely remain 10 | // faster than JS when doing raw CPU-intensive sorting. However, when using a 11 | // custom comparator function, calling back and forth between the VM's C++ and 12 | // JIT'd JS is rather slow *and* loses JIT type information, resulting in 13 | // worse generated code for the comparator function than would be optimal. In 14 | // fact, when sorting with a comparator, these costs outweigh the benefits of 15 | // sorting in C++. By using our own JS-implemented Quick Sort (below), we get 16 | // a ~3500ms mean speed-up in `bench/bench.html`. 17 | 18 | /** 19 | * Swap the elements indexed by `x` and `y` in the array `ary`. 20 | * 21 | * @param {Array} ary 22 | * The array. 23 | * @param {Number} x 24 | * The index of the first item. 25 | * @param {Number} y 26 | * The index of the second item. 27 | */ 28 | function swap(ary, x, y) { 29 | var temp = ary[x]; 30 | ary[x] = ary[y]; 31 | ary[y] = temp; 32 | } 33 | 34 | /** 35 | * Returns a random integer within the range `low .. high` inclusive. 36 | * 37 | * @param {Number} low 38 | * The lower bound on the range. 39 | * @param {Number} high 40 | * The upper bound on the range. 41 | */ 42 | function randomIntInRange(low, high) { 43 | return Math.round(low + (Math.random() * (high - low))); 44 | } 45 | 46 | /** 47 | * The Quick Sort algorithm. 48 | * 49 | * @param {Array} ary 50 | * An array to sort. 51 | * @param {function} comparator 52 | * Function to use to compare two items. 53 | * @param {Number} p 54 | * Start index of the array 55 | * @param {Number} r 56 | * End index of the array 57 | */ 58 | function doQuickSort(ary, comparator, p, r) { 59 | // If our lower bound is less than our upper bound, we (1) partition the 60 | // array into two pieces and (2) recurse on each half. If it is not, this is 61 | // the empty array and our base case. 62 | 63 | if (p < r) { 64 | // (1) Partitioning. 65 | // 66 | // The partitioning chooses a pivot between `p` and `r` and moves all 67 | // elements that are less than or equal to the pivot to the before it, and 68 | // all the elements that are greater than it after it. The effect is that 69 | // once partition is done, the pivot is in the exact place it will be when 70 | // the array is put in sorted order, and it will not need to be moved 71 | // again. This runs in O(n) time. 72 | 73 | // Always choose a random pivot so that an input array which is reverse 74 | // sorted does not cause O(n^2) running time. 75 | var pivotIndex = randomIntInRange(p, r); 76 | var i = p - 1; 77 | 78 | swap(ary, pivotIndex, r); 79 | var pivot = ary[r]; 80 | 81 | // Immediately after `j` is incremented in this loop, the following hold 82 | // true: 83 | // 84 | // * Every element in `ary[p .. i]` is less than or equal to the pivot. 85 | // 86 | // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. 87 | for (var j = p; j < r; j++) { 88 | if (comparator(ary[j], pivot) <= 0) { 89 | i += 1; 90 | swap(ary, i, j); 91 | } 92 | } 93 | 94 | swap(ary, i + 1, j); 95 | var q = i + 1; 96 | 97 | // (2) Recurse on each half. 98 | 99 | doQuickSort(ary, comparator, p, q - 1); 100 | doQuickSort(ary, comparator, q + 1, r); 101 | } 102 | } 103 | 104 | /** 105 | * Sort the given array in-place with the given comparator function. 106 | * 107 | * @param {Array} ary 108 | * An array to sort. 109 | * @param {function} comparator 110 | * Function to use to compare two items. 111 | */ 112 | exports.quickSort = function (ary, comparator) { 113 | doQuickSort(ary, comparator, 0, ary.length - 1); 114 | }; 115 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/source-map.d.ts: -------------------------------------------------------------------------------- 1 | export interface StartOfSourceMap { 2 | file?: string; 3 | sourceRoot?: string; 4 | } 5 | 6 | export interface RawSourceMap extends StartOfSourceMap { 7 | version: string; 8 | sources: string[]; 9 | names: string[]; 10 | sourcesContent?: string[]; 11 | mappings: string; 12 | } 13 | 14 | export interface Position { 15 | line: number; 16 | column: number; 17 | } 18 | 19 | export interface LineRange extends Position { 20 | lastColumn: number; 21 | } 22 | 23 | export interface FindPosition extends Position { 24 | // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND 25 | bias?: number; 26 | } 27 | 28 | export interface SourceFindPosition extends FindPosition { 29 | source: string; 30 | } 31 | 32 | export interface MappedPosition extends Position { 33 | source: string; 34 | name?: string; 35 | } 36 | 37 | export interface MappingItem { 38 | source: string; 39 | generatedLine: number; 40 | generatedColumn: number; 41 | originalLine: number; 42 | originalColumn: number; 43 | name: string; 44 | } 45 | 46 | export class SourceMapConsumer { 47 | static GENERATED_ORDER: number; 48 | static ORIGINAL_ORDER: number; 49 | 50 | static GREATEST_LOWER_BOUND: number; 51 | static LEAST_UPPER_BOUND: number; 52 | 53 | constructor(rawSourceMap: RawSourceMap); 54 | computeColumnSpans(): void; 55 | originalPositionFor(generatedPosition: FindPosition): MappedPosition; 56 | generatedPositionFor(originalPosition: SourceFindPosition): LineRange; 57 | allGeneratedPositionsFor(originalPosition: MappedPosition): Position[]; 58 | hasContentsOfAllSources(): boolean; 59 | sourceContentFor(source: string, returnNullOnMissing?: boolean): string; 60 | eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void; 61 | } 62 | 63 | export interface Mapping { 64 | generated: Position; 65 | original: Position; 66 | source: string; 67 | name?: string; 68 | } 69 | 70 | export class SourceMapGenerator { 71 | constructor(startOfSourceMap?: StartOfSourceMap); 72 | static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator; 73 | addMapping(mapping: Mapping): void; 74 | setSourceContent(sourceFile: string, sourceContent: string): void; 75 | applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void; 76 | toString(): string; 77 | } 78 | 79 | export interface CodeWithSourceMap { 80 | code: string; 81 | map: SourceMapGenerator; 82 | } 83 | 84 | export class SourceNode { 85 | constructor(); 86 | constructor(line: number, column: number, source: string); 87 | constructor(line: number, column: number, source: string, chunk?: string, name?: string); 88 | static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode; 89 | add(chunk: string): void; 90 | prepend(chunk: string): void; 91 | setSourceContent(sourceFile: string, sourceContent: string): void; 92 | walk(fn: (chunk: string, mapping: MappedPosition) => void): void; 93 | walkSourceContents(fn: (file: string, content: string) => void): void; 94 | join(sep: string): SourceNode; 95 | replaceRight(pattern: string, replacement: string): SourceNode; 96 | toString(): string; 97 | toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap; 98 | } 99 | -------------------------------------------------------------------------------- /node_modules/uglify-js/node_modules/source-map/source-map.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2009-2011 Mozilla Foundation and contributors 3 | * Licensed under the New BSD license. See LICENSE.txt or: 4 | * http://opensource.org/licenses/BSD-3-Clause 5 | */ 6 | exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; 7 | exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; 8 | exports.SourceNode = require('./lib/source-node').SourceNode; 9 | -------------------------------------------------------------------------------- /node_modules/uglify-js/tools/exports.js: -------------------------------------------------------------------------------- 1 | exports["Dictionary"] = Dictionary; 2 | exports["TreeWalker"] = TreeWalker; 3 | exports["TreeTransformer"] = TreeTransformer; 4 | exports["minify"] = minify; 5 | exports["_push_uniq"] = push_uniq; 6 | -------------------------------------------------------------------------------- /node_modules/uglify-js/tools/node.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | 3 | var UglifyJS = exports; 4 | var FILES = UglifyJS.FILES = [ 5 | "../lib/utils.js", 6 | "../lib/ast.js", 7 | "../lib/parse.js", 8 | "../lib/transform.js", 9 | "../lib/scope.js", 10 | "../lib/output.js", 11 | "../lib/compress.js", 12 | "../lib/sourcemap.js", 13 | "../lib/mozilla-ast.js", 14 | "../lib/propmangle.js", 15 | "../lib/minify.js", 16 | "./exports.js", 17 | ].map(function(file){ 18 | return require.resolve(file); 19 | }); 20 | 21 | new Function("MOZ_SourceMap", "exports", function() { 22 | var code = FILES.map(function(file) { 23 | return fs.readFileSync(file, "utf8"); 24 | }); 25 | code.push("exports.describe_ast = " + describe_ast.toString()); 26 | return code.join("\n\n"); 27 | }())( 28 | require("source-map"), 29 | UglifyJS 30 | ); 31 | 32 | function describe_ast() { 33 | var out = OutputStream({ beautify: true }); 34 | function doitem(ctor) { 35 | out.print("AST_" + ctor.TYPE); 36 | var props = ctor.SELF_PROPS.filter(function(prop){ 37 | return !/^\$/.test(prop); 38 | }); 39 | if (props.length > 0) { 40 | out.space(); 41 | out.with_parens(function(){ 42 | props.forEach(function(prop, i){ 43 | if (i) out.space(); 44 | out.print(prop); 45 | }); 46 | }); 47 | } 48 | if (ctor.documentation) { 49 | out.space(); 50 | out.print_string(ctor.documentation); 51 | } 52 | if (ctor.SUBCLASSES.length > 0) { 53 | out.space(); 54 | out.with_block(function(){ 55 | ctor.SUBCLASSES.forEach(function(ctor, i){ 56 | out.indent(); 57 | doitem(ctor); 58 | out.newline(); 59 | }); 60 | }); 61 | } 62 | }; 63 | doitem(AST_Node); 64 | return out + "\n"; 65 | } 66 | 67 | function infer_options(options) { 68 | var result = UglifyJS.minify("", options); 69 | return result.error && result.error.defs; 70 | } 71 | 72 | UglifyJS.default_options = function() { 73 | var defs = {}; 74 | Object.keys(infer_options({ 0: 0 })).forEach(function(component) { 75 | var options = {}; 76 | options[component] = { 0: 0 }; 77 | if (options = infer_options(options)) { 78 | defs[component] = options; 79 | } 80 | }); 81 | return defs; 82 | }; 83 | -------------------------------------------------------------------------------- /node_modules/uglify-js/tools/props.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /social/Email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/social/Email.png -------------------------------------------------------------------------------- /social/Facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/social/Facebook.png -------------------------------------------------------------------------------- /social/Twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/social/Twitter.png -------------------------------------------------------------------------------- /social/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncase/joy/52430e0f3098c368f5445f7f8abf962acdbc7059/social/thumbnail.png -------------------------------------------------------------------------------- /src/core/joy-actors-instructions.js: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////// 2 | // LOGIC ACTORS ///////////////////////// 3 | ///////////////////////////////////////// 4 | 5 | Joy.module("instructions", function(){ 6 | 7 | Joy.add({ 8 | name: "Repeat the following...", 9 | type: "instructions/repeat", 10 | tags: ["instructions", "action"], 11 | init: "Repeat the following {id:'count', type:'number', min:1, placeholder:3} times: "+ 12 | "{id:'actions', type:'actions', resetVariables:false}", 13 | onact: function(my){ 14 | 15 | // Previewing? How much to preview? 16 | var param = 1; 17 | if(my.data._PREVIEW!==undefined) param=my.data._PREVIEW; 18 | 19 | // Loop through it... (as far as preview shows, anyway) 20 | var loops = Math.floor(my.data.count*param); 21 | for(var i=0; i0){ 48 | var latestReference = varReferences[varReferences.length-1]; 49 | refID = latestReference.id; 50 | self.setData("refID", refID, true); // set data 51 | Joy.connectReference(self, refID); // connect this ref 52 | }else{ 53 | // Otherwise, make a new one! 54 | self._createNewReference(); 55 | } 56 | 57 | } 58 | 59 | // Switch reference 60 | self._switchReference = function(newRefID){ 61 | var refID = self.getData("refID"); 62 | Joy.disconnectReference(self, refID); // disconnect old ref 63 | self.setData("refID", newRefID); // DO update this! 64 | Joy.connectReference(self, newRefID); // connect new ref 65 | }; 66 | 67 | }, 68 | initWidget: function(self){ 69 | 70 | self.dom = document.createElement("span"); 71 | 72 | // The String edits my REFERENCE'S data. 73 | var refID = self.getData("refID"); 74 | var refData = Joy.getReferenceById(self, refID).data; 75 | var stringActor = self.addChild({ 76 | type: "string", 77 | prefix:"[", suffix:"]", 78 | color: refData.color 79 | }, refData); 80 | var stringWidget = stringActor.createWidget(); 81 | self.dom.appendChild(stringWidget); 82 | 83 | // This String Actor also updates its color 84 | var _old_stringActor_onDataChange = stringActor.onDataChange; 85 | stringActor.onDataChange = function(){ 86 | _old_stringActor_onDataChange(); 87 | var color = stringActor.getData("color"); 88 | stringActor.stringUI.setColor(color); 89 | }; 90 | 91 | // Chooser? Can choose to switch to other variables (or make new one) 92 | var variableType = self.variableType; 93 | var _showChooser = function(){ 94 | 95 | var options = []; 96 | 97 | // Get all references that are of this type 98 | var refs = Joy.getReferencesByTag(self, variableType); 99 | var myRefID = self.getData("refID"); 100 | refs.forEach(function(ref){ 101 | if(ref.id==myRefID) return; // don't show SELF 102 | var color = ref.data.color; 103 | color = _HSVToRGBString(color[0], color[1], color[2]); 104 | options.push({ 105 | label: "["+ref.data.value+"]", 106 | value: ref.id, 107 | color: color 108 | }); 109 | }); 110 | 111 | // Meta Options: 112 | options.push({ 113 | category: "meta", 114 | label: "(+new)", 115 | value: "NEW" 116 | }); 117 | options.push({ 118 | category: "meta", 119 | label: "(change color)", 120 | value: "CHANGE_COLOR" 121 | }); 122 | 123 | // Show all possible variables! 124 | Joy.modal.Chooser({ 125 | source: self.dom, 126 | options: options, 127 | onchange: function(newRefID){ 128 | 129 | if(newRefID=="CHANGE_COLOR"){ 130 | 131 | // Just change color, ha. 132 | Joy.modal.Color({ 133 | source: self.dom, 134 | value: stringActor.getData("color"), 135 | onchange: function(newColor){ 136 | stringActor.setData("color", newColor); 137 | stringActor.stringUI.setColor(newColor); // do this again coz edit lock 138 | } 139 | }); 140 | 141 | }else{ 142 | 143 | // Make a new reference? Either way, set refID 144 | if(newRefID=="NEW"){ 145 | var oldRefID = self.getData("refID"); 146 | Joy.disconnectReference(self, oldRefID); // disconnect old ref 147 | self._createNewReference(); 148 | self.update(); // update, yo 149 | }else{ 150 | self._switchReference(newRefID); 151 | } 152 | 153 | // Make String Widget edit that instead 154 | var refID = self.getData("refID"); 155 | var ref = Joy.getReferenceById(self, refID); 156 | stringActor.switchData(ref.data); 157 | 158 | } 159 | 160 | } 161 | }); 162 | 163 | }; 164 | 165 | // Show ON CLICK! 166 | if(!self.noChooser){ 167 | self.dom.onclick = _showChooser; 168 | } 169 | 170 | }, 171 | onget: function(my){ 172 | var refID = my.data.refID; 173 | var ref = Joy.getReferenceById(my.actor, refID); 174 | return ref.data.value; // returns the variable name 175 | }, 176 | onkill: function(self){ 177 | 178 | // Disconnect any references I may have 179 | var refID = self.getData("refID"); 180 | Joy.disconnectReference(self, refID); // disconnect old ref 181 | 182 | } 183 | }); -------------------------------------------------------------------------------- /src/lib/-helpers.js: -------------------------------------------------------------------------------- 1 | /********************************** 2 | 3 | RANDOM CRAP TO MAKE MY LIFE EASIER 4 | 5 | TODO: namespace these to avoid conflict 6 | 7 | **********************************/ 8 | 9 | // For true believers 10 | Math.TAU = 2*Math.PI; 11 | 12 | // Deep clone 13 | var _clone = function(json){ 14 | return JSON.parse(JSON.stringify(json)); 15 | }; 16 | 17 | // "Configure": or just slap all properties of one object onto another 18 | var _configure = function(target, config){ 19 | for(var key in config){ 20 | var value = config[key]; 21 | target[key] = value; 22 | } 23 | }; 24 | 25 | // Array stuff 26 | var _removeFromArray = function(array, toDelete){ 27 | var index = array.indexOf(toDelete); 28 | if(index<0) return false; 29 | array.splice(index,1); 30 | return true; 31 | } 32 | 33 | // Instant space 34 | var _nbsp = function(){ 35 | var span = document.createElement("span"); 36 | span.innerHTML = " "; 37 | return span; 38 | }; 39 | 40 | // When in Rome, use a completely unuseable numeric system 41 | // from http://blog.stevenlevithan.com/archives/javascript-roman-numeral-converter 42 | var _numberToRoman = function(num){ 43 | if (!+num) 44 | return NaN; 45 | var digits = String(+num).split(""), 46 | key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM", 47 | "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC", 48 | "","I","II","III","IV","V","VI","VII","VIII","IX"], 49 | roman = "", 50 | i = 3; 51 | while (i--) 52 | roman = (key[+digits.pop() + (i * 10)] || "") + roman; 53 | var result = Array(+digits.join("") + 1).join("M") + roman; 54 | return result.toLowerCase(); 55 | } 56 | 57 | // Number to Alphabetic Base 26 58 | // from https://stackoverflow.com/a/8604591 59 | var _numberToAlphabet = function(a){ 60 | 61 | var alpha = "abcdefghijklmnopqrstuvwxyz"; 62 | 63 | // First figure out how many digits there are. 64 | var c = 0; 65 | var x = 1; 66 | while (a >= x) { 67 | c++; 68 | a -= x; 69 | x *= 26; 70 | } 71 | 72 | // Now you can do normal base conversion. 73 | var s = ""; 74 | for (var i = 0; i < c; i++) { 75 | s = alpha.charAt(a % 26) + s; 76 | a = Math.floor(a/26); 77 | } 78 | return s; 79 | 80 | }; 81 | 82 | // Helps prevent copy-pasting weird stuff into contenteditable 83 | // see: http://jsfiddle.net/marinagon/1v63t05q/ 84 | var _insertTextAtCursor = function(text){ 85 | var sel, range, html; 86 | if(window.getSelection){ 87 | sel = window.getSelection(); 88 | if (sel.getRangeAt && sel.rangeCount) { 89 | range = sel.getRangeAt(0); 90 | range.deleteContents(); 91 | range.insertNode(document.createTextNode(text)); 92 | } 93 | } else if (document.selection && document.selection.createRange) { 94 | document.selection.createRange().text = text; 95 | } 96 | }; 97 | var _preventWeirdCopyPaste = function(element){ 98 | element.addEventListener("paste", function(e) { 99 | e.preventDefault(); 100 | if (e.clipboardData && e.clipboardData.getData) { 101 | var text = e.clipboardData.getData("text/plain"); 102 | document.execCommand("insertHTML", false, text); 103 | } else if (window.clipboardData && window.clipboardData.getData) { 104 | var text = window.clipboardData.getData("Text"); 105 | _insertTextAtCursor(text); 106 | } 107 | }); 108 | }; 109 | var _selectAll = function(input, collapseToEnd){ 110 | // select all text in contenteditable 111 | // see http://stackoverflow.com/a/6150060/145346 112 | var range = document.createRange(); 113 | range.selectNodeContents(input); 114 | if(collapseToEnd) range.collapse(false); // total hack 115 | var selection = window.getSelection(); 116 | selection.removeAllRanges(); 117 | selection.addRange(range); 118 | }; 119 | var _unselectAll = function(){ 120 | var selection = window.getSelection(); 121 | selection.removeAllRanges(); 122 | }; 123 | var _fixStringInput = function(input){ 124 | 125 | // Empty? Fix that! 126 | if(input.innerText==""){ 127 | input.innerHTML=" "; // Is it empty? Let's fix that. 128 | _selectAll(input); 129 | } 130 | 131 | // Line breaks? HECK NO! 132 | if(input.innerHTML.search("
")>=0){ 133 | input.innerHTML = input.innerHTML.replace(/(\)+/g," "); 134 | _selectAll(input, true); 135 | } 136 | 137 | }; 138 | var _blurOnEnter = function(input){ 139 | input.addEventListener('keypress', function(event){ 140 | if(event.which===13){ 141 | event.preventDefault(); 142 | input.blur(); 143 | } 144 | }); 145 | }; 146 | 147 | // Find a unique ID within an object 148 | var _generateUID = function(obj){ 149 | var num = 0; 150 | var id; 151 | do{ 152 | //id = Math.floor(Math.random()*1000000)+""; // a MILLION random IDs, hopefully don't go over 153 | id = "id"+num; // linear time but who cares 154 | num++; 155 | }while(obj[id]); 156 | return id; 157 | }; 158 | 159 | // Make this an array, if not already 160 | var _forceToArray = function(thing){ 161 | if(Array.isArray(thing)) return thing; 162 | else return [thing]; 163 | }; 164 | 165 | // Generate a deterministically pseudo-random color from an ID 166 | // TODO: not looking like crap. same luminance, etc. 167 | //var _generateColor = function(obj){ }; 168 | 169 | // Remove all children from a DOM 170 | var _emptyDOM = function(node){ 171 | while(node.hasChildNodes()) node.removeChild(node.lastChild); 172 | }; 173 | 174 | // Get Query Param 175 | // thx to https://stackoverflow.com/a/901144 176 | var _getParameterByName = function(name, url) { 177 | if (!url) url = window.location.href; 178 | name = name.replace(/[\[\]]/g, "\\$&"); 179 | var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), 180 | results = regex.exec(url); 181 | if (!results) return null; 182 | if (!results[2]) return ''; 183 | return decodeURIComponent(results[2].replace(/\+/g, " ")); 184 | } 185 | 186 | //////////////////////////// 187 | // Good Color Shtuff /////// 188 | // thx to: https://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately/17243070#17243070 189 | //////////////////////////// 190 | 191 | /* accepts parameters 192 | * h Object = {h:x, s:y, v:z} 193 | * OR 194 | * h, s, v 195 | */ 196 | function _HSVtoRGB(h, s, v) { 197 | var r, g, b, i, f, p, q, t; 198 | if (arguments.length === 1) { 199 | s = h.s, v = h.v, h = h.h; 200 | } 201 | h /= 360; // convert, yo. 202 | i = Math.floor(h * 6); 203 | f = h * 6 - i; 204 | p = v * (1 - s); 205 | q = v * (1 - f * s); 206 | t = v * (1 - (1 - f) * s); 207 | switch (i % 6) { 208 | case 0: r = v, g = t, b = p; break; 209 | case 1: r = q, g = v, b = p; break; 210 | case 2: r = p, g = v, b = t; break; 211 | case 3: r = p, g = q, b = v; break; 212 | case 4: r = t, g = p, b = v; break; 213 | case 5: r = v, g = p, b = q; break; 214 | } 215 | return [Math.round(r*255), Math.round(g*255), Math.round(b*255)]; 216 | } 217 | function _HSVToRGBString(h,s,v){ 218 | if(arguments.length===1) { 219 | s=h[1], v=h[2], h=h[0]; // cast to different vars 220 | } 221 | var rgb = _HSVtoRGB(h,s,v); 222 | return "rgb("+rgb[0]+","+rgb[1]+","+rgb[2]+")"; 223 | } 224 | // well, "random" 225 | var _randomHSVIndex = 0; 226 | var _randomHSVArray = [ 227 | [0, 0.6, 1.0], 228 | [30, 0.8, 1.0], 229 | //[120, 0.9, 0.9], 230 | [210, 0.8, 1.0], 231 | [260, 0.7, 1.0], 232 | [310, 0.6, 1.0] 233 | ]; 234 | function _randomHSV(){ 235 | var hsv = _randomHSVArray[_randomHSVIndex]; 236 | _randomHSVIndex = (_randomHSVIndex+1)%_randomHSVArray.length; 237 | //return _HSVToRGBString(hsv[0], hsv[1], hsv[2]); 238 | return hsv; 239 | } 240 | function _forceToRGB(color){ 241 | if(Array.isArray(color)){ 242 | color = _HSVToRGBString(color[0], color[1], color[2]); // HSV 243 | } 244 | return color; 245 | } 246 | 247 | -------------------------------------------------------------------------------- /src/lib/lz-string.min.js: -------------------------------------------------------------------------------- 1 | var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;ne;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;ie;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString); 2 | -------------------------------------------------------------------------------- /src/lib/watch.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * DEVELOPED BY 3 | * GIL LOPES BUENO 4 | * gilbueno.mail@gmail.com 5 | * 6 | * WORKS WITH: 7 | * IE8*, IE 9+, FF 4+, SF 5+, WebKit, CH 7+, OP 12+, BESEN, Rhino 1.7+ 8 | * For IE8 (and other legacy browsers) WatchJS will use dirty checking 9 | * 10 | * FORK: 11 | * https://github.com/melanke/Watch.JS 12 | * 13 | * LICENSE: MIT 14 | */ 15 | "use strict";!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):(window.WatchJS=a(),window.watch=window.WatchJS.watch,window.unwatch=window.WatchJS.unwatch,window.callWatchers=window.WatchJS.callWatchers)}(function(){function x(){w=null;for(var a=0;a0)for(var f=0;f0)&&p(a[b],c,void 0!==d?d-1:d),D(a,b,c,d),e&&(void 0===d||d>0)&&R(a,b,c,d)))},s=function(){f(arguments[1])?t.apply(this,arguments):h(arguments[1])?u.apply(this,arguments):I.apply(this,arguments)},t=function(a,b){if(!(a instanceof String)&&(a instanceof Object||h(a)))if(h(a)){for(var c=["__watchall__"],d=0;d0?arguments[0]:void 0;return i=b.apply(a,arguments),"slice"!==c&&("pop"===c?(h=i,e=a.length):"push"===c?e=a.length-1:"shift"===c?h=i:"unshift"!==c&&void 0===g&&(g=i),d.call(a,e,c,g,h)),i})},H=function(a,b){if(f(b)&&a&&!(a instanceof String)&&h(a))for(var d,c=F.length;c--;)d=F[c],G(a,a[d],d,b)},I=function(a,b,c){if(b){if(a.watchers[b])if(void 0===c)delete a.watchers[b];else for(var d=0;d0)for(var a=0;a