diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..6813c03 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,122 @@ +// Gruntfile.js +module.exports = function(grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + compass: { + dev: { + options: { + http_path: '/', + imagesDir: 'img', + sassDir: 'sass', + cssDir: 'stylesheets', + environment: 'development' + } + }, + prod: { + options: { + http_path: '/', + imagesDir: 'img', + sassDir: 'sass', + cssDir: 'stylesheets', + environment: 'production' + } + } + }, + + shell: { + jekyllServe: { + command: "LANG='en_US.UTF-8' LC_ALL='en_US.UTF-8' jekyll serve --safe --trace --baseurl ''" + }, + jekyllBuild: { + command: "LANG='en_US.UTF-8' LC_ALL='en_US.UTF-8' jekyll build --safe --trace" + } + }, + + // watches sass and jekyll + watch: { + compass: { + files: [ + 'sass/*.{scss,sass}', + 'sass/imports/*.{scss,sass}' + ], + tasks: ['compass:dev'], + options: { + atBegin: true + } + }, + autoprefix: { + files: [ + 'stylesheets/screen-unprefixed.css' + ], + tasks: ['autoprefixer:target'], + options: { + atBegin: true + } + }, + site: { + files: [ + '_includes/*.{html,md}', + '_layouts/*.{html,md}', + '_posts/*.{html,md,markdown}', + '_config.yml', + 'img/*.{jpg,gif,png,svg}', + 'js/*.js', + 'stylesheets/*.css', + 'speakers/*.{html,md}', + 'sponsors/*.{html,md}', + 'speakers/posts/*.{html,md}', + 'sponsors/posts/*.{html,md}', + '*.{html,md}', + ], + tasks: ['shell:jekyllBuild'], + options: { + interrupt: true, + atBegin: true + } + } + }, + svgstore: { + options: { + prefix: 'svg-', + svg: { + style: 'display: none;' + }, + symbol: { + fill: 'currentColor', + } + }, + default : { + files: { + '_includes/svg-sprite.svg': ['svg/*.svg'], + } + } + }, + autoprefixer: { + target: { + src: 'stylesheets/screen-unprefixed.css', + dest: 'stylesheets/screen.css' + } + }, + concurrent: { + target: { + tasks: ['shell:jekyllServe', 'watch:site', 'watch:compass', 'watch:autoprefix'], + options: { + logConcurrentOutput: true, + limit: 5 + } + } + } + }); + + grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-contrib-compass'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-concurrent'); + grunt.loadNpmTasks('grunt-svgstore'); + grunt.loadNpmTasks('grunt-autoprefixer'); + + grunt.registerTask('default', ['svgstore', 'concurrent']); + + grunt.registerTask('release', ['svgstore', 'compass:prod', 'autoprefixer:target', 'shell:jekyllBuild']); + +}; \ No newline at end of file diff --git a/README.md b/README.md index 17cdfb7..0c7d4b0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ -# 2017.jsconf.eu -Website for JSConf EU 2017 +2015.jsconf.eu +============== + +### Develop +grunt + +### Deploy +compass clean +grunt release diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..03a05db --- /dev/null +++ b/_config.yml @@ -0,0 +1,14 @@ +exclude: [config.rb, sass, Gruntfile.js, node_modules, Makefile, package.json, svg] +safe: true +lsi: false +name: JSconf.eu +url: http://2015.jsconf.eu +twitter_username: jsconfeu +baseurl: + +speaker_map_base_url: "http://maps.googleapis.com/maps/api/staticmap?style=hue:0xfe006b&size=640x163&scale=2&sensor=false&zoom=5&visual_refresh=1&markers=color:" +speaker_index_base_url: "http://maps.googleapis.com/maps/api/staticmap?style=hue:0xfe006b&size=514x324&sensor=false&visual_refresh=1&markers=color:" +news_map_base_url: "http://maps.googleapis.com/maps/api/staticmap?size=640x390&sensor=false&visual_refresh=1&markers=color:" +schedule_url: "https://docs.google.com/spreadsheet/pub?key=0AoIOxKkr6fGqdGtHdWJqZFBJUnF1bEt3RVBsQUxINVE&single=true&gid=1&output=html" + +permalink: pretty diff --git a/_includes/cta.html b/_includes/cta.html new file mode 100644 index 0000000..34ce2e8 --- /dev/null +++ b/_includes/cta.html @@ -0,0 +1,6 @@ + + + + + +Sponsoring diff --git a/_includes/debug.html b/_includes/debug.html new file mode 100644 index 0000000..5567c52 --- /dev/null +++ b/_includes/debug.html @@ -0,0 +1,9 @@ +
+ site url:{{ site.url }}
+ page url:{{ page.url }}
+ page id:{{ page.id }}
+ page date:{{ page.date }}
+ node url:{{ node.url }}
+ twitter name: {{ site.twitter_username }}
+ page pattern: {{ page.pattern }}
+
diff --git a/_includes/facepile.md b/_includes/facepile.md new file mode 100644 index 0000000..ef96199 --- /dev/null +++ b/_includes/facepile.md @@ -0,0 +1,21 @@ +{% assign speaker_list = speakers | reverse %} +
+ {% for post in speaker_list %} + + {% if post.image %} + {{ post.speaker }} 0 %}{% if post.image.height > 0 %}width="{{ post.image.width | times:80.000000001 | divided_by:post.image.height }}"{%endif%}{%endif%} + /> + {% else %} + {{ post.speaker }} + {% endif %} + {% if post.image2 %} + {{ post.speaker }} 0 %}{% if post.image.height > 0 %}width="{{ post.image.width | times:80 | divided_by:post.image.height }}"{%endif%}{%endif%} + /> + {% endif %} + + {% endfor %} +
+ diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..9704410 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,45 @@ +{% assign current = page.url | downcase | split: '/' %} + + + + + + + + + \ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..5706f71 --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,47 @@ + + + {{ page.title }} + + + + + + + + + {% if page.image %} + + {% else %} + + {% endif %} + + {% if page.video %} + + {% endif %} + {% assign image_filename="/img/js.eu.png" %} + {% if page.image %} + {% assign image_filename=page.image %} + {% if page.image.filename %} + {% assign image_filename=page.image.filename %} + {% endif %} + {% endif %} + + + + + {% if page.twitter %} + + {% else %} + + {% endif %} + + + + {% if page.description %} + + + + {% else %} + + {% endif %} + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..80457da --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,56 @@ +{% if startpage %} + + + +{% else %} + +{% endif %} diff --git a/_includes/image.md b/_includes/image.md new file mode 100644 index 0000000..52682d0 --- /dev/null +++ b/_includes/image.md @@ -0,0 +1,9 @@ + +{% comment %} +Provide variables called image_url & image_alt +{% endcomment %} +
+ {{ image_alt }} +
diff --git a/_includes/location.md b/_includes/location.md new file mode 100644 index 0000000..ced5919 --- /dev/null +++ b/_includes/location.md @@ -0,0 +1,16 @@ +{% assign map_url="https://maps.google.com/maps?q=Radialsystem+V,+Holzmarktstra%C3%9Fe+33,+Berlin,+Germany&hl=en&ie=UTF8&ll=52.510527,13.428726&spn=0.036671,0.077677&sll=52.510893,13.428555&sspn=0.073341,0.155354&hq=Radialsystem+V,+Holzmarktstra%C3%9Fe+33,+Berlin,+Germany&t=m&z=14" %} + + +
+ Radialsystem V, + + + Holzmarktstraße 33, + 10243 Berlin, + Germany + + +
+ +{% assign map_center="52.51057,13.42873" %} +{% include map_image.md %} diff --git a/_includes/map.md b/_includes/map.md new file mode 100644 index 0000000..481f0c8 --- /dev/null +++ b/_includes/map.md @@ -0,0 +1,9 @@ + +{% comment %} +Make a variable called map_url. Just copy the normal GMaps share +link. +{% endcomment %} +
+ +
\ No newline at end of file diff --git a/_includes/map_image.md b/_includes/map_image.md new file mode 100644 index 0000000..793f2bc --- /dev/null +++ b/_includes/map_image.md @@ -0,0 +1,9 @@ +{% comment %} +Make variables called map_url and map_center (coords). Just copy the normal GMaps share +link. +{% endcomment %} +
+ + + +
\ No newline at end of file diff --git a/_includes/nav-social.html b/_includes/nav-social.html new file mode 100644 index 0000000..48c3c9f --- /dev/null +++ b/_includes/nav-social.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/_includes/nav.html b/_includes/nav.html new file mode 100644 index 0000000..e4c1482 --- /dev/null +++ b/_includes/nav.html @@ -0,0 +1,15 @@ +{% assign current = page.url | downcase | split: '/' %} + + diff --git a/_includes/post-header.html b/_includes/post-header.html new file mode 100644 index 0000000..359eb19 --- /dev/null +++ b/_includes/post-header.html @@ -0,0 +1,16 @@ +
+ {% if page.date %} + + {% if page.dateOverride %} + {{ page.dateOverride }} + {% else %} + {{ page.date | date_to_long_string }} + {% endif %} + + {% endif %} +

+ + {{ page.title }} + +

+
diff --git a/_includes/schedule.md b/_includes/schedule.md new file mode 100644 index 0000000..310a05e --- /dev/null +++ b/_includes/schedule.md @@ -0,0 +1,44 @@ + +

Looking for the talk schedule? Links to various versions are here.

+ +

+ For even more JavaScript-related goodness, make sure to check out the week-long jsfest.berlin in the days around JSConf. +

+ +

+ All events on this page are included in the ticket price. Don't miss the parties and our Relax.js brunch on Monday! On the conference days we're serving excellent breakfast and lunch and a full dinner on Saturday. +

+ + diff --git a/_includes/speaker.md b/_includes/speaker.md new file mode 100644 index 0000000..bc61ed0 --- /dev/null +++ b/_includes/speaker.md @@ -0,0 +1,125 @@ +{% assign image_link="" %} +{% if page.website != "" %} + {% assign image_link=page.website %} + {% assign website=page.website %} +{% elsif page.twitter != "" %} + {% assign website=page.twitter %} +{% elsif page.gplus != "" %} + {% assign website=page.gplus %} +{% elsif page.github != "" %} + {% assign website=page.github %} +{% endif %} +{% if overview %} + {% assign image_link=page.url %} +{% endif %} + +{% include speaker_map.md %} + +
+
+ +
+ {% if overview %} +
+ {% else %} + {% if page.video %} +
+ {% else %} +
+ {% endif %} + {% endif %} + +
+

+ {{post.overview}} + + + {{ page.speaker }}:
+ {{ page.talk }} +
+
+

+
+ {% if page.image %} + {{ page.speaker }} + {% endif %} +
    + {% if page.from != "" %}
  • + {{ page.from != "" }} +
  • {% endif %} + {% if page.website != "" %}
  • {% endif %} + {% if page.github != "" %}
  • {% endif %} + {% if page.twitter != "" %}
  • {% endif %} + {% if page.gplus != "" %}
  • {% endif %} + {% if page.github2 %}
  • {% endif %} + {% if page.twitter2 %}
  • {% endif %} +
+
+
+ +
+
+ + {{ page.description | markdownify }} + + {% if page.video %} + + {% if overview %} + + {% else %} +
+ + {% assign video_id=page.video %} + + {% include youtube.md %} + +
+ {% if page.slides %} + + » {% if page.slides_text %}{{ page.slides_text }}{% else %}Slides{% endif %} + + {% if page.slides2 %} + | + » {% if page.slides_text2 %}{{ page.slides_text2 }}{% else %}Slides{% endif %} + + {% endif %} + {% else %} + Ping us if you have a link to the slides. + {% endif %} + {% if page.transcript %} + » Jump to Transcript + {% endif %} +
+
+ + {% endif %} + {% endif %} +
+ +
+ + {% unless overview %} + {% if page.transcript %} +

Transcript

+
+ {% include {{page.transcript}} %} +
+ Edit transcript via pull request. +
+ + {% endif %} + {% endunless %} +
+ +
+ diff --git a/_includes/speaker_map.md b/_includes/speaker_map.md new file mode 100644 index 0000000..1392eef --- /dev/null +++ b/_includes/speaker_map.md @@ -0,0 +1,4 @@ +{% if page.from != "" %} +{% comment %}Use x-img to avoid loading them all on the overview {% endcomment %} + +{% endif %} \ No newline at end of file diff --git a/_includes/sponsors-footer.html b/_includes/sponsors-footer.html new file mode 100644 index 0000000..8485a7e --- /dev/null +++ b/_includes/sponsors-footer.html @@ -0,0 +1,77 @@ +
+
+
+

Sponsorship

+ + + {% assign sponsors=site.tags.sponsor %} + + +
+
+
diff --git a/_includes/svg-sprite.svg b/_includes/svg-sprite.svg new file mode 100644 index 0000000..ea40786 --- /dev/null +++ b/_includes/svg-sprite.svg @@ -0,0 +1,19 @@ +jsconfeu-googleplus jsconfeu-heart jsconfeu-logomarkjsconfeu-map-marker jsconfeu-smilie jsconfeu-twitter jsconfeu-youtube \ No newline at end of file diff --git a/_includes/transcripts/tim-messerschmidt.txt b/_includes/transcripts/tim-messerschmidt.txt new file mode 100644 index 0000000..cd78d09 --- /dev/null +++ b/_includes/transcripts/tim-messerschmidt.txt @@ -0,0 +1,423 @@ +Thank you. I hope you really enjoyed the lunch. + +It is one of the conferences where you can see the money really goes into the benefit of the attendees. + +Thanks for attending my talk. It is sometimes thankful to have the talk after the lunch. I hope you are not falling asleep. + +This is going to be as said, how Paypal transforms into a better company. With nodes. And a lot of other cool things. + +I hope that you are getting something out of it. I try to leave some time for Q&A. Let's see. + +Most good stories talk with a little bit of background. Like one of the movies. Where you go back in time. If you go back in time it shows where the characters come from and why the current situation exists. + +Paypal got founded in 1998. Back then everybody had Pda-pagers. Anyone ever owned a Palm? It used the communicate through infrared. + +A few guys, including the investor, thought it would be awesome if you could send money around using infrared. It didn't work out. They started new products. In 1999 they came up with a product, Paypal. + +They realised sending money is not easy on the web. + +In 2000 a company, acquired them. And then in 2002 they got acquired by eBay. A lot of different history. + +As long as they exist, being one of the oldish company in Silicon Valley, they had a bunch of different engineers. Sometimes finish things. + +The technology was a kind of mess. + +If you think about this. I imagine it is greying out. Thinking about Archibalt. + +The traditional applications that Paypal had were 2. + +The first stack was traditional C++ stack. A lot of stuff that we do is processing heavy. Then there is Java. Which used to do a lot of the web apps hosting, based on Java, Spring. + +And it was kind of effective for a while. And our teams basically knew how to scale those applications. You cannot scale every application in infinity. Nowadays people don't like to touch those things anymore. + +Anybody looks like this. People are disguisted. C++, Java, we don't want to go for. I used be a Java engineer. So please bear with me. + +This is Paypal in 2002. We used to have this big problem where we had deployments every 6 weeks. + +And now if you imagine, there is the number saying, we have 100 million users. It changes. + +We have to wait 6 weeks to deploy things. + +It was not just the website that got deployed. + +Also applying to our Api. If something went wrong in the Api you had to wait 6 weeks. + +Going forward in the modern engineering culture. Where we do continuous deployment and education and so on. + +This was really awkward for the engineers. + +They realised it is painful to work on the product. + +On the one hand we used to have the production stack, 6 weeks of deployment. + +On the other hand we have the prototyping stack. + +That's where the developers had modern environments. + +They came up with new functionality. + +They used modern toolkits like Bootstrap. + +And then they had to roll it out in the regular stack. They had to do a port. + +Instead of taking the Java script template and the Css, they had to come up with ways to bring it to the stack. I'll go there in a second. + +We had user testing. And then we had to wait 6 weeks again to roll the features out. + +We don't really interact with full stack engineers. + +We had the traditional Java backend guy and the web developer. Those guys didn't talk to eachother. + +A lot of the reasons lead to huge problems obviously. + +The situation we were in at the moment was kind of frustrating. + +We had the C++ stack with stylesheets for Html. + +Most was based on Spring. + +Then we had this cool prototyping stack that I usually justify as Nodes. With Js templates. We tried out of the languages. And at one moment actually the big decision game we should go for Dust. + +Heavily driven by Linkedin. People at Paypal adopted it, liked it. + +I will go into it in a few minutes. + +It is not about the templating language in general. It is more about Javascript templates. + +We had this big issue with the Java stack. + +We were running Jsp. We were writing our Html and Java script in Java. + +It was not Jsp pages that we rendered. + +Big problem is that you end up with a lot of different programming and scripting and markup languages in 1 file. + +You can have Html, Css, Javascript and Java. + +It was a big mess. We had to get rid of that. + +A few people came up with a UI toolkit. Spartan. It was a solution based on Spring. + +Nowadays we would do it differently. + +Big issue with proprietary software is, when you bring in new engineers. + +They have to learn about the frameworks. We had the deployment cycles. + +People were not happy. + +Now, there was a big push into open source. + +A lot of great new engineers came into the company. They worked for other companies. + +Open source might be valuable. + +3 reasons why you might want to go for open source. Less rampup time for the engineers. They can work with the tools they know anyway. + +They are more efficient on doing work on the toolsets they know. + +The big issue where engineers have to focus on setting up environments and setting up the project and all that stuff instead of building the app. + +You want that your engineers can do what you want to achieve and not the setup work. That is less efficient and you waste time. + +The last reason is, proprietary solutions are seldom better. There are open source solutions. Why don't you go for that and try to bring benefit in that. + +We came up with rapid deployment and development cycles and everything was great, right? + +On the production stack, we still had to go with the old stuff. + +We ended up with a push into going in a new production stack. + +And this all was before we introduced. + +We had bootstrap and Javascript templating. + +If you want to go for the regular stacks. We have C++ and Java. What we did was, we injected the C++ engine in the stack. + +It was easy. The project Delorean, from Back to the Future. That was the car. + +It was a fit. + +And then there is Mozilla's Rhino. A Java script in Java. To run the different templates. + +And looking at that, basically we now had a few different environments. + +Prototyping, we went with Dust and it was great. + +Since we settled on using Dust on the Java stack we leveraged Rhino. + +And that was great for us. It helped us to not leave the old stacks behind. + +If you want to push for new apps, it is an easy choice to say, we want to go for Node. And we leave the old stuff behind. + +Since we had so many different applications, it was not something we could do. + +We wanted to try out Nodes in production. + +This one thought, wish came from a single project. + +Paypal checkout page, you might know when you buy something online, generates 3.5 billion dollars every year. + +We thought, why not start at the core of Paypal. That drives the revenue. + +A project named af Hermes, got born. + +And Hermes is the god of Agility and mobility. + +We started with a simple stack that we introduced at the beginning of that week. + +We had nodes running, bootstrap for lean UI. + +And we used other open source. + +And the first prototype of a new checkout platform was born in 3 days. + +People were excited. Because we didn't have to fill out the frameworks. It was easier for new engineers to get involved. It was great. + +Then we thought, we should try this with another project. The paper wallet app. + +If you go to Paypal, you see the balance and funding. That is the first product that we did. + +And, it is actually kind of risk to go for a new platform in production if you are not sure that it is running. + +What we did is, we first had this initial project, checkout page. People were convinced. + +We had 2 teams starting with 2 projects. A traditional Java team and was well trained to build apps on the stack. + +The second team was only 2 Java script engineers. + +And they were supposed to give it a try with the same kind of experience. + +We started in January 2013. And a Java team used the existing components. + +In March, 2 months after, the environment for Node was setup. We had key stores, logging services, we knew how to connect the databases. + +That's what the 2 engineers did on Javascript. + +In June they met crossroads. + +One team, 5 Java engineers started with the existing services. The other team was just 2 Node engineers. + +So we ran a few functionality tests and they passed. We ran a few benchmarks. + +I don't want to bore you with numbers. + +We have a bunch of different requests. + +This is the Java stack. The Java stack averages at 11 pages per second, starting with 1 user per request. Then we go higher, upto 15 users that request at the same time. + +This is for production hardware we are using. + +Then we had the Node stack. The node stack serves double the requests. And the same happens on one core at that moment. + +It was a very young new stack. + +It was barely optimized and more efficient straight away. + +You cannot compare apples to peaches. It is not fair to compare. One is using the proprietary Java stack, the other not. + +For us it was a good sign to go ahead with this. + +A few more numbers we had, the code was lean. We had to write less code. And we needed less engineers. + +We were convinced to go ahead. + +Our Java engineers were not so negative about it. Started to contribute to parallel workstreams. + +And got some more Node and Javascript skills. + +The new stack, the Paypal changed over. + +What we have is C++, we have Java, and all the new apps running Nodes. + +And I think the biggest step in the direction was decoupling the UI first. + +If your application layer and UI layer are tightly integrated, it is hard to reiterate and go ahead and start a new stack. + +Now that we are able to run Dust on the different stacks, we can basically bring all the new features to all the stacks. Which is amazing for us. Since we do Javascript templating, we have the benefit we can render on the client and server side. + +We use that a lot. If you have a Paypal account. The initial page is on the server side. For dynamic content. We render it ahead, or when the client loads it up. + +So, one of the benefits of Node is the Node package manager. We use it heavily to distribute the internal services. + +If we want to use the services, anything that interacts with the C++ stack, we can go ahead and can install npm modules. We are using a proxy which I show in a few seconds. + +We had the situation, we were able to start and go ahead and use Node and we had Dust and everything was great. + +For us, this was the moment to release the Kraken. The animation you saw, took me about half an hour. + +So, bear with me. + +With Kraken, we actually had this one situation. + +Where a lot of different teams have been working on Node, leveraged express, a lot of ways for the service. + +And best practices. Kraken is a suite on top of Express. Not a whole framework. I would not call it framework. + +It comes with sensible defaults, that make sense. + +As I said, we used Dust for templating. It doesn't have to be Dust. + +If you like Jade or other things you can use that. + +And originally it was made to make middle to corporate scale companies. To make it faster. + +A lot started using Kraken. + +Because they didn't have to care about security and a lot of other stuff. + +It taps into middleware. + +The reason is, as I said, lots of different teams at Paypal are working on the same kind of stacks. And different apps. + +If you have a lot of teams building apps, you will realise, everybody configures frameworks differently. + +If you have engineers moving from 1 project into another they are lost. Configuration is made different. Some might use some json files. Some methods to initialise things. It was a big mess. + +We tried to resolve that by bringing best practices into that. + +Now I said it before, they have more time to build projects. Setting up the environments. That is really good for us. + +The project structure is kind of opiniated. We try to push for clear controllers. We use that by having different frameworks. + +We use backbone and a lot of other frameworks. + +It was too heavy for us. We went ahead and did our own structure and it works well for us. + +We have those templates, can be render both server and client side. With unitesting. + +And what is interesting about Kraken. We move the logic away from the initial index js file into the different controllers. + +This is something that you can see, is also present. + +Express 3 didn't have that. And they actually moved it to Express 4. They realised it helps to have cleaner files and better structure. + +The best for modules. There is a whole different modules. Makara is used to do internationalisation, localisation, specialisation in your apps. + +Lusca comes with security. Adaro. And Kapa is the proxy. + +It is quite easy. It is our own kind of format with property files. + +You load up bundles. You can do it on the fly or use Kraken. + +You don't have to use Kraken to use all of the modules. + +We have a provider that loads for various locates. + +And prepares the values. + +The property files are not difficult. It is not json. + +You can define multiple values. + +It is useful for us. You don't have to use this format. But it is pretty good. It also has subkeys. + +If you want to use this, it heavily taps into Dust. + +One of the good things about it is, if you switch the locale, it changes for you as well. + +By levering the folder structure. + +Different keys in different languages get resolved for you, which is handy. + +Down beload with the head attack. + +Indexes my controller. My localisation is bound to the controller. And loads in the file for me. + +Which is handy for me. + +If I want to use Adaro. I have Dust as the view engine for Express. + +I can use any other view engine. It is just Dust for us. A lot of engines have a lot of logic. + +Try to do a lot of processing and calculation. + +We tend to move that into the controller logic. + +So, you basically have a layout. What happens is, nothing magic. + +Some cool stuff like sections. Your view context in that. + +Different modules can be directly. + +It comes with conditionals. Not too much logic. + +Just saying, if a content is there, show it or don't show it. + +It doesn't try to be that smart. + +Now, security is something that I think is interesting. + +Lots of frameworks come with security measurements and lots of ways to make your app secure. + +A lot of the frameworks don't with sensible defaults. + +Quite often they tend not to do that. + +One of the biggest features we support is cross site request forgery. + +And it says, if you want to manipulate my data with post requests, you have to provide a token to make sure it is the app and not someone else. + +Click jacking. I'm framing your website in another website. Can be prevented by setting up the same origin header. Output escaping against crosssite scripting. + +If you have attended last year's conference, you might have seen it. + +It is awesome stuff. + +Configuration via Json. You say, I want that feature, i don't want to have that feature, that is my setting. + +Or you can go through the method calls one by one. You don't have to use orders. + +I always mention. You have to provide a token. It is a hidden input field you provide over to the app. Your app manipulating the data. + +Npm proxy Kappa is easy to install. + +You can go for locally or globally. That's what we use. The database access. + +Logging monitoring. Based on Npm delegate. + +If you look at the configuration, it is a folder. + +In that folder you have a bunch of different files. + +You can setup environments. You can say, this is my staging, my development, my test environment. + +It is pretty much easy to setup. + +In this case you see the view engines. And you can do that for all the kind of different settings for Kraken. + +If you want to setup Kraken with passports, you could go and really just configure it by providing options to it. + +And this is just the index Js file you would use for that. + +Now, the nice thing is, you don't need to mess around the life cycle. Figure out when is the module being loaded and why. + +Tap into different events, like middleware. + +After the session is loaded, I make sure I can use the passport. I make sure it is civilized. + +And that's it. It provides a clean environment. To make sure they are nicely and visible. It helps a lot. + +Since we wanted to make sure that people don't have to setup this manually, it comes with a generator. + +You do Npm install generator kraken. And that's it. + +It is really easy to setup. It does a lot of scaffolding for you. + +Which is really useful for all of us I guess. + +Kraken nowadays is in 1.X. Which came with the Express 4 push. + +One of the features that we will focus on heavily is going to be specialisation. Not going to be used for AV testing. But also mobile device versus desktop. It allows us to do a lot of logic. + +And, well, I can summarize for us it has been a really good thing to introduce Node. + +We have the smaller teams. With a lot of engineers, that are able to move faster. Write the applications more efficiently. We have Dust as one UI layer. We don't have to mess around with different templates. It was the first push into open source. It really helped to make sure we don't make proprietory software for Paypal. + +But useful for everybody. + +All the new apps are going to be written on Nodes purely. + +Thanks for attending my talk. I'm open for questions. + +(applause) diff --git a/_includes/video.md b/_includes/video.md new file mode 100644 index 0000000..f30bc35 --- /dev/null +++ b/_includes/video.md @@ -0,0 +1,6 @@ +{% if page.video %} +
+ +
+{% endif %} \ No newline at end of file diff --git a/_includes/vimeo.md b/_includes/vimeo.md new file mode 100644 index 0000000..0cc1e92 --- /dev/null +++ b/_includes/vimeo.md @@ -0,0 +1,8 @@ + +{% comment %} +Provide variable called video_id +{% endcomment %} +
+ +
\ No newline at end of file diff --git a/_includes/youtube.md b/_includes/youtube.md new file mode 100644 index 0000000..5259511 --- /dev/null +++ b/_includes/youtube.md @@ -0,0 +1,8 @@ + +{% comment %} +Provide variable called video_id +{% endcomment %} +
+ +
diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..f54d6ab --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,18 @@ + + + + {% include head.html %} + + + {% include svg-sprite.svg %} + + {% include debug.html %} + + {{content}} + + {% include sponsors-footer.html %} + + {% include footer.html %} + + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..0c7d798 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,18 @@ + + + + {% include head.html %} + + + {% include svg-sprite.svg %} + + {% include debug.html %} + + {{content}} + + {% include sponsors-footer.html %} + + {% include footer.html %} + + + diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..e22f1c1 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,22 @@ +--- + layout: sub-page + title-short: News +--- + +
+ +
+ +
+
+ +
+
+ +
+ {{content}} +
+ +
+ +
diff --git a/_layouts/simple-page.html b/_layouts/simple-page.html new file mode 100644 index 0000000..35e75c7 --- /dev/null +++ b/_layouts/simple-page.html @@ -0,0 +1,39 @@ +--- +layout: default +--- + +{% include header.html %} + +
+ +
+ +
+

+ {{ page.title-short }} +

+
+
+
+ +
+
+ +
+ +
+ +
+ +
+
+ {{content}} +
+ +
+ +
diff --git a/_layouts/speaker-page.html b/_layouts/speaker-page.html new file mode 100644 index 0000000..2b093c8 --- /dev/null +++ b/_layouts/speaker-page.html @@ -0,0 +1,14 @@ +--- + layout: sub-page + title-short: Speakers +--- + +
+ +
+ + {{content}} + +
+ +
diff --git a/_layouts/sponsor-page.html b/_layouts/sponsor-page.html new file mode 100644 index 0000000..71d0910 --- /dev/null +++ b/_layouts/sponsor-page.html @@ -0,0 +1,34 @@ +--- + layout: sub-page + title-short: Sponsors +--- + +
+ + + +
diff --git a/_layouts/start.html b/_layouts/start.html new file mode 100644 index 0000000..c467193 --- /dev/null +++ b/_layouts/start.html @@ -0,0 +1,9 @@ +--- +layout: home +--- + +{% assign startpage=true %} + +{% include header.html %} + + {{content}} diff --git a/_layouts/sub-page.html b/_layouts/sub-page.html new file mode 100644 index 0000000..9699446 --- /dev/null +++ b/_layouts/sub-page.html @@ -0,0 +1,26 @@ +--- +layout: default +--- + +{% include header.html %} + +
+ +
+ +
+

+ {{ page.title-short }} +

+
+
+
+ +
+
+ +
+ +
+ +{{content}} \ No newline at end of file diff --git a/_posts/2015-01-28-ticket-schedule.md b/_posts/2015-01-28-ticket-schedule.md new file mode 100644 index 0000000..3cbbbef --- /dev/null +++ b/_posts/2015-01-28-ticket-schedule.md @@ -0,0 +1,32 @@ +--- +layout: post +title: Ticket Sale for JSConf EU 2015 +category: news +tags: news +figure: /img/what-next.jpg +dateOverride: 28 January 2015 +--- + +{% include post-header.html %} +Mark your calendars: The Ticket Sale for JSConf EU 2015 will start on Sunday, February 1st at 18:00 CET. + + +JSConf EU is a professional, not-for-profit, labour-of-love conference for the JavaScript community that you don’t want to miss out on – Read up on the [JSConf EU experience and what a ticket buys you]({{ site.baseurl }}/why/ "WHY JSConf EU"). + +### Diversity Support Tickets + +[Expanding on our program from last year](http://2014.jsconf.eu/news/2014/08/15/diversity-tickets.html) we are again offering [Diversity Support Tickets](/diversity-tickets). As last year you are purchasing a ticket for yourself and help another person of the conference's choosing to be able to attend the event. + +To make the program even more accessible we now offer a wider range of "Support Options". Starting with paying 25% of a ticket to paying for a full ticket. We thank you in advance for your generosity and awesomeness and looking forward to a more diverse JSConf EU than ever before. + +### Additional Information + +- Price: 575€ + VAT + Fees **699€**. +- We will be opening ticket sales in multiple batches. +- Ticket sales will be done through [Tito](https://tito.io/jsconfeu/jsconf-eu-2015). +- You won’t need a Paypal account, but you can use one! (The other option is Stripe.) +- You will be able to buy one ticket per order. +- We will sell Combo Tickets with [CSSConf EU](http://2015.cssconf.eu) as well. +- [Reject.js](http://rejectjs.org) tickets are sold separately. +- [How we spend your money](http://2013.jsconf.eu/news/2013/06/15/how-we-spend-your-money.html). + diff --git a/_posts/2015-02-16-full-ticket-schedule.md b/_posts/2015-02-16-full-ticket-schedule.md new file mode 100644 index 0000000..7a487e7 --- /dev/null +++ b/_posts/2015-02-16-full-ticket-schedule.md @@ -0,0 +1,39 @@ +--- +layout: post +title: Full Ticket Schedule for JSConf EU 2015 +category: news +tags: news +figure: /img/what-next.jpg +dateOverride: 16 February 2015 +--- + +{% include post-header.html %} +Mark your calendars: Here are the planned dates for ticket sales for JSConf EU 2015: + +- Sunday, May 3rd at 18:00 CEST — Regular Price 620€ + VAT + Fees **749€** + +### Mind the Gap Day! + +This year, we are introducing a gap day. The first day of JSConf EU is on a **Friday**, [CSSConf EU](http://2015.cssconf.eu) is on Saturday, followed by the second day of JSConf EU on the **Sunday**. + +What is going on on the Saturday, you wonder? If you are interested in CSS, definitely you should attend CSSConf EU that day. For everyone else, including the wider developer community in Berlin, we invite you to socialize with each other and see the city. Smaller events that day, and in fact that whole week, will be accounced at the soon to be launched [“Web Tech Fest Berlin”](http://wwwtf.berlin) site. Stay tuned. + +### What to expect at JSConf EU + +JSConf EU is a professional, not-for-profit, labour-of-love conference for the JavaScript community that you don’t want to miss out on. For the breakdown of the JSConf EU experience and what a ticket buys you, check out [WHY JSConf EU]({{ site.baseurl }}/why/ "WHY JSConf EU"). + +### Diversity Support Tickets + +[Expanding on our program from last year](http://2014.jsconf.eu/news/2014/08/15/diversity-tickets.html) we are again offering [Diversity Support Tickets](/diversity-tickets). As last year you are purchasing a ticket for yourself and at the same time help another person of the conference’s choosing to be able to attend the event. + +To make the program even more accessible we now offer a wider range of "Support Options". Starting with paying 25% of a ticket to paying for a full ticket. We thank you in advance for your generosity and awesomeness and looking forward to a more diverse JSConf EU than ever before. + +### Additional Information + +- Ticket sales will be done through [Tito](https://tito.io/jsconfeu/jsconf-eu-2015). +- You won’t need a Paypal account, but you can use one! (The other option is Stripe.) +- You will be able to buy one ticket per order. +- We will sell Combo Tickets with [CSSConf EU](http://2015.cssconf.eu) as well. +- [Reject.js](http://rejectjs.org) tickets are sold separately. +- [How we spend your money](http://2013.jsconf.eu/news/2013/06/15/how-we-spend-your-money.html). + diff --git a/_posts/2015-06-22-scholarships.md b/_posts/2015-06-22-scholarships.md new file mode 100644 index 0000000..67203d9 --- /dev/null +++ b/_posts/2015-06-22-scholarships.md @@ -0,0 +1,38 @@ +--- +layout: post +title: Scholarships for JSConf EU, CSSconf EU & Reject.JS 2015 +category: news +tags: news +figure: /img/what-next.jpg +dateOverride: 22 June 2015 +--- + +{% include post-header.html %} + +We are striving for the most diverse group of people possible — **we firmly believe in equality**, thus we invite everyone and anyone to participate. In order to make this possible, we are proud to announce our scholarship programme for people who would otherwise be unable to participate. + +Our scholarship fund will support about **sixty people** to attend JSConf EU and/or CSSconf EU, and/or Reject.JS. Scholarships are **fully sponsored (i.e. free)** tickets that are awarded after an application process and lottery. Travel expenses and accommodation, if required, will also be awarded. + +Anyone from an underrepresented group in tech is invited to apply for this scholarship. This includes, but is not limited to: women, people of colour, LGBTQIA+ people, disabled people, and people facing economic or social hardships. + +The application process is simple: Tell us about what you do with JS or CSS, and why you want to attend JSConf EU or CSSconf EU. + +**→ [Apply now for the JSConf EU / CSSconf EU Scholarship](https://docs.google.com/forms/d/1NKSwnoWOVgFu0F_04rQyouJM0kOJPTs_cX2yndoU5Qk/viewform?usp=send_form)** + +Here is a bit more information about the process that might help you during your application: + +- This is a joint application form for the JSConf EU and CSSconf EU conferences. The option to attend Reject.JS will be offered to everyone who receives a scholarship. +- You can apply to either one, or both of them. +- Both conferences have three pools of tickets, they are differentiated by how much travel support they provide. + - The first category comes with up to 1000 Euros of travel & accommodation support, meant for non-EU travellers. + - The second category comes with up to 500 Euros of travel & accommodation support, meant for non-Berlin EU travellers. + - The third category comes with no travel & accommodation support, it is meant for people who are from the Berlin area, or nearby, or can pay for their own travel & accommodation (or have friends in Berlin who they can stay with). +- The travel & accommodation support is meant to cover your travel to Berlin and your stay here. Be sure to include travel to and from all respective airports, and any other smaller travel expenses you might incur; they add up quickly. + +Scholarships are made possible by a joint effort of JSConf EU, CSSconf EU and Reject.JS attendees and sponsors. Our attendees have raised over 40,000 EUR for scholarship tickets to the conferences. Sponsors are still raising the funds to pay for travel and accommodation. We are very proud to be part of this community for showing their support of this initiative. **Thank you!** + +Special thanks to the [Travis Foundation](http://foundation.travis-ci.org) for helping with the scholarship fund! + +**→ [Apply now for the JSConf EU / CSSconf EU Scholarship](https://docs.google.com/forms/d/1NKSwnoWOVgFu0F_04rQyouJM0kOJPTs_cX2yndoU5Qk/viewform?usp=send_form)** + +Submissions are due end of day July 12, CEST (i.e. Berlin time) diff --git a/_posts/2015-08-05-late-bird-tickets.md b/_posts/2015-08-05-late-bird-tickets.md new file mode 100644 index 0000000..6755357 --- /dev/null +++ b/_posts/2015-08-05-late-bird-tickets.md @@ -0,0 +1,23 @@ +--- +layout: post +title: Ticket Sale for JSConf EU 2015 +category: news +tags: news +figure: /img/what-next.jpg +dateOverride: 5 August 2015 +--- + +{% include post-header.html %} +Mark your calendars: The Final Ticket Sale for JSConf EU 2015 will start on Sunday, August 9th at 18:00 CEST. + +JSConf EU is a professional, not-for-profit, labour-of-love conference for the JavaScript community that you don’t want to miss out on – Read up on the [JSConf EU experience and what a ticket buys you]({{ site.baseurl }}/why/ "WHY JSConf EU"). + +### Additional Information + +- Price: 750€ + VAT + Fees **899€**. +- This is the final sale. +- Ticket sales will be done through [Tito](https://tito.io/jsconfeu/jsconf-eu-2015). +- You won’t need a Paypal account, but you can use one! (The other option is Stripe.) +- You will be able to buy one ticket per order. +- [How we spend your money](http://2013.jsconf.eu/news/2013/06/15/how-we-spend-your-money.html). + diff --git a/_posts/2015-09-10-rough-schedule.md b/_posts/2015-09-10-rough-schedule.md new file mode 100644 index 0000000..7d373cb --- /dev/null +++ b/_posts/2015-09-10-rough-schedule.md @@ -0,0 +1,18 @@ +--- +layout: post +title: Rough Schedule +category: news +tags: news +figure: /img/what-next.jpg +--- +{% include post-header.html %} + +*Thursday, September 24th:* **Reject.js** closing / JSConf EU Opening Party, [Crack Bellmer](https://www.google.com/maps/place/Crack+Bellmer+Bar/@52.507641,13.454722,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e597ee47c8b:0x7c076e8191f2662?hl=en), from 20:00. + +*Friday, September 25th:* **JSConf EU** Day 1, [Radialsystem](https://www.google.com/maps/place/RADIALSYSTEM+V/@52.5102922,13.4286193,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e3900263f87:0xf3893f5141a5c0fc?hl=en), Breakfast from 8:30. Dinner at around 19:30, Party from 21:00. + +*Saturday, September 26th*: [**CSSconf EU**](http://2015.cssconf.eu "CSSconf EU 2015"), Closing Party, Radialsystem, from 21:00. + +*Sunday, September 27th*: **JSConf EU** Day 2, Radialsystem, Breakfast from 9:00, Closing remarks from 19:00, [After-Party on the boat Hoppetosse](https://www.google.com/maps/place/MS+Hoppetosse/@52.4975084,13.454749,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e5573a0df1d:0xfa102535b24107b5?hl=en) from 19:30. + +*Monday, September 28th*: **Relax.js** Brunch at [Datscha](https://www.google.com/maps/place/Datscha/@52.5092823,13.4580461,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e59349977b1:0x78e3a6d1511d99c2?hl=en) from 10:00. diff --git a/_posts/2015-09-14-talk-schedule.md b/_posts/2015-09-14-talk-schedule.md new file mode 100644 index 0000000..4e2c367 --- /dev/null +++ b/_posts/2015-09-14-talk-schedule.md @@ -0,0 +1,17 @@ +--- +layout: post +title: Talk Schedule +category: news +tags: news +figure: /img/what-next.jpg +--- + +{% include post-header.html %} + +Choose your favourite version of our [time table](https://docs.google.com/spreadsheet/pub?key=0AhO5JVicsAJOdGEyUTBZMXVUZXZ2c2tXMDVxcy1aX0E&output=html), or make your own :) + +- ___[HTML version](https://docs.google.com/spreadsheet/pub?key=0AhO5JVicsAJOdGEyUTBZMXVUZXZ2c2tXMDVxcy1aX0E&output=html)___ (always up to date) +- [Lanyrd version](http://lanyrd.com/2015/jsconfeu/schedule/) + +- We'd appreciate prettier, mobile friendly, offline capable versions. Here is the raw data: + - [Crappy XML-identity-crisis JSON](https://spreadsheets.google.com/feeds/cells/0AhO5JVicsAJOdGEyUTBZMXVUZXZ2c2tXMDVxcy1aX0E/od4/public/basic?alt=json) diff --git a/_posts/2015-09-26-sunday-night-party.md b/_posts/2015-09-26-sunday-night-party.md new file mode 100644 index 0000000..dab3ffe --- /dev/null +++ b/_posts/2015-09-26-sunday-night-party.md @@ -0,0 +1,26 @@ +--- +layout: post +title: "The Sunday Night Party: Return to Hoppetosse" +category: news +tags: news +background: background4 +image: /img/top_disco.jpg +--- + +{% assign map_url="https://www.google.com/maps/place/Hoppetosse/@52.497528,13.454715,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e5573a0df1d:0xfa102535b24107b5" %} + +{% include post-header.html %} + +For the JSConf EU After Party on Sunday, September 27, [Hood.ie](http://hood.ie), [SoundCloud](https://soundcloud.com) and [&yet](https://andyet.com) invite you to return to the [Boat Hoppetosse](http://hoppetosse.berlin/) with DJs & **free** drinks. + +{% assign image_url="http://2014.jsconf.eu/img/hoppetosse.jpg" %} +{% include image.md %} + +Show your JSConf EU badge at the door. +**ps: The boat is docked the WHOLE time.** + +- Time: 20:00 +- Location: Eichenstrasse 4, 12435 Berlin (A [pleasant walk](https://www.google.com/maps/dir/Radialsystem+V,+Holzmarktstra%C3%9Fe+33,+10243+Berlin,+Germany/52.4973386,13.4552222/@52.503115,13.433292,15z/data=!4m9!4m8!1m5!1m1!1s0x47a84e3900263f87:0xf3893f5141a5c0fc!2m2!1d13.428635!2d52.510387!1m0!3e2) away from the JSConf venue) + +{% assign map_center="52.497528,13.454715" %} +{% include map_image.md %} diff --git a/_posts/2015-09-27-relax.md b/_posts/2015-09-27-relax.md new file mode 100644 index 0000000..4433635 --- /dev/null +++ b/_posts/2015-09-27-relax.md @@ -0,0 +1,32 @@ +--- +layout: post +title: "Join us Monday for Relax.js" +category: news +tags: news +background: background4 +image: /img/top_disco.jpg +--- + +{% include post-header.html %} + +{% assign map_url="https://www.google.com/maps/place/Datscha/@52.50936,13.457964,17z/data=!3m1!4b1!4m2!3m1!1s0x47a84e59349977b1:0x78e3a6d1511d99c2" %} + +On Monday September 28th, from 10:00–14:00, we invite you to join us for a relaxed brunch, food & drink included, at [authentic Russian-style Datscha Café](http://cafe-datscha.de/en/). Expect all kinds of delicious choices for all tastes, served in a cozy atmosphere. + + + +- Time: 10:00–14:00 +- Location: Datscha Café, Gabriel-Max-Str. 1 (Not far from Warschauer S-Bahn) + +{% assign map_center="52.50936,13.457964" %} + + +## See you there! + +Thank you, + + diff --git a/_posts/2016-01-05-announcing-jsconfeu-2017.md b/_posts/2016-01-05-announcing-jsconfeu-2017.md new file mode 100644 index 0000000..7b1066b --- /dev/null +++ b/_posts/2016-01-05-announcing-jsconfeu-2017.md @@ -0,0 +1,34 @@ +--- +layout: post +title: "ANNOUNCING JSConf EU 2017" +category: news +tags: news +background: background4 +image: /img/top_disco.jpg +figure: /img/what-next.jpg +--- + +{% include post-header.html %} + +Hi, this is Tiffany, Jan, Karolina, Holger & Malte, the JSConf EU curators. + +It’s usually around this time of the year that we reveal our plans for the next JSConf EU, so here it goes: + +We’re thrilled to announce **JSConf EU 2017**! That’s right, [together with CSSconf EU](), JSConf EU is pressing the pause button in 2016 and will return only a few months later than usual, in **spring 2017**. + +It’s been a fantastic SEVEN years running JSConf EU, learning a lot with each event and using it to improve the next. JSConf EU 2015 [was magic](https://www.youtube.com/watch?v=lJ1kY-CSpBk&list=PL37ZVnwpeshH37NxpV6XbgdDpY-w48hMd), it topped expectations and we are all really happy and proud to have taken part in its making. + +Yet, the organisation and running of a conference is a taxing endeavour. Like [CSSconf EU](http://2015.cssconf.eu/), JSConf EU is organised by volunteers who dedicate much of their spare time to deliver the best event possible and after seven years we feel a little worn out. So, we've agreed that now would be a good time to take a break, recharge, and come back better than ever! + +But don’t despair! There are A LOT of JSConfs going on in 2016, you just have to take your pick: + +- [JSConf Iceland](http://jsconf.is) +- [JSConf Budapest](http://jsconfbp.com) +- [JSConf Uruguay](https://jsconf.uy) +- [JSConf Belgium](http://jsconf.be/) +- [JSConf Asia](http://jsconf.asia) + +* * * + +See you all at *some* JSConf 👋 +Tiffany, Jan, Karolina, Holger & Malte diff --git a/_posts/2016-01-13-concerning-jsconf-beirut.md b/_posts/2016-01-13-concerning-jsconf-beirut.md new file mode 100644 index 0000000..f2c93d9 --- /dev/null +++ b/_posts/2016-01-13-concerning-jsconf-beirut.md @@ -0,0 +1,33 @@ +--- +layout: post +title: "UPDATED: Concerning JSConf Beirut" +category: news +tags: news +background: background4 +image: /img/top_disco.jpg +figure: /img/what-next.jpg +--- + +{% include post-header.html %} + +**UPDATE** February 18th: We have been assured that the individual who caused the breaches of the Code of Conduct has been removed from the event. Although we have limited visibility into the operation, we believe the new organisation team is acting in good faith, and are subsequently **lifting our recommendation to not attend** the event. + +* * * + +Original message: + +JSConf is [a federated group of events](http://jsconf.com). No one person or group is responsible all of them. Instead, we are a close-knit collection of groups that run a JSConf locally, where we live. There are nine JSConfs in the US, Europe, South America, Australia and Asia. They all have their own “feel”, but they all share the awesome community spirit that [the original JSConf US in 2009 sparked](http://2009.jsconf.us). + +The JSConf family of events is an open group: anyone can run a JSConf, if they [adhere to the guidelines](http://jsconf.com/i-want-to-run-a-jsconf.html). + +In late 2015 we were approached by JSConf Beirut to be added to the global family. We found a mentor for them and connected them with speakers. They said they would do things by the book. We were excited to bring JSConf to Lebanon. + +Since then, it has come to our attention that the organisers are violating their own Code of Conduct, and despite multiple attempts at helping them to address this (that’s what we are here for, everyone makes mistakes, and we can help fix them), they refuse to handle the situations professionally and adequately. + +As a result, the JSConf Family of events is withdrawing their support for the Beirut event. In light of [the 2016 hiatus of JSConf EU](http://2015.jsconf.eu/news/2016/01/05/announcing-jsconfeu-2017/), we recommended people visiting one of the other 6 5 JSConfs around the world that are happening in 2016, included JSConf Beirut. We also suggested this on our Twitter account. + +**We no longer recommend you attend or speak at JSConf Beirut**, or whatever the event is going to be called going forward, as we have asked the organisers to change it as to not mislead attendees and speakers. + +We apologise for any inconvenience, but the safety of this community is our prime concern, and after a significant amount of time trying to fix the situation, we don’t see another way out. + +We are disappointed that things have turned out this way and we hope we can bring JSConf to Lebanon in the future. \ No newline at end of file diff --git a/_posts/2016-05-27-announcing-jsconfeu-2017.md b/_posts/2016-05-27-announcing-jsconfeu-2017.md new file mode 100644 index 0000000..7b1066b --- /dev/null +++ b/_posts/2016-05-27-announcing-jsconfeu-2017.md @@ -0,0 +1,34 @@ +--- +layout: post +title: "ANNOUNCING JSConf EU 2017" +category: news +tags: news +background: background4 +image: /img/top_disco.jpg +figure: /img/what-next.jpg +--- + +{% include post-header.html %} + +Hi, this is Tiffany, Jan, Karolina, Holger & Malte, the JSConf EU curators. + +It’s usually around this time of the year that we reveal our plans for the next JSConf EU, so here it goes: + +We’re thrilled to announce **JSConf EU 2017**! That’s right, [together with CSSconf EU](), JSConf EU is pressing the pause button in 2016 and will return only a few months later than usual, in **spring 2017**. + +It’s been a fantastic SEVEN years running JSConf EU, learning a lot with each event and using it to improve the next. JSConf EU 2015 [was magic](https://www.youtube.com/watch?v=lJ1kY-CSpBk&list=PL37ZVnwpeshH37NxpV6XbgdDpY-w48hMd), it topped expectations and we are all really happy and proud to have taken part in its making. + +Yet, the organisation and running of a conference is a taxing endeavour. Like [CSSconf EU](http://2015.cssconf.eu/), JSConf EU is organised by volunteers who dedicate much of their spare time to deliver the best event possible and after seven years we feel a little worn out. So, we've agreed that now would be a good time to take a break, recharge, and come back better than ever! + +But don’t despair! There are A LOT of JSConfs going on in 2016, you just have to take your pick: + +- [JSConf Iceland](http://jsconf.is) +- [JSConf Budapest](http://jsconfbp.com) +- [JSConf Uruguay](https://jsconf.uy) +- [JSConf Belgium](http://jsconf.be/) +- [JSConf Asia](http://jsconf.asia) + +* * * + +See you all at *some* JSConf 👋 +Tiffany, Jan, Karolina, Holger & Malte diff --git a/about.md b/about.md new file mode 100644 index 0000000..520badf --- /dev/null +++ b/about.md @@ -0,0 +1,61 @@ +--- + layout: simple-page + title: About JSConf EU 2015 + title-short: About +--- + + +> “This was probably one of the best weekends of my life, meeting great people, listening to talented developers share their experiences with us and getting inspired by a lot of them.” + +JSConf EU, the labour-of-love conference for the JS community in Europe. Let the moving images speak for themselves: + +## 2014 Summary +{% assign video_id="isrOs-ieMGI" %} +{% include youtube.md %} + +## 2013 Summary +{% assign video_id="96055758" %} +{% include vimeo.md %} + +## 2012 Summary +{% assign video_id="52140932" %} +{% include vimeo.md %} + +## 2011 Summary +{% assign video_id="30988223" %} +{% include vimeo.md %} + +## Curators + +JSConf EU is brought to you by these people: + +

+ Tiffany Conroy + Tiffany Conroy | + @theophani +

+ +

+ Jan Lehnardt + Jan Lehnardt | + @janl +

+ +

+ Holger Blank + +Holger Blank | + @hblank +

+ +

+ Malte Ubl + +Malte Ubl | + @cramforce +

+ +

+ Karolina Szczur + Karolina Szczur | + @fox +

+ diff --git a/accessibility.md b/accessibility.md new file mode 100644 index 0000000..cff97ca --- /dev/null +++ b/accessibility.md @@ -0,0 +1,21 @@ +--- + layout: simple-page + title: Accessibility - JSConf EU 2015 + title-short: Accessibility +--- + +
+

JSConf.eu, CSSConf.eu and Reject.JS are inclusive conferences and want to be accessible.

+
+ +We make sure that all official events related to these conferences are well accessible to people with physical disabilities, by both checking with the venue owner and by visiting them personally beforehand. + +However, we are aware that accessibility issues are diverse and this does not cover everything. + +If you are interested in our conferences, but have any kind of accessibility problem that needs to be resolved before you can attend, please get in [contact](mailto:contact@jsconf.eu). + +We will reserve you a ticket until we found out whether your issue can be resolved. This includes setting up special assistance offers. + +If you are in need of an assistant, they will not be required to buy a ticket. + +We would love to welcome you to our conferences! diff --git a/call-for-speakers.md b/call-for-speakers.md new file mode 100644 index 0000000..33149c4 --- /dev/null +++ b/call-for-speakers.md @@ -0,0 +1,168 @@ +--- + layout: simple-page + title: Call for Speakers + title-short: Call for Speakers +--- + + +# Call for Speakers + +> “JSConf EU — This is your conference.” + +We are inviting the JavaScript community to submit talks for the upcoming JSConf EU (Friday September 25th and Sunday 27th, Berlin). This Call for Presentation **closes on May 31st**. + +This is what we call a “Hybrid CFP”: If you think you have something great to talk about, tell us all about it and we consider your entry. If you know someone who has something great to talk about, nominate them. And if you are interested in hearing about a particular topic, nominate the topic, and we can try and find a match. + +## Topics + +To get a feel for what we are interested in hearing about, here is the programme for the past years ([2009](http://jsconf.eu/2009/speakers.html), [2010](http://jsconf.eu/2010/speakers.html), [2011](http://jsconf.eu/2011/speakers.html), [2012](http://2012.jsconf.eu/speakers.html), [2013](http://2013.jsconf.eu/speakers/), [2014](http://2014.jsconf.eu/speakers/)). + +We like to see anything that squarely fits into the spectrum of: + + * Cutting-edge technological advances in the world of JavaScript or computer science in general, if somehow applicable to JavaScript. + * Wild Ideas & Clever Hacks. + * Improving JavaScript developers’ lives. + * Mobile JS. + * Embedded JS. + * Hardware JS. + * Fundamentals, in a modern light. + * The JavaScript community, culture, history, past, present & future, the why the who and the what of what we’re all doing. + * And finally: Whatever the hell you want; this is your conference. + + +## We Can Help + +Not everybody is a natural talent on stage. Not everybody can produce kick-ass slide-decks. Not everybody is a live-demo-god. Not everybody knows they have something great to talk about. + +There are about a million reasons why *you* don’t consider yourself a speaker, let alone at JSConf EU, where all your heroes have spoken in the past. **We are here to prove you wrong**. If all you have is a gut feeling that you should be on stage, we are here to help you to develop or hone the skills you think you lack to deliver a great presentation. + +* We are happy to brainstorm your interests to see if a great topic is hiding. +* We are happy to connect you with experienced speakers to help prepare your submission, or you can refer to the “Example Submission” section below for tips. +* We are happy to review and advise on how to produce a slide deck. If you don't feel creative, just use our [Keynote or PowerPoint](https://github.com/jsconf/presentation-templates/downloads) templates. + * If you need practice giving talks, get in touch, we can hook you up with local groups or set up a stage for you and a bunch of friends in advance, so you can practice in front of a friendly crowd. + * Again, *whatever* else you might need, we’re here to help. + +Get in touch: [contact@jsconf.eu](mailto:contact@jsconf.eu ) (just don’t use this to submit a proposal). + +If you need more encouragement, check out co-organiser Tiffany’s site [We Are All Awesome](http://weareallaweso.me/) that tries to convince you to speak. + + +#### Previous Speaker’s Experiences + +If you still need convincing, here are a few select quotes from previous speakers: + +> “As a speaker, I was treated like royalty.” — [@ireneros][] + +> “I enjoyed all of the variety of the talks. There really was something for everyone.” — [@angelinamagnum][] + +> “If anything important or surprising was going to happen with JavaScript, it was going to happen here.” — [@stuartmemo][] + +> “I would speak again in a heartbeat.” — [@EamonLeonard][], [@rem][], [@angelinamagnum][] + +> “The staff & organizers were absolutely fabulous!” — [@nexxylove][] + +> “I heard that the talks are always amazing and I thought that getting the opportunity to speak alongside such wonderful speakers would be an honor. And it was. I also really appreciate the organizers’ dedication to diversity and creating an open and comfortable environment for all participants.” — [@ireneros][] + +> “It kick-started a speaking circuit.” — [@angelinamagnum][] + +> “I love the fact that off-the-wall talks are encouraged and promoted.” — [@johnbender][] + +> “Ever since, people keep asking me to do more public speaking.” — [@nexxylove][] + +> “I just felt like any other normal attendee — and that’s a good thing!” — [@jviereck][] + +> “I had a lot of offers for more public speaking based solely on my talk. It also gave me confidence to do other talks having done a big one like JSConf EU.” — [@stuartmemo][] + +> “The organizers were on point with everything, the accommodations were lovely, and all the participants were delightful to interact with.” — [@angelinamagnum][] + +> “I have seen an increased number of invitations to talk by other conferences.” — [@olov][] + +> “I most enjoyed the feedback and discussions afterwards. Seeing people's reaction to your talk is so so gratifying.” — [@stuartmemo][] + +> “Absolutely fantastic.” — [@mraleph][] + +[@ireneros]: https://twitter.com/ireneros +[@johnbender]: https://twitter.com/johnbender +[@nexxylove]: https://twitter.com/nexxylove +[@jviereck]: https://twitter.com/jviereck +[@EamonLeonard]: https://twitter.com/EamonLeonard +[@rem]: https://twitter.com/rem +[@angelinamagnum]: https://twitter.com/ireneros +[@olov]: https://twitter.com/olov +[@stuartmemo]: https://twitter.com/stuartmemo +[@mraleph]: https://twitter.com/mraleph + +## The Perks + +If you get selected as a speaker at JSConf EU, here’s what you get: + + * **Travel to Berlin covered.** This usually means we pay for your plane or train ticket. We are happy to assist with booking your itinerary, but if you can do it yourself, we can focus on making the conference more awesome. + + * **Entrance to the conference.** We won’t be done with the speaker selections by the end of the ticket sales, so if you want to make sure you can attend, you may want to purchase a ticket regardless. If you get selected to speak and if you need to, we can refund your ticket, but if we don’t, we can spend more money on making the conference more awesome. + + * **We cover your stay in Berlin** in a hotel near the venue (including free Wifi) for the days of the conference and a day before and after (i.e. September 24th-28th). If you want to stay longer, we can arrange things, just let us know. You will have to cover extra nights, though. There will be satellite events in the week before and possibly after JSConf. + +If your employer can cover your travel and hotel, we are happy to list them as an awesome company sponsor. The money we save will be used to make the conference more awesome. (You might see a pattern …) + +If you have any special requirements, non-return trips (say you are coming from another conference), just let us know, we can usually work these things out. Just note that every minute we spend on this, we don't spend on making the conference more awesome ;) + +If you want to bring a significant other, or bring your kid(s) and need child-care to be sorted out for the time of the conference, please also get in touch. We are here to make this easy for you! + + +## The Selection Process + +Here’s roughly how we pick our talks: + + * Anonymize submissions, so we don’t bias against anything related to the submitting person. + * Two rounds of voting: + 1. The first round rates each talk on a scale from 1 to 10. + 2. The top-N (~50) submissions are rated again on a 3-point scale: “meh”, “yay”, “MUST HAVE”. + * De-anonymize so we can (finally) bias against speaker details. Based on our budget, we might opt for a local or at least closer-by (read: cheaper to transport) speaker. + +…and a number of details that we make up as we go along. + +We expect 100-200 excellent submissions for 30-40 speaking slots. The process helps us to select the right ones. + +[Read all about how this went down in 2012 and how we arrived at an amazing number of 25% women speakers](http://2012.jsconf.eu/2012/09/17/beating-the-odds-how-we-got-25-percent-women-speakers.html). + + +## Example Submission + +Here’s a proposal that we accepted in 2012: + +> ### JavaScript is the new Punk Rock +> On 4th June 1976, the Sex Pistols played Manchester’s Lesser Free Trade Hall. It was an event that changed the world forever. There were only about 40 people there, but those who attended were inspired to form their own bands, creating Joy Division, The Buzzcocks, The Fall and The Smiths. As these bands fade away, we’re long overdue for another such event. Programmers are artists, and JavaScript is the new Punk Rock. + +> My talk will show that JavaScript can be used to write and perform music using the wonderful Web Audio API. I’ll talk about why we should do this and why it’s the future of music. By the time the conference is over you’ll have burned your guitar, remixed a dozen tunes on GitHub, and started a JavaScript band that has its sights set on changing the world. + + +## Guidelines + +Submit your proposal by **May 31st 2015, 23:59:59 CEST**. No excuses. + +All talks are **in English**. + +**Talks are usually 30 minutes long** (for longer talks we’d get in touch with you directly). There is no Q&A. We will be on a tight schedule and enforce the end of a talk rigorously. We strongly encourage timing your presentation in advance. + +**Make sure you care**, and make sure we see you care. Typos, sloppy formatting and all-lowercase submissions make our reading of your proposal tedious. These things will definitely count against your proposal. + +**Don’t overdo it** either. If you need more than two paragraphs to get to the point of your topic, we need to ask you to slim things down. With the amount of submissions we get, the quicker you can to make a good impression, the better. + +> “I would have written a shorter letter, but I did not have the time” — Blaise Pascal + +**Original Topics**. One of the things we like to do with JSConf EU is to push the community forward. We can’t do this if the same people keep talking about the same things all the time. Thus, we favour original content. If you want to discuss a topic that you have talked about elsewhere, try to add a twist, or new research, or development, something unique. Of course, if your talk is plain awesome as-is, go for that :) + + +## Misc + +All talks will be recorded and published on the internet for free, along with a recording of the slide deck, live-demo or other on-presenter-screen activity as well as a transcript and subtitles. + +We do this for the benefit of the larger JavaScript community and those who can’t make it to the conference. We hope you want to help out, but if you are in any way uncomfortable, let us know and we will work things out. + +Finally, since you retain full ownership of your slides and recording, we’d like to ask you to make your materials and recording available under a creative commons (we default to no commercial reuse) or other open source license. + + +## Submit Your Talk + +Fill out our talk proposal form: +[https://bit.ly/jsconfeu-2015-cfp](https://bit.ly/jsconfeu-2015-cfp) diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 0000000..bf298ae --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,42 @@ +--- + layout: simple-page + title: Code of Conduct - JSConf EU 2015 + title-short: Code of Conduct +--- + + + +
+

All attendees, speakers, sponsors and volunteers at JSConf EU are required to agree with the following code of conduct. Organizers will enforce this code throughout the event. We are expecting coorporation from all participants to help ensuring a safe environment for everybody.

+ +
+ +## Need Help? Contact Tiffany + +Tiffany Conroy +Twitter: [@theophani](https://twitter.com/theophani) +Email: [tiffany@jsconf.eu](mailto:tiffany@jsconf.eu) +Phone(de): +4917632578373 + +## The Quick Version + +JSConf EU is dedicated to providing a harassment-free conference experience for everyone, regardless of gender, sexual orientation, disability, physical appearance, body size, race, or religion. We do not tolerate harassment of conference participants in any form. Sexual language and imagery is not appropriate for any conference venue, including talks, workshops, parties, Twitter and other online media. Conference participants violating these rules may be sanctioned or expelled from the conference *without a refund* at the discretion of the conference organizers. + +## The Less Quick Version + +Harassment includes offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, religion, sexual images in public spaces, deliberate intimidation, stalking, following, harassing photography or recording, sustained disruption of talks or other events, inappropriate physical contact, and unwelcome sexual attention. + +Participants asked to stop any harassing behavior are expected to comply immediately. + +Sponsors are also subject to the anti-harassment policy. In particular, sponsors should not use sexualized images, activities, or other material. Booth staff (including volunteers) should not use sexualized clothing/uniforms/costumes, or otherwise create a sexualized environment. + +If a participant engages in harassing behavior, the conference organizers may take any action they deem appropriate, including warning the offender or expulsion from the conference with no refund. + +If you are being harassed, notice that someone else is being harassed, or have any other concerns, please contact a member of conference staff immediately. Conference staff can be identified by a black conference shirt with a pink or black square JSConf EU logo. + +In case you can’t find a staff member, Tiffany Conroy is always there for you: [@theophani](https://twitter.com/theophani), [tiffany@jsconf.eu](mailto:tiffany@jsconf.eu), +4917632578373. + +Conference staff will be happy to help participants contact hotel/venue security or local law enforcement, provide escorts, or otherwise assist those experiencing harassment to feel safe for the duration of the conference. We value your attendance. + +We expect participants to follow these rules at conference and workshop venues, conference-related social events and social media. + diff --git a/config.rb b/config.rb new file mode 100644 index 0000000..7d5e72f --- /dev/null +++ b/config.rb @@ -0,0 +1,31 @@ +# Require any additional compass plugins here. + + +# Set this to the root of your project when deployed: +http_path = "/" +css_dir = "stylesheets" +sass_dir = "sass" +images_dir = "img" +javascripts_dir = "js" +#add_import_path = "stylesheets/imports" + + +# Set the images directory relative to your http_path or change +# the location of the images themselves using http_images_path: +http_images_dir = "img" + +# You can select your preferred output style here (can be overridden via the command line): +#output_style = :expanded or :nested or :compact or :compressed + +# To enable relative paths to assets via compass helper functions. Uncomment: +# relative_assets = true + +# To disable debugging comments that display the original location of your selectors. Uncomment: +# line_comments = false + + +# If you prefer the indented syntax, you might want to regenerate this +# project again passing --syntax sass, or you can uncomment this: +# preferred_syntax = :sass +# and then run: +# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass diff --git a/diversity-tickets.md b/diversity-tickets.md new file mode 100644 index 0000000..8b38bc2 --- /dev/null +++ b/diversity-tickets.md @@ -0,0 +1,19 @@ +--- + layout: simple-page + title: Diversity Tickets at JSConf EU 2015 + title-short: Diversity +--- + +## What is a Diversity Support Ticket? + +When you buy a Diversity Support Ticket, you receive a standard ticket while the extra proceeds are put in a pool to pay for Diversity Tickets. Diversity Support Tickets let you use your wealth to support someone who might not otherwise be able to attend. Anyone who buys a Diversity Support Ticket will be publicly thanked! :) + +## What is a Diversity Ticket? + +Diversity Tickets are fully sponsored (i.e. free) tickets that are awarded after an application process and lottery. In some cases, travel expenses will also be awarded. Anyone from an underrepresented group in tech is invited to apply. This includes, but is not limited to: women, people of colour, LGBTQ people, disabled people, and people facing economic or social hardships. + +We see diversity outreach in the form of sponsored tickets as one small way to help counteract the systemic oppression that usually works to disadvantage large groups of people and keep them out of tech. Building technology is an act of representation, and our entire industry (and society at large) will benefit when the pool of people being represented is larger and more diverse than it is today. + +## Who gets a Diversity Ticket? + +In a few months, we will open applications for Diversity Tickets. We do outreach with organizations that represent marginalised groups in tech to reach the right audience. We'll have a lottery for the available spots, with priority based on a combination of need and impact. The number of spots is determined by Diversity Support Ticket sales. diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..8e9a70c Binary files /dev/null and b/favicon.ico differ diff --git a/img/angelina-fabbro.jpg b/img/angelina-fabbro.jpg new file mode 100644 index 0000000..aa5c0dd Binary files /dev/null and b/img/angelina-fabbro.jpg differ diff --git a/img/holger.jpg b/img/holger.jpg new file mode 100644 index 0000000..dad6da2 Binary files /dev/null and b/img/holger.jpg differ diff --git a/img/jan.jpg b/img/jan.jpg new file mode 100644 index 0000000..5c11652 Binary files /dev/null and b/img/jan.jpg differ diff --git a/img/js.eu.png b/img/js.eu.png new file mode 100644 index 0000000..f2509ca Binary files /dev/null and b/img/js.eu.png differ diff --git a/img/jsconf-jenn-jed.jpg b/img/jsconf-jenn-jed.jpg new file mode 100644 index 0000000..df45618 Binary files /dev/null and b/img/jsconf-jenn-jed.jpg differ diff --git a/img/jsconf-logo-mark.svg b/img/jsconf-logo-mark.svg new file mode 100644 index 0000000..8f2d6c0 --- /dev/null +++ b/img/jsconf-logo-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/jsconf-pattern-resp.svg b/img/jsconf-pattern-resp.svg new file mode 100644 index 0000000..42d2c94 --- /dev/null +++ b/img/jsconf-pattern-resp.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/jsconf-pattern.svg b/img/jsconf-pattern.svg new file mode 100644 index 0000000..62dab8e --- /dev/null +++ b/img/jsconf-pattern.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/jsconfeu-group-2014.jpg b/img/jsconfeu-group-2014.jpg new file mode 100644 index 0000000..ecb4f6e Binary files /dev/null and b/img/jsconfeu-group-2014.jpg differ diff --git a/img/jsconfeu-logo.svg b/img/jsconfeu-logo.svg new file mode 100644 index 0000000..b03b06f --- /dev/null +++ b/img/jsconfeu-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/karolina.jpg b/img/karolina.jpg new file mode 100644 index 0000000..92320a5 Binary files /dev/null and b/img/karolina.jpg differ diff --git a/img/malte.jpg b/img/malte.jpg new file mode 100644 index 0000000..55c9a47 Binary files /dev/null and b/img/malte.jpg differ diff --git a/img/tiffany.jpg b/img/tiffany.jpg new file mode 100644 index 0000000..655ea9c Binary files /dev/null and b/img/tiffany.jpg differ diff --git a/img/what-next.jpg b/img/what-next.jpg new file mode 100644 index 0000000..3d47dbe Binary files /dev/null and b/img/what-next.jpg differ diff --git a/impressum.html b/impressum.html new file mode 100644 index 0000000..043ae47 --- /dev/null +++ b/impressum.html @@ -0,0 +1,40 @@ +--- + layout: simple-page + title: Impressum - JSConf EU 2015 + title-short: Impressum +--- + + +

+ Jan Lehnardt, Berlin @janl
+ Holger Blank, Hamburg @hblank
+ Malte Ubl, San Francisco @cramforce
+ Tiffany Conroy, Berlin @theophani
+

+ +

+ contact@jsconf.eu +

+ +

+ SinnerSchrader Deutschland GmbH
+ Voelckersstrasse 38
+ 22765 Hamburg, Germany
+ info@sinnerschrader.de +

+ +

+Management
+Matthias Schrader (Speaker), Holger Blank, Thomas Dyckhoff, Dr. Lars Finke, Martin Gassner, Dr. Axel Averdung, Juergen Alker +

+ +

+Trade register
+Local Court Hamburg
+HRB 63663 +

+ +

+Sales Tax Identification Number according to §27a Sales Tax Law:
+DE 812160091 +

\ No newline at end of file diff --git a/index.html b/index.html index 590ca6b..0b50265 100644 --- a/index.html +++ b/index.html @@ -1,50 +1,74 @@ - - - - - - JSConf EU 2017 - - - - - -

JSConf EU & CSSconf EU return

-

May 5-7 2017

-

Berlin, Germany

- @jsconfeu, - @cssconfeu - - - +--- + layout: start + title: JSConf EU 2015 + background: background17 + tags: homepage + description: "JSConf EU, the labour-of-love conference for the JS community in Europe." +--- + + +
+ + {% for post in site.tags.news limit: 1 %} +
+ +
+
+ +
+
+ +
+ {{ post.content }} +
+ +
+ {% endfor %} + +
+ + + + +
+ +
+
+
+ Jsconf Jenn Jed +
+
+ +
+

Speaking at JSConf EU

+

+ We are inviting the JavaScript community to submit talks for the upcoming JSConf EU, and will open our Call for Presentations in March. If you think you have something great to talk about, you should consider submitting your idea. Here’s a resource to remind you why you should become a speaker, and here are some tips on how to write a great proposal. +

+ +
+ +
+ +
+ + + diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..4a281b7 --- /dev/null +++ b/js/app.js @@ -0,0 +1,35 @@ +// StickyNav by Robert https://github.com/rendro +var createStickyNav = function($node, reqAnimFrame, className) { + className = className || 'active'; + + var pos; + var isSticky; + var lastPos = -1; + var stickyTop = ~~($node.offset().top); + var $clone = $node.clone(); + + $clone.insertAfter($node).hide(); + + var loop = function() { + reqAnimFrame(loop); + pos = window.pageYOffset; + if (pos === lastPos) { + return; + } + var _isSticky = (pos >= stickyTop); + if (_isSticky === isSticky) return; + isSticky = _isSticky; + lastPos = pos; + $clone.toggle(isSticky).toggleClass(className, isSticky); + }; + + loop(); +}; + +$(function() { + // Sticky that nav up + var $nav = $('.js-sticky-nav') + if ($nav.length) { + createStickyNav($nav, window.requestAnimationFrame) + } +}) diff --git a/location.md b/location.md new file mode 100644 index 0000000..3a7c659 --- /dev/null +++ b/location.md @@ -0,0 +1,16 @@ +--- + layout: simple-page + title: Location + background: background16 + image: /img/radialsystem.jpg +--- + +# Location + +{% include location.md %} +{% assign image_url="http://2014.jsconf.eu/img/radialsystem.jpg" %} +{% assign image_alt="Radialsystem V" %} +{% include image.md %} +{% assign image_url="http://2014.jsconf.eu/img/radialsystem-outside.jpg" %} +{% assign image_alt="Yes, it is by the water :)" %} +{% include image.md %} diff --git a/news.html b/news.html new file mode 100644 index 0000000..721ef39 --- /dev/null +++ b/news.html @@ -0,0 +1,25 @@ +--- + layout: sub-page + title: News about JSConf EU 2015 + title-short: News +--- + +
+ + {% for post in site.tags.news %} +
+ +
+
+ +
+
+ +
+ {{ post.content }} +
+ +
+ {% endfor %} + +
diff --git a/node_modules/grunt-autoprefixer/CHANGELOG b/node_modules/grunt-autoprefixer/CHANGELOG new file mode 100644 index 0000000..e93cf14 --- /dev/null +++ b/node_modules/grunt-autoprefixer/CHANGELOG @@ -0,0 +1,67 @@ +v2.2.0: + date: 2015-01-17 + changes: + - Autoprefixer 5.0 +v2.1.0: + date: 2014-12-31 + changes: + - New `safe` option +v2.0.0: + date: 2014-11-14 + changes: + - Autoprefixer 4.0 + - Maps now inline and containing sourcesContent by default + - New `remove` option to control outdated prefixes cleaning (`true` by default) +v1.0.1: + date: 2014-08-23 + changes: + - Autoprefixer 3.0. + - Use new autoprefixer-core package designed for plugins. +v1.0.0: + date: 2014-08-05 + changes: + - New ‘silent’ option to suppress logging to stdout + - Diff files now created with .diff extension by default +v0.8.2: + date: 2014-07-18 + changes: + - Use the caret operator for Autoprefixer's version. +v0.8.1: + date: 2014-06-30 + changes: + - Autoprefixer 2.1. +v0.8.0: + date: 2014-06-26 + changes: + - Autoprefixer 2.0. + - New map option object notation. + - Visual cascade is enabled by default. +v0.7.6: + date: 2014-06-22 + changes: + - Autoprefixer 1.3. +v0.7.5: + date: 2014-06-10 + changes: + - Autoprefixer 1.2. +v0.7.4: + date: 2014-06-06 + changes: + - #45: Let users have both grunt-autoprefixer and autoprefixer NPM packages installed. +v0.7.3: + date: 2014-04-27 + changes: + - #42: A warning message if no sources are found. +v0.7.2: + date: 2014-02-24 + changes: + - New colorized terminal output. + - Drop node.js 0.8 support. +v0.7.1: + date: 2014-02-20 + changes: + - #31: `cascade` option support. +v0.7.0: + date: 2014-02-19 + changes: + - #30: Autoprefixer 1.1 support. diff --git a/node_modules/grunt-autoprefixer/LICENSE b/node_modules/grunt-autoprefixer/LICENSE new file mode 100644 index 0000000..ae2817d --- /dev/null +++ b/node_modules/grunt-autoprefixer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Dmitry Nikitenko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/grunt-autoprefixer/README.md b/node_modules/grunt-autoprefixer/README.md new file mode 100644 index 0000000..15a4a14 --- /dev/null +++ b/node_modules/grunt-autoprefixer/README.md @@ -0,0 +1,203 @@ +# grunt-autoprefixer +[![Build Status](https://travis-ci.org/nDmitry/grunt-autoprefixer.png?branch=master)](https://travis-ci.org/nDmitry/grunt-autoprefixer) +[![Dependency Status](https://david-dm.org/nDmitry/grunt-autoprefixer.png)](https://david-dm.org/nDmitry/grunt-autoprefixer) +[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/) + +> [Autoprefixer](https://github.com/postcss/autoprefixer) parses CSS and adds vendor-prefixed CSS properties using the [Can I Use](http://caniuse.com/) database. + +## Getting Started +This plugin requires Grunt `~0.4.0` + +If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: + +```shell +npm install grunt-autoprefixer --save-dev +``` + +Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: + +```js +grunt.loadNpmTasks('grunt-autoprefixer'); +``` + +## The "autoprefixer" task + +### Overview +In your project's Gruntfile, add a section named `autoprefixer` to the data object passed into `grunt.initConfig()`. + +```js +grunt.initConfig({ + autoprefixer: { + options: { + // Task-specific options go here. + }, + your_target: { + // Target-specific file lists and/or options go here. + }, + }, +}) +``` + +### Options + +#### options.browsers +Type: `Array` +Default value: an array with [default browsers](https://github.com/ai/browserslist) + +You can specify browsers actual for your project using this option: + +```js +options: { + browsers: ['last 2 versions', 'ie 8', 'ie 9'] +} +``` + +Or using a global config file named `browserslist` at the root of your project: + +``` +# Browsers that we support + +> 5% in US +Last 2 versions +``` + +Read more about browserslist [here](https://github.com/ai/browserslist). + +#### options.cascade +Type: `Boolean` +Default value: `true` + +Pass `false` to disable ‘cascade’ indentation. Read more [here](https://github.com/postcss/autoprefixer#visual-cascade). + +#### options.remove +Type: `Boolean` +Default value: `true` + +Pass `false` to disable outdated prefixes cleaning. Read more [here](https://github.com/postcss/autoprefixer/releases/tag/4.0.0). + +#### options.diff +Type: `Boolean|String` +Default value: `false` + +Set it to `true` if you want to get an output patch file: + +```js +options: { + diff: true // or 'custom/path/to/file.css.patch' +} +``` +Also you can specify a path where to save this file. More examples in [Gruntfile](https://github.com/nDmitry/grunt-autoprefixer/blob/master/Gruntfile.js). + +#### options.map +Type: `Boolean|Object` +Default value: `false` + +If the `map` option isn't defined or is set to `false`, Autoprefixer will neither create nor update a sourcemap. + +If `true` is specified, Autoprefixer will try to find a sourcemap from a previous compilation step using an annotation comment (e.g. from Sass) and create a new sourcemap based on the found one (or just create a new inlined sourcemap). The created sourcemap can be either a separate file or an inlined map depending on what the previous sourcemap was. + +You can gain more control over sourcemap generation by setting an object to the `map` option: + +* `prev` (string or `false`): a path to a directory where a previous sourcemap is (e.g. `path/`). By default, Autoprefixer will try to find a previous sourcemap using a path from the annotation comment (or using the annotation comment itself if the map is inlined). You can also set this option to `false` to delete the previous sourcemap. +* `inline` (boolean): whether a sourcemap will be inlined or not. By default, it will be the same as a previous sourcemap or inlined. +* `annotation` (boolean or string): set this option to `true` or `false` to enable or disable annotation comments. You can also overwrite an output sourcemap path using this option, e.g. `path/file.css.map` (by default, Autoprefixer will save your sourcemap to a directory where you save CSS). This option requires `inline` to be `false` or undefined. +* `sourcesContent` (boolean): whether original contents (e.g. Sass sources) will be included to a sourcemap. By default, Autoprefixer will add contents only for new sourcemaps or if a previous sourcemap has them. + +#### options.silent +Type: `Boolean` +Default value: `false` + +If the `silent` option is enabled, logging to the stdout will be suppressed. + +```js +options: { + silent: true +} +``` + +#### options.safe +Type: `Boolean` +Default value: `false` + +Enable or disable [PostCSS safe mode](https://github.com/postcss/postcss#safe-mode). + +```js +options: { + safe: true +} +``` + +### Usage Examples + +```js +grunt.initConfig({ + + autoprefixer: { + + options: { + // Task-specific options go here. + }, + + // prefix the specified file + single_file: { + options: { + // Target-specific options go here. + }, + src: 'src/css/file.css', + dest: 'dest/css/file.css' + }, + + // prefix all files + multiple_files: { + expand: true, + flatten: true, + src: 'src/css/*.css', // -> src/css/file1.css, src/css/file2.css + dest: 'dest/css/' // -> dest/css/file1.css, dest/css/file2.css + }, + + // if you have specified only the `src` param, the destination will be set automatically, + // so source files will be overwritten + no_dest: { + src: 'dest/css/file.css' // globbing is also possible here + }, + + diff: { + options: { + diff: true + }, + src: 'src/css/file.css', + dest: 'dest/css/file.css' // -> dest/css/file.css, dest/css/file.css.patch + }, + + sourcemap: { + options: { + map: true + }, + src: 'src/css/file.css', + dest: 'dest/css/file.css' // -> dest/css/file.css, sourcemap is inlined + }, + + sourcemap_separate: { + options: { + map: { + inline: false + } + }, + src: 'src/css/file.css', + dest: 'dest/css/file.css' // -> dest/css/file.css, dest/css/file.css.map + }, + } + +}); +``` + +Check out project's [Gruntfile.js](https://github.com/nDmitry/grunt-autoprefixer/blob/master/Gruntfile.js) for more examples. + +### Updating prefixes database + +``` +$ npm update caniuse-db +``` + +## Contributing +In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/). diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/ChangeLog.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/ChangeLog.md new file mode 100644 index 0000000..33a9db1 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/ChangeLog.md @@ -0,0 +1,448 @@ +## 5.0 “Pravda vítězí” +* Use PostCSS 4.0. +* Use Browserslist to parse browsers queries. +* Use global `browserslist` config. +* Add `> 5% in US` query to select browsers by usage in some country. +* Add `object-fit` and `object-position` properties support. +* Add CSS Shape properties support. +* Fix UC Browser name in debug info. + +## 4.0.2 +* Remove `o-border-radius`, which is common mistake in legacy CSS. + +## 4.0.1 +* Fix `@supports` support with brackets in values (by Vincent De Oliveira). + +## 4.0 “Indivisibiliter ac Inseparabiliter” +* Become 2.5 times fatser by new PostCSS 3.0 parser. +* Do not remove outdated prefixes by `remove: false` option. +* `map.inline` and `map.sourcesContent` options are now `true` by default. +* Add `box-decoration-break` support. +* Do not add old `-webkit-` prefix for gradients with `px` units. +* Use previous source map to show origin source of CSS syntax error. +* Use `from` option from previous source map `file` field. +* Set `to` value to `from` if `to` option is missing. +* Trim Unicode BOM on source maps parsing. +* Parse at-rules without spaces like `@import"file"`. +* Better previous `sourceMappingURL` annotation comment cleaning. +* Do not remove previous `sourceMappingURL` comment on `map.annotation: false`. + +## 3.1.2 +* Update Firefox ESR version from 24 to 31. + +## 3.1.1 +* Use Flexbox 2009 spec for Android stock browser < 4.4. + +## 3.1 “Satyameva Jayate” +* Do not remove comments from prefixed values (by Eitan Rousso). +* Allow Safari 6.1 to use final Flexbox spec (by John Kreitlow). +* Fix `filter` value in `transition` in Webkits. +* Show greetings if your browsers don’t require any prefixes. +* Add `<=` and `<` browsers requirement (by Andreas Lind). + +## 3.0.1 +* Fix `autoprefixer.postcss` in callbacks. + +## 3.0 “Liberté, Égalité, Fraternité” +* Project was split to autoprefixer (with CLI) and autoprefixer-core. +* `autoprefixer()` now receives only `options` object with `browsers` key. +* GNU format for syntax error messages from PostCSS 2.2. + +## 2.2 “Mobilis in mobili” +* Allow to disable Autoprefixer for some rule by control comment. +* Use PostCSS 2.1 with Safe Mode option and broken source line + in CSS syntax error messages. + +## 2.1.1 +* Fix `-webkit-background-size` hack for `contain` and `cover` values. +* Don’t add `-webkit-` prefix to `filter` with SVG (by Vincent De Oliveira). + +## 2.1 “Eleftheria i thanatos” +* Add support for `clip-path` and `mask` properties. +* Return `-webkit-` prefix to `filter` with SVG URI. + +## 2.0.2 +* Add readable names for new browsers from 2.0 release. +* Don’t add `-webkit-` prefix to `filter` with SVG URI. +* Don’t add `-o-` prefix 3D transforms. + +## 2.0.1 +* Save declaration style, when clone declaration to prefix. + +## 2.0 “Hongik Ingan” +* Based on PostCSS 1.0. + See [options changes](https://github.com/postcss/postcss/releases/tag/1.0.0). +* Restore visual cascade after declaration removing. +* Enable visual cascade by default. +* Prefix declareation in `@supports` at-rule conditions. +* Add all browsers from Can I Use: `ie_mob`, `and_chr`, `and_ff`, + `op_mob` and `op_mini`. +* Allow to use latest Autoprefixer from GitHub by npm. +* Add `--no-cascade`, `--annotation` and `--sources-content` options to binary. + +## 1.3.1 +* Fix gradient hack, when `background` property contains color. + +## 1.3 “Tenka Fubu” +* Add `text-size-adjust` support. +* Add `background-size` to support Android 2. + +## 1.2 “Meiji” +* Use Can I Use data from official `caniuse-db` npm package. +* Remove package data update from binary. +* Use increment value instead of current date in minor versions. + +## 1.1 “Nutrisco et extingo” +* Add source map annotation comment support. +* Add inline source map support. +* Autodetect previous source map. +* Fix source maps support on Windows. +* Fix source maps support in subdirectory. +* Prefix selector even if it is already prefixed by developer. +* Add option `cascade` to create nice visual cascade of prefixes. +* Fix flexbox support for IE 10 (by Roland Warmerdam). +* Better `break-inside` support. +* Fix prefixing, when two same properties are near. + +### 20140222: +* Add `touch-action` support. + +### 20140226: +* Chrome 33 is moved to released versions. +* Add Chrome 36 data. + +### 20140302: +* Add `text-decoration-*` properties support. +* Update browsers usage statistics. +* Use new PostCSS version. + +### 20140319: +* Check already prefixed properties after current declaration. +* Normalize spaces before already prefixed check. +* Firefox 28 is moved to released versions. +* Add Firefox 31 data. +* Add some Blackberry data. + +### 20140327: +* Don’t use `-ms-transform` in `@keyframes`, because IE 9 doesn’t support + animations. +* Update BlackBerry 10 data. + +### 20140403: +* Update browsers usage statistics. +* Opera 20 is moved to released versions. +* Add Opera 22 data. + +### 20140410: +* Chrome 34 is moved to released versions. +* Add Chrome 37 data. +* Fix Chrome 36 data. + +### 20140429: +* Fix `display: inline-flex` support by 2009 spec. +* Fix old WebKit gradient converter (by Sergey Belov). +* Fix CSS 3 cursors data (by Nick Schonning). + +### 20140430: +* Separate 2D and 3D transform prefixes to clean unnecessary `-ms-` prefixes. +* Firefox 29 is moved to released versions. +* Add Firefox 32 data. + +### 20140510 +* Do not add `-ms-` prefix for `transform` with 3D functions. +* Update browsers global usage statistics. + +### 20140512 +* Remove unnecessary `-moz-` prefix for `wavy` in `text-decoration`. +* Update Safari data for font properties. + +### 20140521 +* Chrome 36 is moved to released versions. +* Add Chrome 38 data. + +### 20140523 +* Opera 21 is moved to released versions. +* Add Opera 23 data. + +### 20140605 +* Allow to parse gradients without space between color and position. +* Add iOS 8, Safari 8 and Android 4.4.3 data. +* Update browsers usage statistics. + +## 1.0 “Plus ultra” +* Source map support. +* Save origin indents and code formatting. +* Change CSS parser to PostCSS. +* Preserve vendor-prefixed properties put right after unprefixed ones. +* Rename `compile()` to `process()` and return result object, + instead of CSS string. +* Rename `inspect()` to `info()`. +* Add in binary `-d` option to specify output directory. +* Binary now will not concat output files. +* Allow to select last versions for specified browser. +* Add full browser names aliases: `firefox`, `explorer` and `blackberry`. +* Ignore case in browser names. +* Change license to MIT. +* Add prefixes inside custom at-rules. +* Add only necessary prefixes to selector inside prefixed at-rule. +* Safer backgrounds list parser in gradient hack. +* Prefix `@keyframes` inside `@media`. +* Don’t prefix values for CSS3 PIE properties. +* Binary now shows file name in syntax error. +* Use browserify to build standalone version. + +### 20131225: +* Fix deprecated API convertor. +* Add `::placeholder` support for Firefix >= 18. +* Fix vendor prefixes order. + +### 20140103: +* Add `-webkit-` prefix for `sticky` position. +* Update browsers popularity statistics. + +### 20140109: +* Add selectors and at-rules sections to debug info. +* Fix outdated prefixes cleaning. + +### 20140110: +* Add `Firefox ESR` browser requirement. +* Opera 18 is moved to released versions. +* Add Opera 20 data. + +### 20140117: +* Chrome 32 is moved to released versions. +* Add Opera 34 data. + +### 20140130: +* Fix flexbox properties names in transitions. +* Add Chrome 35 and Firefox 29 data. + +### 20140203: +* Android 4.4 stock browser and Opera 19 are moved to released versions. +* Add Opera 21 data. +* Update browsers usage statistics. + +### 20140213: +* Add case insensitive to IE’s filter hack (by Dominik Schilling). +* Improve selector prefixing in some rare cases (by Simon Lydell). +* Firefox 27 is moved to released versions. +* Add Firefox 30 data. + +## 0.8 “Unbowed, Unbent, Unbroken” +* Add more browsers to defaults ("> 1%, last 2 versions, ff 17, opera 12.1" + instead of just "last 2 browsers"). +* Keep vendor prefixes without unprefixed version (like vendor-specific hacks). +* Convert gradients to old WebKit syntax (actual for Android 2.3). +* Better support for several syntaxes with one prefix (like Flexbox and + gradients in WebKit). +* Add intrinsic and extrinsic sizing values support. +* Remove never existed prefixes from common mistakes (like -ms-transition). +* Add Opera 17 data. +* Fix selector prefixes order. +* Fix browser versions order in inspect. + +### 20130903: +* Fix old WebKit gradients convertor on rgba() colors. +* Allow to write old direction syntax in gradients. + +### 20130906: +* Fix direction syntax in radial gradients. +* Don’t prefix IE filter with modern syntax. + +### 20130911: +* Fix parsing property name with spaces. + +### 20130919: +* Fix processing custom framework prefixes (by Johannes J. Schmidt). +* Concat outputs if several files compiled to one output. +* Decrease standalone build size by removing unnecessary Binary class. +* iOS 7 is moved to released versions. +* Clean up binary code (by Simon Lydell). + +### 20130923: +* Firefox 24 is moved to released versions. + +### 20131001: +* Add support for grab, grabbing, zoom-in and zoom-out cursor values. + +### 20131006: +* Chrome 30 is moved to released versions. + +### 20131007: +* Don’t add another prefixes in rule with prefixed selector. + +### 20131009: +* Opera 17 is moved to released versions. + +### 20131015: +* Fix converting multiple gradients to old webkit syntax (by Aleksei Androsov). + +### 20131017: +* Fix @host at-rule parsing. + +### 20131020: +* IE 11 and Andrid 4.3 is moved to released versions. +* Add Opera 18 data. +* Add @namespace support. +* Sort browser versions in data file. + +### 20131029: +* Add Safari 6.1 data. +* Add fx alias for Firefox. + +### 20131104: +* Update Android future version to 4.4. +* Google Chrome 32 added to future versions list. +* Firefox 25 now is actual version, 27 and 28 added to future versions. +* Browsers statistics are updated. + +### 20131205: +* Google Chrome 33 added to future releases list. +* Google Chrome 31 moved to current releases list. + +### 20131209: +* Use old webkit gradients for old iOS and Safari (by Chad von Nau). +* Fix direction conversion for old webkit gradients (by Chad von Nau). +* Update browsers popularity statistics. + +### 20131213: +* Firefox ESR in default browsers was changed to 24 version. +* Firefox 26 was moved to current releases list. +* Firefox 28 was added to future releases list. + +## 0.7 “We Do Not Sow” +* Add vendor prefixes to selectors. +* Add ::selection and ::placeholder selectors support. +* Allow to load support data from Can I Use pull requests. +* Remove deprecated API. + +### 20130806: +* Add hyphens support. + +### 20130807: +* Add tab-size support. +* Add :fullscreen support. + +### 20130808: +* Allow to select browser versions by > and >= operator. +* Fix flex properties in transition. + +### 20130810: +* Add Firefox 25 data. + +### 20130824: +* Add Chrome 31 and 30 data. +* Fix CSS comments parsing (by vladkens). + +## 0.6 “As High As Honor” +* New faster API, which cache preprocessed data. Old API is deprecated. +* A lot of perfomance improvements. +* Add Opera 15 -webkit- prefix support. +* Update Chrome 29 and Safari 7 prefixes data. +* Add minor browsers in popularity select. +* Better syntax error messages. + +### 20130721: +* Add Chrome 30 data. + +### 20130728: +* Don’t remove non-standard -webkit-background-clip: text. +* Don’t remove IE hack on CSS parse. + +### 20130729: +* Add Opera 16 data. +* Fix “Invalid range in character class” error on Firefox. + +### 20130730: +* Fix correct clone comments inside keyframes (by Alexey Plutalov). +* Fix angle recalculation in gradients (by Roman Komarov). + +### 20130731: +* Add border-image support. + +## 0.5 “Ours is the Fury” +* Rewrite Autoprefixer to be more flexible. +* Use css, instead of Rework, to fix CSS parsing errors faster. +* Fix a lot of CSS parsing errors. + +### 20130616: +* More useful message for CSS parsing errors. +* Remove old WebKit gradient syntax. +* Fix parsing error on comment with braces. + +### 20130617: +* Remove old Mozilla border-radius. +* Don’t prefix old IE filter. +* Remove old background-clip, background-size and background-origin prefixes. +* Speed up regexps in values. +* Allow to hack property declarations. + +### 20130625: +* Convert flexbox properties to 2009 and 2012 specifications. +* Improve messages on syntax errors. + +### 20130626: +* Add Firefox 24 data. +* Add prefixes for font-feature-settings. + +### 20130629: +* Fix convert flex properties to old box-flex. + +## 0.4 “Winter Is Coming” +* Remove outdated prefixes. +* Add border-radius and box-shadow properties to database. +* Change degrees in webkit gradients. + +### 20130515: +* Add old syntax in gradient direction. +* Add old syntax for display: flex. +* Update browser global usage statistics. + +### 20130521: +* Add Firefox 23 data. + +### 20130524: +* Add Chrome 29 data. + +### 20130528: +* Fix compatibilty with Rework from git master. +* Add minor browsers to data, which can be selected only directly. + +### 20130530: +* Add Opera 15 and iOS 6.1 data. +* Fix iOS versions in properties and values data. + +### 20130603: +* Use latest Rework 0.15 with a lot of CSS parsing fixes. +* Update browsers usage statistics. + +## 0.3 “Growing Strong” +* Rename `autoprefixer.filter()` to `autoprefixer.rework()`. +* Use own filters instead of Rework’s `prefix` and `prefixValue`. +* Smarter value prefixer without false match “order” in “border”. +* 40% faster. +* Don’t add unnecessary properties instead of Rework’s `prefixValue`. +* Don’t change properties order. +* Sort properties and values in inspect output. +* Add main to component config (by Jonathan Ong). +* Fix documentation (by Sergey Leschina and Mark Vasilkov). + +### 20130424: +* Fix value override in prefixer. + +### 20130427: +* Prefix several same values in one property. +* Fix Windows support in binary. +* Improve print errors in binary. + +### 20130502: +* Don’t add -webkit- prefix to IE filter. +* Don’t duplicate prefixes on second run. + +## 0.2 “Hear Me Roar!” +* Update parse libraries. +* Use component package manager to build standalone script. +* Add inspect to standalone script. + +## 0.1 “Fire and Blood” +* Initial release. diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/LICENSE b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/LICENSE new file mode 100644 index 0000000..da057b4 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2013 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/README.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/README.md new file mode 100644 index 0000000..97a5e96 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/README.md @@ -0,0 +1,194 @@ +# Autoprefixer Core [![Build Status](https://travis-ci.org/postcss/autoprefixer-core.svg)](https://travis-ci.org/postcss/autoprefixer-core) + + + +[PostCSS] plugin to parse CSS and add vendor prefixes using values +from [Can I Use]. + +This is core package to build Autoprefixer plugin for some environment +(like [grunt‑autoprefixer]). For end-user documentation, features +and plugins list visit [main Autoprefixer] project. + + +Sponsored by Evil Martians + + +[grunt‑autoprefixer]: https://github.com/nDmitry/grunt-autoprefixer +[main Autoprefixer]: https://github.com/postcss/autoprefixer +[Can I Use]: http://caniuse.com/ +[PostCSS]: https://github.com/postcss/postcss + +## Quick Example + +Write your CSS rules without vendor prefixes (in fact, forget about them +entirely): + +```css +:fullscreen a { + display: flex +} +``` + +Process your CSS by Autoprefixer: + +```js +var autoprefixer = require('autoprefixer-core'); +var prefixed = autoprefixer.process(css).css; +``` + +It will use the data based on current browser popularity and property support +to apply prefixes for you: + +```css +:-webkit-full-screen a { + display: -webkit-box; + display: -webkit-flex; + display: flex +} +:-moz-full-screen a { + display: flex +} +:-ms-fullscreen a { + display: -ms-flexbox; + display: flex +} +:fullscreen a { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex +} +``` + +## Usage + +To process your CSS you need to make 2 steps: + +1. Build processor for your options and browsers supported in your project. +2. Process CSS throw this processor. + +Function `autoprefixer(options)` returns new processor object: + +```js +var processor = autoprefixer({ browsers: ['> 1%', 'IE 7'], cascade: false }); +``` + +There are 2 options: + +* `browsers` (array): list of browsers, which are supported in your project. + You can directly specify browser version (like `iOS 7`) or use selections + (like `last 2 version` or `> 5%`). See [Browserslist docs] for available + queries and default value. +* `cascade` (boolean): should Autoprefixer uses [Visual Cascade], + if CSS will be uncompressed. + +Processor object had: + +* `.process(css, opts)` method, which will add prefixes to `css`. +* `.info()` method, which returns debug information: which browsers are selected + and which properties will be prefixed +* `.postcss` property returns [PostCSS] processor to use in chain + with other [PostCSS processors]. + +You can use processor object to process several CSS files +to increase perfomance. + +There are `autoprefixer.process()`, `autoprefixer.info()` +and `autoprefixer.postcss` shortcuts, which use default browsers and options. + +[PostCSS processors]: https://github.com/postcss/postcss#built-with-postcss +[Browserslist docs]: https://github.com/ai/browserslist +[Visual Cascade]: https://github.com/postcss/autoprefixer#visual-cascade +[PostCSS]: https://github.com/postcss/postcss + +## CSS Processing + +Method `process(css, opts)` from Autoprefixer processor is a PostCSS’s method. + +You must set `from` and `to` options with file names to generates corrects +source maps and useful error messages. + +Options: + +* `from` (path): file path to origin CSS files. +* `to` (path): file path to future CSS file, which will + contain processed CSS with prefixes. +* `safe` (boolean): enables [Safe Mode] in PostCSS. By default `false`. +* `map` contains options for source maps: + + * `inline: false` to force save map to separated file, instead of inline it + to CSS in special comment by base64. + * `prev` (string or object): map content from previous processing step + (like Sass compilation). + + If you set `map: false`, PostCSS will remove source map. + +You can read more about the source map options in [PostCSS documentation]. + +[PostCSS documentation]: https://github.com/postcss/postcss#source-map-1 +[Safe Mode]: https://github.com/postcss/postcss#safe-mode + +## PostCSS Chain + +You parse CSS only once and then process it through array of PostCSS processors. + +For example, you can use [gulp-postcss]: + +```js +var postcss = require('gulp-postcss'); +var sourcemaps = require('gulp-sourcemaps'); + +gulp.task('css', function () { + var processors = [ + require('autoprefixer')('last 1 version'), + require('css-mqpacker'), + require('csswring') + ]; + return gulp.src('./src/style.css') + .pipe(sourcemaps.init()) + .pipe(postcss(processors)) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest('./dest')); +}); +``` + +[gulp-postcss]: https://github.com/w0rm/gulp-postcss + +## Safe Mode + +PostCSS has a special safe mode to parse broken CSS. If you set the `safe: true` +option to the `process` method, it will parse `a {` as `a {}`: + +```js +autoprefixer.process('a {'); // will throw “Unclosed block” +autoprefixer.process('a {', { safe: true }); // will process as a closed block +``` + +It is useful for legacy code when using several hacks, or interactive +tools with live input, like [Autoprefixer demo]. + +[Autoprefixer demo]: http://simevidas.jsbin.com/gufoko/quiet + +## Cleaning + +By default, Autoprefixer not only add new prefixes, but also remove outdated. +You can remove this behaviour by `remove: false` option: + +```js +autoprefixer() + .process('a { -webkit-border-radius: 2px; border-radius: 2px }'); +// remove outdated -webkit-border-radius + +autoprefixer({ remove: false }) + .process('a { -webkit-border-radius: 2px; border-radius: 2px }'); +// keeps -webkit-border-radius +``` + +## Debug + +You can check which browsers are selected and which properties will be prefixed: + +```js +info = autoprefixer({ browsers: ['last 1 version'] }).info(); +console.log(info); +``` diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/browsers.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/browsers.js new file mode 100644 index 0000000..9fad8d6 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/browsers.js @@ -0,0 +1,64 @@ +(function() { + var convert, data, intervals, major, name, names, normalize, _ref; + + names = ['firefox', 'chrome', 'safari', 'ios_saf', 'opera', 'ie', 'bb', 'android']; + + major = ['firefox', 'chrome', 'safari', 'ios_saf', 'opera', 'android', 'ie', 'ie_mob']; + + normalize = function(array) { + return array.reverse().filter(function(i) { + return i; + }); + }; + + intervals = function(array) { + var i, interval, result, splited, sub, _i, _len; + result = []; + for (_i = 0, _len = array.length; _i < _len; _i++) { + interval = array[_i]; + splited = interval.split('-'); + splited = splited.sort().reverse(); + sub = (function() { + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = splited.length; _j < _len1; _j++) { + i = splited[_j]; + _results.push([i, interval, splited.length]); + } + return _results; + })(); + result = result.concat(sub); + } + return result; + }; + + convert = function(name, data) { + var future, result, versions; + future = normalize(data.versions.slice(-3)); + versions = intervals(normalize(data.versions.slice(0, -3))); + result = {}; + result.prefix = name === 'opera' ? '-o-' : "-" + data.prefix + "-"; + if (major.indexOf(name) === -1) { + result.minor = true; + } + if (future.length) { + result.future = future; + } + result.versions = versions.map(function(i) { + return i[0]; + }); + result.popularity = versions.map(function(i) { + return data.usage_global[i[1]] / i[2]; + }); + return result; + }; + + module.exports = {}; + + _ref = require('caniuse-db/data').agents; + for (name in _ref) { + data = _ref[name]; + module.exports[name] = convert(name, data); + } + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/prefixes.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/prefixes.js new file mode 100644 index 0000000..af1f644 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/data/prefixes.js @@ -0,0 +1,326 @@ +(function() { + var browsers, feature, map, prefix, textDecoration, + __slice = [].slice; + + browsers = require('./browsers'); + + feature = function(data, opts, callback) { + var browser, interval, match, need, sorted, support, version, versions, _i, _len, _ref, _ref1, _ref2; + if (!callback) { + _ref = [opts, {}], callback = _ref[0], opts = _ref[1]; + } + match = opts.full ? /y\sx($|\s)/ : /\sx($|\s)/; + need = []; + _ref1 = data.stats; + for (browser in _ref1) { + versions = _ref1[browser]; + for (interval in versions) { + support = versions[interval]; + _ref2 = interval.split('-'); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + version = _ref2[_i]; + if (browsers[browser] && support.match(match)) { + version = version.replace(/\.0$/, ''); + need.push(browser + ' ' + version); + } + } + } + } + sorted = need.sort(function(a, b) { + a = a.split(' '); + b = b.split(' '); + if (a[0] > b[0]) { + return 1; + } else if (a[0] < b[0]) { + return -1; + } else { + return parseFloat(a[1]) - parseFloat(b[1]); + } + }); + return callback(sorted); + }; + + map = function(browsers, callback) { + var browser, name, version, _i, _len, _ref, _results; + _results = []; + for (_i = 0, _len = browsers.length; _i < _len; _i++) { + browser = browsers[_i]; + _ref = browser.split(' '), name = _ref[0], version = _ref[1]; + version = parseFloat(version); + _results.push(callback(browser, name, version)); + } + return _results; + }; + + prefix = function() { + var data, name, names, _i, _j, _len, _results; + names = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), data = arguments[_i++]; + _results = []; + for (_j = 0, _len = names.length; _j < _len; _j++) { + name = names[_j]; + _results.push(module.exports[name] = data); + } + return _results; + }; + + module.exports = {}; + + feature(require('caniuse-db/features-json/border-radius'), function(browsers) { + return prefix('border-radius', 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius', { + mistakes: ['-ms-', '-o-'], + browsers: browsers, + transition: true + }); + }); + + feature(require('caniuse-db/features-json/css-boxshadow'), function(browsers) { + return prefix('box-shadow', { + browsers: browsers, + transition: true + }); + }); + + feature(require('caniuse-db/features-json/css-animation'), function(browsers) { + return prefix('animation', 'animation-name', 'animation-duration', 'animation-delay', 'animation-direction', 'animation-fill-mode', 'animation-iteration-count', 'animation-play-state', 'animation-timing-function', '@keyframes', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-transitions'), function(browsers) { + return prefix('transition', 'transition-property', 'transition-duration', 'transition-delay', 'transition-timing-function', { + mistakes: ['-ms-'], + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/transforms2d'), function(browsers) { + return prefix('transform', 'transform-origin', { + browsers: browsers, + transition: true + }); + }); + + feature(require('caniuse-db/features-json/transforms3d'), function(browsers) { + prefix('perspective', 'perspective-origin', { + browsers: browsers, + transition: true + }); + return prefix('transform-style', 'backface-visibility', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-gradients'), function(browsers) { + browsers = map(browsers, function(browser, name, version) { + if (name === 'android' && version < 4 || name === 'ios_saf' && version < 5 || name === 'safari' && version < 5.1) { + return browser + ' old'; + } else { + return browser; + } + }); + return prefix('linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient', { + props: ['background', 'background-image', 'border-image', 'list-style', 'list-style-image', 'content'], + mistakes: ['-ms-'], + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css3-boxsizing'), function(browsers) { + return prefix('box-sizing', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-filters'), function(browsers) { + return prefix('filter', { + browsers: browsers, + transition: true + }); + }); + + feature(require('caniuse-db/features-json/multicolumn'), function(browsers) { + prefix('columns', 'column-width', 'column-gap', 'column-rule', 'column-rule-color', 'column-rule-width', { + browsers: browsers, + transition: true + }); + return prefix('column-count', 'column-rule-style', 'column-span', 'column-fill', 'break-before', 'break-after', 'break-inside', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/user-select-none'), function(browsers) { + return prefix('user-select', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/flexbox'), function(browsers) { + browsers = map(browsers, function(browser, name, version) { + if (name === 'safari' && version < 6.1) { + return browser + ' 2009'; + } else if (name === 'ios_saf' && version < 7) { + return browser + ' 2009'; + } else if (name === 'chrome' && version < 21) { + return browser + ' 2009'; + } else if (name === 'android' && version < 4.4) { + return browser + ' 2009'; + } else { + return browser; + } + }); + prefix('display-flex', 'inline-flex', { + props: ['display'], + browsers: browsers + }); + prefix('flex', 'flex-grow', 'flex-shrink', 'flex-basis', { + transition: true, + browsers: browsers + }); + return prefix('flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/calc'), function(browsers) { + return prefix('calc', { + props: ['*'], + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/background-img-opts'), function(browsers) { + return prefix('background-clip', 'background-origin', 'background-size', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/font-feature'), function(browsers) { + return prefix('font-feature-settings', 'font-variant-ligatures', 'font-language-override', 'font-kerning', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/border-image'), function(browsers) { + return prefix('border-image', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-selection'), function(browsers) { + return prefix('::selection', { + selector: true, + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-placeholder'), function(browsers) { + browsers = map(browsers, function(browser, name, version) { + if (name === 'firefox' && version <= 18) { + return browser + ' old'; + } else { + return browser; + } + }); + return prefix('::placeholder', { + selector: true, + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-hyphens'), function(browsers) { + return prefix('hyphens', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/fullscreen'), function(browsers) { + return prefix(':fullscreen', { + selector: true, + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css3-tabsize'), function(browsers) { + return prefix('tab-size', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/intrinsic-width'), function(browsers) { + return prefix('max-content', 'min-content', 'fit-content', 'fill-available', { + props: ['width', 'min-width', 'max-width', 'height', 'min-height', 'max-height'], + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css3-cursors-newer'), function(browsers) { + prefix('zoom-in', 'zoom-out', { + props: ['cursor'], + browsers: browsers.concat(['chrome 3']) + }); + return prefix('grab', 'grabbing', { + props: ['cursor'], + browsers: browsers.concat(['firefox 24', 'firefox 25', 'firefox 26']) + }); + }); + + feature(require('caniuse-db/features-json/css-sticky'), function(browsers) { + return prefix('sticky', { + props: ['position'], + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/pointer'), function(browsers) { + return prefix('touch-action', { + browsers: browsers + }); + }); + + textDecoration = require('caniuse-db/features-json/text-decoration'); + + feature(textDecoration, function(browsers) { + return prefix('text-decoration-style', { + browsers: browsers + }); + }); + + feature(textDecoration, { + full: true + }, function(browsers) { + return prefix('text-decoration-line', 'text-decoration-color', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/text-size-adjust'), function(browsers) { + return prefix('text-size-adjust', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-masks'), function(browsers) { + return prefix('clip-path', 'mask', 'mask-clip', 'mask-composite', 'mask-image', 'mask-origin', 'mask-position', 'mask-repeat', 'mask-size', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-boxdecorationbreak'), function(brwsrs) { + return prefix('box-decoration-break', { + browsers: brwsrs + }); + }); + + feature(require('caniuse-db/features-json/object-fit'), function(browsers) { + return prefix('object-fit', 'object-position', { + browsers: browsers + }); + }); + + feature(require('caniuse-db/features-json/css-shapes'), function(browsers) { + return prefix('shape-margin', 'shape-outside', 'shape-image-threshold', { + browsers: browsers + }); + }); + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/autoprefixer.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/autoprefixer.js new file mode 100644 index 0000000..7d2da2d --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/autoprefixer.js @@ -0,0 +1,107 @@ +(function() { + var Autoprefixer, Browsers, Prefixes, autoprefixer, infoCache, isPlainObject, postcss, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + postcss = require('postcss'); + + Browsers = require('./browsers'); + + Prefixes = require('./prefixes'); + + infoCache = null; + + isPlainObject = function(obj) { + return Object.prototype.toString.apply(obj) === '[object Object]'; + }; + + autoprefixer = function() { + var options, reqs; + reqs = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + if (reqs.length === 1 && isPlainObject(reqs[0])) { + options = reqs[0]; + reqs = void 0; + } else if (reqs.length === 0 || (reqs.length === 1 && (reqs[0] == null))) { + reqs = void 0; + } else if (reqs.length <= 2 && (reqs[0] instanceof Array || (reqs[0] == null))) { + options = reqs[1]; + reqs = reqs[0]; + } else if (typeof reqs[reqs.length - 1] === 'object') { + options = reqs.pop(); + } + if ((options != null ? options.browsers : void 0) != null) { + reqs = options.browsers; + } + return new Autoprefixer(autoprefixer.data, reqs, options); + }; + + autoprefixer.data = { + browsers: require('../data/browsers'), + prefixes: require('../data/prefixes') + }; + + Autoprefixer = (function() { + function Autoprefixer(data, reqs, options) { + this.data = data; + this.reqs = reqs; + this.options = options != null ? options : {}; + this.postcss = __bind(this.postcss, this); + } + + Autoprefixer.prototype.process = function(str, options) { + if (options == null) { + options = {}; + } + return postcss(this.postcss).process(str, options); + }; + + Autoprefixer.prototype.postcss = function(css) { + var prefixes; + prefixes = this.prefixes({ + from: css.source.input.file + }); + if (this.options.remove !== false) { + prefixes.processor.remove(css); + } + return prefixes.processor.add(css); + }; + + Autoprefixer.prototype.prefixes = function(opts) { + var browsers; + browsers = new Browsers(autoprefixer.data.browsers, this.reqs, opts); + return new Prefixes(autoprefixer.data.prefixes, browsers, this.options); + }; + + Autoprefixer.prototype.info = function(opts) { + infoCache || (infoCache = require('./info')); + return infoCache(this.prefixes(opts)); + }; + + return Autoprefixer; + + })(); + + autoprefixer.loadDefault = function() { + return this.defaultCache || (this.defaultCache = autoprefixer({ + browsers: this["default"] + })); + }; + + autoprefixer.process = function(str, options) { + if (options == null) { + options = {}; + } + return this.loadDefault().process(str, options); + }; + + autoprefixer.postcss = function(css) { + return autoprefixer.loadDefault().postcss(css); + }; + + autoprefixer.info = function() { + return this.loadDefault().info(); + }; + + module.exports = autoprefixer; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/browsers.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/browsers.js new file mode 100644 index 0000000..1971ce1 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/browsers.js @@ -0,0 +1,94 @@ +(function() { + var Browsers, browserslist, utils; + + browserslist = require('browserslist'); + + utils = require('./utils'); + + Browsers = (function() { + Browsers.prefixes = function() { + var data, i, name; + if (this.prefixesCache) { + return this.prefixesCache; + } + data = require('../data/browsers'); + return this.prefixesCache = utils.uniq((function() { + var _results; + _results = []; + for (name in data) { + i = data[name]; + _results.push(i.prefix); + } + return _results; + })()).sort(function(a, b) { + return b.length - a.length; + }); + }; + + Browsers.withPrefix = function(value) { + if (!this.prefixesRegexp) { + this.prefixesRegexp = RegExp("" + (this.prefixes().join('|'))); + } + return this.prefixesRegexp.test(value); + }; + + function Browsers(data, requirements, options) { + this.data = data; + this.options = options; + this.selected = this.parse(requirements); + } + + Browsers.prototype.parse = function(requirements) { + var _ref; + return browserslist(requirements, { + path: (_ref = this.options) != null ? _ref.from : void 0 + }); + }; + + Browsers.prototype.browsers = function(criteria) { + var browser, data, selected, versions, _ref; + selected = []; + _ref = this.data; + for (browser in _ref) { + data = _ref[browser]; + versions = criteria(data).map(function(version) { + return "" + browser + " " + version; + }); + selected = selected.concat(versions); + } + return selected; + }; + + Browsers.prototype.prefix = function(browser) { + var name, version, _ref; + _ref = browser.split(' '), name = _ref[0], version = _ref[1]; + if (name === 'opera' && parseFloat(version) >= 15) { + return '-webkit-'; + } else { + return this.data[name].prefix; + } + }; + + Browsers.prototype.isSelected = function(browser) { + return this.selected.indexOf(browser) !== -1; + }; + + Browsers.prototype.byName = function(name) { + var data; + name = name.toLowerCase(); + name = this.aliases[name] || name; + data = this.data[name]; + if (!data) { + utils.error("Unknown browser " + browser); + } + data.name = name; + return data; + }; + + return Browsers; + + })(); + + module.exports = Browsers; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/declaration.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/declaration.js new file mode 100644 index 0000000..a8a0214 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/declaration.js @@ -0,0 +1,153 @@ +(function() { + var Browsers, Declaration, Prefixer, utils, vendor, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Prefixer = require('./prefixer'); + + Browsers = require('./browsers'); + + vendor = require('postcss/lib/vendor'); + + utils = require('./utils'); + + Declaration = (function(_super) { + __extends(Declaration, _super); + + function Declaration() { + return Declaration.__super__.constructor.apply(this, arguments); + } + + Declaration.prototype.check = function(decl) { + return true; + }; + + Declaration.prototype.prefixed = function(prop, prefix) { + return prefix + prop; + }; + + Declaration.prototype.normalize = function(prop) { + return prop; + }; + + Declaration.prototype.otherPrefixes = function(value, prefix) { + var other, _i, _len, _ref; + _ref = Browsers.prefixes(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + other = _ref[_i]; + if (other === prefix) { + continue; + } + if (value.indexOf(other) !== -1) { + return true; + } + } + return false; + }; + + Declaration.prototype.set = function(decl, prefix) { + decl.prop = this.prefixed(decl.prop, prefix); + return decl; + }; + + Declaration.prototype.needCascade = function(decl) { + return decl._autoprefixerCascade || (decl._autoprefixerCascade = this.all.options.cascade !== false && decl.style('before').indexOf('\n') !== -1); + }; + + Declaration.prototype.maxPrefixed = function(prefixes, decl) { + var max, prefix, _i, _len; + if (decl._autoprefixerMax) { + return decl._autoprefixerMax; + } + max = 0; + for (_i = 0, _len = prefixes.length; _i < _len; _i++) { + prefix = prefixes[_i]; + prefix = utils.removeNote(prefix); + if (prefix.length > max) { + max = prefix.length; + } + } + return decl._autoprefixerMax = max; + }; + + Declaration.prototype.calcBefore = function(prefixes, decl, prefix) { + var before, diff, i, max, _i; + if (prefix == null) { + prefix = ''; + } + before = decl.style('before'); + max = this.maxPrefixed(prefixes, decl); + diff = max - utils.removeNote(prefix).length; + for (i = _i = 0; 0 <= diff ? _i < diff : _i > diff; i = 0 <= diff ? ++_i : --_i) { + before += ' '; + } + return before; + }; + + Declaration.prototype.restoreBefore = function(decl) { + var lines, min; + lines = decl.style('before').split("\n"); + min = lines[lines.length - 1]; + this.all.group(decl).up(function(prefixed) { + var array, last; + array = prefixed.style('before').split("\n"); + last = array[array.length - 1]; + if (last.length < min.length) { + return min = last; + } + }); + lines[lines.length - 1] = min; + return decl.before = lines.join("\n"); + }; + + Declaration.prototype.insert = function(decl, prefix, prefixes) { + var cloned; + cloned = this.set(this.clone(decl), prefix); + if (!cloned) { + return; + } + if (this.needCascade(decl)) { + cloned.before = this.calcBefore(prefixes, decl, prefix); + } + return decl.parent.insertBefore(decl, cloned); + }; + + Declaration.prototype.add = function(decl, prefix, prefixes) { + var already, prefixed; + prefixed = this.prefixed(decl.prop, prefix); + already = this.all.group(decl).up(function(i) { + return i.prop === prefixed; + }); + already || (already = this.all.group(decl).down(function(i) { + return i.prop === prefixed; + })); + if (already || this.otherPrefixes(decl.value, prefix)) { + return; + } + return this.insert(decl, prefix, prefixes); + }; + + Declaration.prototype.process = function(decl) { + var prefixes; + if (this.needCascade(decl)) { + prefixes = Declaration.__super__.process.apply(this, arguments); + if (prefixes != null ? prefixes.length : void 0) { + this.restoreBefore(decl); + return decl.before = this.calcBefore(prefixes, decl); + } + } else { + return Declaration.__super__.process.apply(this, arguments); + } + }; + + Declaration.prototype.old = function(prop, prefix) { + return [this.prefixed(prop, prefix)]; + }; + + return Declaration; + + })(Prefixer); + + module.exports = Declaration; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-content.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-content.js new file mode 100644 index 0000000..7488537 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-content.js @@ -0,0 +1,57 @@ +(function() { + var AlignContent, Declaration, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + AlignContent = (function(_super) { + __extends(AlignContent, _super); + + function AlignContent() { + return AlignContent.__super__.constructor.apply(this, arguments); + } + + AlignContent.names = ['align-content', 'flex-line-pack']; + + AlignContent.oldValues = { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' + }; + + AlignContent.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012) { + return prefix + 'flex-line-pack'; + } else { + return AlignContent.__super__.prefixed.apply(this, arguments); + } + }; + + AlignContent.prototype.normalize = function(prop) { + return 'align-content'; + }; + + AlignContent.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec === 2012) { + decl.value = AlignContent.oldValues[decl.value] || decl.value; + return AlignContent.__super__.set.call(this, decl, prefix); + } else if (spec === 'final') { + return AlignContent.__super__.set.apply(this, arguments); + } + }; + + return AlignContent; + + })(Declaration); + + module.exports = AlignContent; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-items.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-items.js new file mode 100644 index 0000000..71144d5 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-items.js @@ -0,0 +1,57 @@ +(function() { + var AlignItems, Declaration, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + AlignItems = (function(_super) { + __extends(AlignItems, _super); + + function AlignItems() { + return AlignItems.__super__.constructor.apply(this, arguments); + } + + AlignItems.names = ['align-items', 'flex-align', 'box-align']; + + AlignItems.oldValues = { + 'flex-end': 'end', + 'flex-start': 'start' + }; + + AlignItems.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return prefix + 'box-align'; + } else if (spec === 2012) { + return prefix + 'flex-align'; + } else { + return AlignItems.__super__.prefixed.apply(this, arguments); + } + }; + + AlignItems.prototype.normalize = function(prop) { + return 'align-items'; + }; + + AlignItems.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec === 2009 || spec === 2012) { + decl.value = AlignItems.oldValues[decl.value] || decl.value; + return AlignItems.__super__.set.call(this, decl, prefix); + } else { + return AlignItems.__super__.set.apply(this, arguments); + } + }; + + return AlignItems; + + })(Declaration); + + module.exports = AlignItems; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-self.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-self.js new file mode 100644 index 0000000..fa7e81c --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/align-self.js @@ -0,0 +1,55 @@ +(function() { + var AlignSelf, Declaration, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + AlignSelf = (function(_super) { + __extends(AlignSelf, _super); + + function AlignSelf() { + return AlignSelf.__super__.constructor.apply(this, arguments); + } + + AlignSelf.names = ['align-self', 'flex-item-align']; + + AlignSelf.oldValues = { + 'flex-end': 'end', + 'flex-start': 'start' + }; + + AlignSelf.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012) { + return prefix + 'flex-item-align'; + } else { + return AlignSelf.__super__.prefixed.apply(this, arguments); + } + }; + + AlignSelf.prototype.normalize = function(prop) { + return 'align-self'; + }; + + AlignSelf.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec === 2012) { + decl.value = AlignSelf.oldValues[decl.value] || decl.value; + return AlignSelf.__super__.set.call(this, decl, prefix); + } else if (spec === 'final') { + return AlignSelf.__super__.set.apply(this, arguments); + } + }; + + return AlignSelf; + + })(Declaration); + + module.exports = AlignSelf; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/background-size.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/background-size.js new file mode 100644 index 0000000..6ea1595 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/background-size.js @@ -0,0 +1,32 @@ +(function() { + var BackgroundSize, Declaration, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + BackgroundSize = (function(_super) { + __extends(BackgroundSize, _super); + + function BackgroundSize() { + return BackgroundSize.__super__.constructor.apply(this, arguments); + } + + BackgroundSize.names = ['background-size']; + + BackgroundSize.prototype.set = function(decl, prefix) { + var value; + value = decl.value.toLowerCase(); + if (prefix === '-webkit-' && value.indexOf(' ') === -1 && value !== 'contain' && value !== 'cover') { + decl.value = decl.value + ' ' + decl.value; + } + return BackgroundSize.__super__.set.call(this, decl, prefix); + }; + + return BackgroundSize; + + })(Declaration); + + module.exports = BackgroundSize; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-image.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-image.js new file mode 100644 index 0000000..95b430f --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-image.js @@ -0,0 +1,28 @@ +(function() { + var BorderImage, Declaration, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + BorderImage = (function(_super) { + __extends(BorderImage, _super); + + function BorderImage() { + return BorderImage.__super__.constructor.apply(this, arguments); + } + + BorderImage.names = ['border-image']; + + BorderImage.prototype.set = function(decl, prefix) { + decl.value = decl.value.replace(/\s+fill(\s)/, '$1'); + return BorderImage.__super__.set.call(this, decl, prefix); + }; + + return BorderImage; + + })(Declaration); + + module.exports = BorderImage; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-radius.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-radius.js new file mode 100644 index 0000000..97bcfa3 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/border-radius.js @@ -0,0 +1,56 @@ +(function() { + var BorderRadius, Declaration, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + BorderRadius = (function(_super) { + var hor, mozilla, normal, ver, _i, _j, _len, _len1, _ref, _ref1; + + __extends(BorderRadius, _super); + + function BorderRadius() { + return BorderRadius.__super__.constructor.apply(this, arguments); + } + + BorderRadius.names = ['border-radius']; + + BorderRadius.toMozilla = {}; + + BorderRadius.toNormal = {}; + + _ref = ['top', 'bottom']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + ver = _ref[_i]; + _ref1 = ['left', 'right']; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + hor = _ref1[_j]; + normal = "border-" + ver + "-" + hor + "-radius"; + mozilla = "border-radius-" + ver + hor; + BorderRadius.names.push(normal); + BorderRadius.names.push(mozilla); + BorderRadius.toMozilla[normal] = mozilla; + BorderRadius.toNormal[mozilla] = normal; + } + } + + BorderRadius.prototype.prefixed = function(prop, prefix) { + if (prefix === '-moz-') { + return prefix + (BorderRadius.toMozilla[prop] || prop); + } else { + return BorderRadius.__super__.prefixed.apply(this, arguments); + } + }; + + BorderRadius.prototype.normalize = function(prop) { + return BorderRadius.toNormal[prop] || prop; + }; + + return BorderRadius; + + })(Declaration); + + module.exports = BorderRadius; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/break-inside.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/break-inside.js new file mode 100644 index 0000000..baeafaf --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/break-inside.js @@ -0,0 +1,54 @@ +(function() { + var BreakInside, Declaration, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + BreakInside = (function(_super) { + __extends(BreakInside, _super); + + function BreakInside() { + return BreakInside.__super__.constructor.apply(this, arguments); + } + + BreakInside.names = ['break-inside', 'page-break-inside', 'column-break-inside']; + + BreakInside.prototype.prefixed = function(prop, prefix) { + if (prefix === '-webkit-') { + return prefix + 'column-break-inside'; + } else if (prefix === '-moz-') { + return 'page-break-inside'; + } else { + return BreakInside.__super__.prefixed.apply(this, arguments); + } + }; + + BreakInside.prototype.normalize = function() { + return 'break-inside'; + }; + + BreakInside.prototype.set = function(decl, prefix) { + if (decl.value === 'avoid-column' || decl.value === 'avoid-page') { + decl.value = 'avoid'; + } + return BreakInside.__super__.set.apply(this, arguments); + }; + + BreakInside.prototype.insert = function(decl, prefix, prefixes) { + if (decl.value === 'avoid-region') { + + } else if (decl.value === 'avoid-page' && prefix === '-webkit-') { + + } else { + return BreakInside.__super__.insert.apply(this, arguments); + } + }; + + return BreakInside; + + })(Declaration); + + module.exports = BreakInside; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/display-flex.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/display-flex.js new file mode 100644 index 0000000..39bf302 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/display-flex.js @@ -0,0 +1,67 @@ +(function() { + var DisplayFlex, OldDisplayFlex, OldValue, Value, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + OldValue = require('../old-value'); + + Value = require('../value'); + + OldDisplayFlex = (function(_super) { + __extends(OldDisplayFlex, _super); + + function OldDisplayFlex(name) { + this.name = name; + } + + OldDisplayFlex.prototype.check = function(value) { + return value === this.name; + }; + + return OldDisplayFlex; + + })(OldValue); + + DisplayFlex = (function(_super) { + __extends(DisplayFlex, _super); + + DisplayFlex.names = ['display-flex', 'inline-flex']; + + function DisplayFlex(name, prefixes) { + DisplayFlex.__super__.constructor.apply(this, arguments); + if (name === 'display-flex') { + this.name = 'flex'; + } + } + + DisplayFlex.prototype.check = function(decl) { + return decl.value === this.name; + }; + + DisplayFlex.prototype.prefixed = function(prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + return prefix + (spec === 2009 ? this.name === 'flex' ? 'box' : 'inline-box' : spec === 2012 ? this.name === 'flex' ? 'flexbox' : 'inline-flexbox' : spec === 'final' ? this.name : void 0); + }; + + DisplayFlex.prototype.replace = function(string, prefix) { + return this.prefixed(prefix); + }; + + DisplayFlex.prototype.old = function(prefix) { + var prefixed; + prefixed = this.prefixed(prefix); + if (prefixed) { + return new OldValue(prefixed); + } + }; + + return DisplayFlex; + + })(Value); + + module.exports = DisplayFlex; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fill-available.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fill-available.js new file mode 100644 index 0000000..f959465 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fill-available.js @@ -0,0 +1,41 @@ +(function() { + var FillAvailable, OldValue, Value, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + OldValue = require('../old-value'); + + Value = require('../value'); + + FillAvailable = (function(_super) { + __extends(FillAvailable, _super); + + function FillAvailable() { + return FillAvailable.__super__.constructor.apply(this, arguments); + } + + FillAvailable.names = ['fill-available']; + + FillAvailable.prototype.replace = function(string, prefix) { + if (prefix === '-moz-') { + return string.replace(this.regexp(), '$1-moz-available$3'); + } else { + return FillAvailable.__super__.replace.apply(this, arguments); + } + }; + + FillAvailable.prototype.old = function(prefix) { + if (prefix === '-moz-') { + return new OldValue('-moz-available'); + } else { + return FillAvailable.__super__.old.apply(this, arguments); + } + }; + + return FillAvailable; + + })(Value); + + module.exports = FillAvailable; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter-value.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter-value.js new file mode 100644 index 0000000..88d75f2 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter-value.js @@ -0,0 +1,35 @@ +(function() { + var FilterValue, Value, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Value = require('../value'); + + FilterValue = (function(_super) { + __extends(FilterValue, _super); + + function FilterValue() { + return FilterValue.__super__.constructor.apply(this, arguments); + } + + FilterValue.names = ['filter']; + + FilterValue.prototype.replace = function(value, prefix) { + if (prefix === '-webkit-') { + if (value.indexOf('-webkit-filter') === -1) { + return FilterValue.__super__.replace.apply(this, arguments) + ', ' + value; + } else { + return value; + } + } else { + return FilterValue.__super__.replace.apply(this, arguments); + } + }; + + return FilterValue; + + })(Value); + + module.exports = FilterValue; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter.js new file mode 100644 index 0000000..e7be7e2 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/filter.js @@ -0,0 +1,29 @@ +(function() { + var Declaration, Filter, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + Filter = (function(_super) { + __extends(Filter, _super); + + function Filter() { + return Filter.__super__.constructor.apply(this, arguments); + } + + Filter.names = ['filter']; + + Filter.prototype.check = function(decl) { + var v; + v = decl.value; + return v.toLowerCase().indexOf('alpha(') === -1 && v.indexOf('DXImageTransform.Microsoft') === -1 && v.indexOf('data:image/svg+xml') === -1; + }; + + return Filter; + + })(Declaration); + + module.exports = Filter; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-basis.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-basis.js new file mode 100644 index 0000000..1aaa3f4 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-basis.js @@ -0,0 +1,47 @@ +(function() { + var Declaration, FlexBasis, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + FlexBasis = (function(_super) { + __extends(FlexBasis, _super); + + function FlexBasis() { + return FlexBasis.__super__.constructor.apply(this, arguments); + } + + FlexBasis.names = ['flex-basis', 'flex-preferred-size']; + + FlexBasis.prototype.normalize = function() { + return 'flex-basis'; + }; + + FlexBasis.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012) { + return prefix + 'flex-preferred-size'; + } else { + return FlexBasis.__super__.prefixed.apply(this, arguments); + } + }; + + FlexBasis.prototype.set = function(decl, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012 || spec === 'final') { + return FlexBasis.__super__.set.apply(this, arguments); + } + }; + + return FlexBasis; + + })(Declaration); + + module.exports = FlexBasis; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-direction.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-direction.js new file mode 100644 index 0000000..bf2fd30 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-direction.js @@ -0,0 +1,71 @@ +(function() { + var Declaration, FlexDirection, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + FlexDirection = (function(_super) { + __extends(FlexDirection, _super); + + function FlexDirection() { + return FlexDirection.__super__.constructor.apply(this, arguments); + } + + FlexDirection.names = ['flex-direction', 'box-direction', 'box-orient']; + + FlexDirection.prototype.normalize = function(prop) { + return 'flex-direction'; + }; + + FlexDirection.prototype.insert = function(decl, prefix, prefixes) { + var already, cloned, dir, orient, spec, value, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + already = decl.parent.some(function(i) { + return i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'; + }); + if (already) { + return; + } + value = decl.value; + orient = value.indexOf('row') !== -1 ? 'horizontal' : 'vertical'; + dir = value.indexOf('reverse') !== -1 ? 'reverse' : 'normal'; + cloned = this.clone(decl); + cloned.prop = prefix + 'box-orient'; + cloned.value = orient; + if (this.needCascade(decl)) { + cloned.before = this.calcBefore(prefixes, decl, prefix); + } + decl.parent.insertBefore(decl, cloned); + cloned = this.clone(decl); + cloned.prop = prefix + 'box-direction'; + cloned.value = dir; + if (this.needCascade(decl)) { + cloned.before = this.calcBefore(prefixes, decl, prefix); + } + return decl.parent.insertBefore(decl, cloned); + } else { + return FlexDirection.__super__.insert.apply(this, arguments); + } + }; + + FlexDirection.prototype.old = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return [prefix + 'box-orient', prefix + 'box-direction']; + } else { + return FlexDirection.__super__.old.apply(this, arguments); + } + }; + + return FlexDirection; + + })(Declaration); + + module.exports = FlexDirection; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-flow.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-flow.js new file mode 100644 index 0000000..011199b --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-flow.js @@ -0,0 +1,35 @@ +(function() { + var Declaration, FlexFlow, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + FlexFlow = (function(_super) { + __extends(FlexFlow, _super); + + function FlexFlow() { + return FlexFlow.__super__.constructor.apply(this, arguments); + } + + FlexFlow.names = ['flex-flow']; + + FlexFlow.prototype.set = function(decl, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012) { + return FlexFlow.__super__.set.apply(this, arguments); + } else if (spec === 'final') { + return FlexFlow.__super__.set.apply(this, arguments); + } + }; + + return FlexFlow; + + })(Declaration); + + module.exports = FlexFlow; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-grow.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-grow.js new file mode 100644 index 0000000..7bbcada --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-grow.js @@ -0,0 +1,41 @@ +(function() { + var Declaration, Flex, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + Flex = (function(_super) { + __extends(Flex, _super); + + function Flex() { + return Flex.__super__.constructor.apply(this, arguments); + } + + Flex.names = ['flex-grow', 'flex-positive']; + + Flex.prototype.normalize = function() { + return 'flex'; + }; + + Flex.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return prefix + 'box-flex'; + } else if (spec === 2012) { + return prefix + 'flex-positive'; + } else { + return Flex.__super__.prefixed.apply(this, arguments); + } + }; + + return Flex; + + })(Declaration); + + module.exports = Flex; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-shrink.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-shrink.js new file mode 100644 index 0000000..2b48910 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-shrink.js @@ -0,0 +1,47 @@ +(function() { + var Declaration, FlexShrink, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + FlexShrink = (function(_super) { + __extends(FlexShrink, _super); + + function FlexShrink() { + return FlexShrink.__super__.constructor.apply(this, arguments); + } + + FlexShrink.names = ['flex-shrink', 'flex-negative']; + + FlexShrink.prototype.normalize = function() { + return 'flex-shrink'; + }; + + FlexShrink.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012) { + return prefix + 'flex-negative'; + } else { + return FlexShrink.__super__.prefixed.apply(this, arguments); + } + }; + + FlexShrink.prototype.set = function(decl, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2012 || spec === 'final') { + return FlexShrink.__super__.set.apply(this, arguments); + } + }; + + return FlexShrink; + + })(Declaration); + + module.exports = FlexShrink; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-spec.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-spec.js new file mode 100644 index 0000000..59ec38e --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-spec.js @@ -0,0 +1,11 @@ +(function() { + module.exports = function(prefix) { + var spec; + spec = prefix === '-webkit- 2009' || prefix === '-moz-' ? 2009 : prefix === '-ms-' ? 2012 : prefix === '-webkit-' ? 'final' : void 0; + if (prefix === '-webkit- 2009') { + prefix = '-webkit-'; + } + return [spec, prefix]; + }; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-wrap.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-wrap.js new file mode 100644 index 0000000..f7ffddc --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex-wrap.js @@ -0,0 +1,33 @@ +(function() { + var Declaration, FlexWrap, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + FlexWrap = (function(_super) { + __extends(FlexWrap, _super); + + function FlexWrap() { + return FlexWrap.__super__.constructor.apply(this, arguments); + } + + FlexWrap.names = ['flex-wrap']; + + FlexWrap.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec !== 2009) { + return FlexWrap.__super__.set.apply(this, arguments); + } + }; + + return FlexWrap; + + })(Declaration); + + module.exports = FlexWrap; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex.js new file mode 100644 index 0000000..8d63426 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/flex.js @@ -0,0 +1,56 @@ +(function() { + var Declaration, Flex, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + Flex = (function(_super) { + __extends(Flex, _super); + + function Flex() { + return Flex.__super__.constructor.apply(this, arguments); + } + + Flex.names = ['flex', 'box-flex']; + + Flex.oldValues = { + 'auto': '1', + 'none': '0' + }; + + Flex.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return prefix + 'box-flex'; + } else { + return Flex.__super__.prefixed.apply(this, arguments); + } + }; + + Flex.prototype.normalize = function() { + return 'flex'; + }; + + Flex.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec === 2009) { + decl.value = decl.value.split(' ')[0]; + decl.value = Flex.oldValues[decl.value] || decl.value; + return Flex.__super__.set.call(this, decl, prefix); + } else { + return Flex.__super__.set.apply(this, arguments); + } + }; + + return Flex; + + })(Declaration); + + module.exports = Flex; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fullscreen.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fullscreen.js new file mode 100644 index 0000000..f8a601f --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/fullscreen.js @@ -0,0 +1,33 @@ +(function() { + var Fullscreen, Selector, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Selector = require('../selector'); + + Fullscreen = (function(_super) { + __extends(Fullscreen, _super); + + function Fullscreen() { + return Fullscreen.__super__.constructor.apply(this, arguments); + } + + Fullscreen.names = [':fullscreen']; + + Fullscreen.prototype.prefixed = function(prefix) { + if ('-webkit-' === prefix) { + return ':-webkit-full-screen'; + } else if ('-moz-' === prefix) { + return ':-moz-full-screen'; + } else { + return ":" + prefix + "fullscreen"; + } + }; + + return Fullscreen; + + })(Selector); + + module.exports = Fullscreen; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/gradient.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/gradient.js new file mode 100644 index 0000000..a7ae243 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/gradient.js @@ -0,0 +1,229 @@ +(function() { + var Gradient, OldValue, Value, isDirection, list, utils, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + OldValue = require('../old-value'); + + Value = require('../value'); + + utils = require('../utils'); + + list = require('postcss/lib/list'); + + isDirection = /top|left|right|bottom/gi; + + Gradient = (function(_super) { + __extends(Gradient, _super); + + function Gradient() { + return Gradient.__super__.constructor.apply(this, arguments); + } + + Gradient.names = ['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient']; + + Gradient.prototype.replace = function(string, prefix) { + return list.space(string).map((function(_this) { + return function(value) { + var after, args, close, params; + if (value.slice(0, +_this.name.length + 1 || 9e9) !== _this.name + '(') { + return value; + } + close = value.lastIndexOf(')'); + after = value.slice(close + 1); + args = value.slice(_this.name.length + 1, +(close - 1) + 1 || 9e9); + params = list.comma(args); + params = _this.newDirection(params); + if (prefix === '-webkit- old') { + if (args.indexOf('px') === -1) { + return _this.oldWebkit(value, args, params, after); + } + } else { + _this.convertDirection(params); + return prefix + _this.name + '(' + params.join(', ') + ')' + after; + } + }; + })(this)).join(' '); + }; + + Gradient.prototype.directions = { + top: 'bottom', + left: 'right', + bottom: 'top', + right: 'left' + }; + + Gradient.prototype.oldDirections = { + 'top': 'left bottom, left top', + 'left': 'right top, left top', + 'bottom': 'left top, left bottom', + 'right': 'left top, right top', + 'top right': 'left bottom, right top', + 'top left': 'right bottom, left top', + 'right top': 'left bottom, right top', + 'right bottom': 'left top, right bottom', + 'bottom right': 'left top, right bottom', + 'bottom left': 'right top, left bottom', + 'left top': 'right bottom, left top', + 'left bottom': 'right top, left bottom' + }; + + Gradient.prototype.newDirection = function(params) { + var first, value; + first = params[0]; + if (first.indexOf('to ') === -1 && isDirection.test(first)) { + first = first.split(' '); + first = (function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = first.length; _i < _len; _i++) { + value = first[_i]; + _results.push(this.directions[value.toLowerCase()] || value); + } + return _results; + }).call(this); + params[0] = 'to ' + first.join(' '); + } + return params; + }; + + Gradient.prototype.oldWebkit = function(value, args, params, after) { + if (this.name !== 'linear-gradient') { + return value; + } + if (params[0] && params[0].indexOf('deg') !== -1) { + return value; + } + if (args.indexOf('-corner') !== -1) { + return value; + } + if (args.indexOf('-side') !== -1) { + return value; + } + params = this.oldDirection(params); + params = this.colorStops(params); + return '-webkit-gradient(linear, ' + params.join(', ') + ')' + after; + }; + + Gradient.prototype.convertDirection = function(params) { + if (params.length > 0) { + if (params[0].slice(0, 3) === 'to ') { + return params[0] = this.fixDirection(params[0]); + } else if (params[0].indexOf('deg') !== -1) { + return params[0] = this.fixAngle(params[0]); + } else if (params[0].indexOf(' at ') !== -1) { + return this.fixRadial(params); + } + } + }; + + Gradient.prototype.fixDirection = function(param) { + var value; + param = param.split(' '); + param.splice(0, 1); + param = (function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = param.length; _i < _len; _i++) { + value = param[_i]; + _results.push(this.directions[value.toLowerCase()] || value); + } + return _results; + }).call(this); + return param.join(' '); + }; + + Gradient.prototype.roundFloat = function(float, digits) { + return parseFloat(float.toFixed(digits)); + }; + + Gradient.prototype.fixAngle = function(param) { + param = parseFloat(param); + param = Math.abs(450 - param) % 360; + param = this.roundFloat(param, 3); + return "" + param + "deg"; + }; + + Gradient.prototype.oldDirection = function(params) { + var direction; + if (params.length === 0) { + params; + } + if (params[0].indexOf('to ') !== -1) { + direction = params[0].replace(/^to\s+/, ''); + direction = this.oldDirections[direction]; + params[0] = direction; + return params; + } else { + direction = this.oldDirections.bottom; + return [direction].concat(params); + } + }; + + Gradient.prototype.colorStops = function(params) { + return params.map(function(param, i) { + var color, match, position, _ref; + if (i === 0) { + return param; + } + _ref = list.space(param), color = _ref[0], position = _ref[1]; + if (position == null) { + match = param.match(/^(.*\))(\d.*)$/); + if (match) { + color = match[1]; + position = match[2]; + } + } + if (position && position.indexOf(')') !== -1) { + color += ' ' + position; + position = void 0; + } + if (i === 1 && (position === void 0 || position === '0%')) { + return "from(" + color + ")"; + } else if (i === params.length - 1 && (position === void 0 || position === '100%')) { + return "to(" + color + ")"; + } else if (position) { + return "color-stop(" + position + ", " + color + ")"; + } else { + return "color-stop(" + color + ")"; + } + }); + }; + + Gradient.prototype.fixRadial = function(params) { + var first; + first = params[0].split(/\s+at\s+/); + return params.splice(0, 1, first[1], first[0]); + }; + + Gradient.prototype.old = function(prefix) { + var regexp, string, type; + if (prefix === '-webkit-') { + type = this.name === 'linear-gradient' ? 'linear' : 'radial'; + string = '-gradient'; + regexp = utils.regexp("-webkit-(" + type + "-gradient|gradient\\(\\s*" + type + ")", false); + return new OldValue(prefix + this.name, string, regexp); + } else { + return Gradient.__super__.old.apply(this, arguments); + } + }; + + Gradient.prototype.add = function(decl, prefix) { + var prop; + prop = decl.prop; + if (prop === 'list-style' || prop === 'list-style-image' || prop === 'content') { + if (prefix === '-webkit-' || prefix === '-webkit- old') { + return Gradient.__super__.add.apply(this, arguments); + } + } else { + return Gradient.__super__.add.apply(this, arguments); + } + }; + + return Gradient; + + })(Value); + + module.exports = Gradient; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/justify-content.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/justify-content.js new file mode 100644 index 0000000..1a7554b --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/justify-content.js @@ -0,0 +1,62 @@ +(function() { + var Declaration, JustifyContent, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + JustifyContent = (function(_super) { + __extends(JustifyContent, _super); + + function JustifyContent() { + return JustifyContent.__super__.constructor.apply(this, arguments); + } + + JustifyContent.names = ['justify-content', 'flex-pack', 'box-pack']; + + JustifyContent.oldValues = { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' + }; + + JustifyContent.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return prefix + 'box-pack'; + } else if (spec === 2012) { + return prefix + 'flex-pack'; + } else { + return JustifyContent.__super__.prefixed.apply(this, arguments); + } + }; + + JustifyContent.prototype.normalize = function(prop) { + return 'justify-content'; + }; + + JustifyContent.prototype.set = function(decl, prefix) { + var spec, value; + spec = flexSpec(prefix)[0]; + if (spec === 2009 || spec === 2012) { + value = JustifyContent.oldValues[decl.value] || decl.value; + decl.value = value; + if (spec !== 2009 || value !== 'distribute') { + return JustifyContent.__super__.set.call(this, decl, prefix); + } + } else if (spec === 'final') { + return JustifyContent.__super__.set.apply(this, arguments); + } + }; + + return JustifyContent; + + })(Declaration); + + module.exports = JustifyContent; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/order.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/order.js new file mode 100644 index 0000000..4a1c619 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/order.js @@ -0,0 +1,52 @@ +(function() { + var Declaration, Order, flexSpec, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + flexSpec = require('./flex-spec'); + + Declaration = require('../declaration'); + + Order = (function(_super) { + __extends(Order, _super); + + function Order() { + return Order.__super__.constructor.apply(this, arguments); + } + + Order.names = ['order', 'flex-order', 'box-ordinal-group']; + + Order.prototype.prefixed = function(prop, prefix) { + var spec, _ref; + _ref = flexSpec(prefix), spec = _ref[0], prefix = _ref[1]; + if (spec === 2009) { + return prefix + 'box-ordinal-group'; + } else if (spec === 2012) { + return prefix + 'flex-order'; + } else { + return Order.__super__.prefixed.apply(this, arguments); + } + }; + + Order.prototype.normalize = function(prop) { + return 'order'; + }; + + Order.prototype.set = function(decl, prefix) { + var spec; + spec = flexSpec(prefix)[0]; + if (spec === 2009) { + decl.value = (parseInt(decl.value) + 1).toString(); + return Order.__super__.set.call(this, decl, prefix); + } else { + return Order.__super__.set.apply(this, arguments); + } + }; + + return Order; + + })(Declaration); + + module.exports = Order; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/placeholder.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/placeholder.js new file mode 100644 index 0000000..16b9f3b --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/placeholder.js @@ -0,0 +1,39 @@ +(function() { + var Placeholder, Selector, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Selector = require('../selector'); + + Placeholder = (function(_super) { + __extends(Placeholder, _super); + + function Placeholder() { + return Placeholder.__super__.constructor.apply(this, arguments); + } + + Placeholder.names = ['::placeholder']; + + Placeholder.prototype.possible = function() { + return Placeholder.__super__.possible.apply(this, arguments).concat('-moz- old'); + }; + + Placeholder.prototype.prefixed = function(prefix) { + if ('-webkit-' === prefix) { + return '::-webkit-input-placeholder'; + } else if ('-ms-' === prefix) { + return ':-ms-input-placeholder'; + } else if ('-moz- old' === prefix) { + return ':-moz-placeholder'; + } else { + return "::" + prefix + "placeholder"; + } + }; + + return Placeholder; + + })(Selector); + + module.exports = Placeholder; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-decl.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-decl.js new file mode 100644 index 0000000..1d5e09f --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-decl.js @@ -0,0 +1,66 @@ +(function() { + var Declaration, TransformDecl, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Declaration = require('../declaration'); + + TransformDecl = (function(_super) { + __extends(TransformDecl, _super); + + function TransformDecl() { + return TransformDecl.__super__.constructor.apply(this, arguments); + } + + TransformDecl.names = ['transform', 'transform-origin']; + + TransformDecl.functions3d = ['matrix3d', 'translate3d', 'translateZ', 'scale3d', 'scaleZ', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'perspective']; + + TransformDecl.prototype.keykrameParents = function(decl) { + var parent; + parent = decl.parent; + while (parent) { + if (parent.type === 'atrule' && parent.name === 'keyframes') { + return true; + } + parent = parent.parent; + } + return false; + }; + + TransformDecl.prototype.contain3d = function(decl) { + var func, _i, _len, _ref; + if (decl.prop === 'transform-origin') { + return false; + } + _ref = TransformDecl.functions3d; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + func = _ref[_i]; + if (decl.value.indexOf("" + func + "(") !== -1) { + return true; + } + } + return false; + }; + + TransformDecl.prototype.insert = function(decl, prefix, prefixes) { + if (prefix === '-ms-') { + if (!this.contain3d(decl) && !this.keykrameParents(decl)) { + return TransformDecl.__super__.insert.apply(this, arguments); + } + } else if (prefix === '-o-') { + if (!this.contain3d(decl)) { + return TransformDecl.__super__.insert.apply(this, arguments); + } + } else { + return TransformDecl.__super__.insert.apply(this, arguments); + } + }; + + return TransformDecl; + + })(Declaration); + + module.exports = TransformDecl; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-value.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-value.js new file mode 100644 index 0000000..5242f9d --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transform-value.js @@ -0,0 +1,31 @@ +(function() { + var TransformValue, Value, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Value = require('../value'); + + TransformValue = (function(_super) { + __extends(TransformValue, _super); + + function TransformValue() { + return TransformValue.__super__.constructor.apply(this, arguments); + } + + TransformValue.names = ['transform']; + + TransformValue.prototype.replace = function(value, prefix) { + if (prefix === '-ms-') { + return value; + } else { + return TransformValue.__super__.replace.apply(this, arguments); + } + }; + + return TransformValue; + + })(Value); + + module.exports = TransformValue; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transition.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transition.js new file mode 100644 index 0000000..70306f3 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/hacks/transition.js @@ -0,0 +1,37 @@ +(function() { + var OldValue, Transition, Value, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + OldValue = require('../old-value'); + + Value = require('../value'); + + Transition = (function(_super) { + __extends(Transition, _super); + + function Transition() { + return Transition.__super__.constructor.apply(this, arguments); + } + + Transition.names = ['flex', 'flex-grow', 'flex-shrink', 'flex-basis']; + + Transition.prototype.prefixed = function(prefix) { + return this.all.prefixed(this.name, prefix); + }; + + Transition.prototype.replace = function(string, prefix) { + return string.replace(this.regexp(), '$1' + this.prefixed(prefix) + '$3'); + }; + + Transition.prototype.old = function(prefix) { + return new OldValue(this.prefixed(prefix)); + }; + + return Transition; + + })(Value); + + module.exports = Transition; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/info.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/info.js new file mode 100644 index 0000000..ee4af61 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/info.js @@ -0,0 +1,122 @@ +(function() { + var capitalize, names, prefix; + + capitalize = function(str) { + return str.slice(0, 1).toUpperCase() + str.slice(1); + }; + + names = { + ie: 'IE', + ie_mob: 'IE Mobile', + ios_saf: 'iOS', + op_mini: 'Opera Mini', + op_mob: 'Opera Mobile', + and_chr: 'Chrome for Android', + and_ff: 'Firefox for Android', + and_uc: 'UC for Android' + }; + + prefix = function(name, transition, prefixes) { + var out; + out = ' ' + name + (transition ? '*' : '') + ': '; + out += prefixes.map(function(i) { + return i.replace(/^-(.*)-$/g, '$1'); + }).join(', '); + out += "\n"; + return out; + }; + + module.exports = function(prefixes) { + var atrules, browser, data, list, name, needTransition, out, props, selector, selectors, string, transitionProp, useTransition, value, values, version, versions, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6; + if (prefixes.browsers.selected.length === 0) { + return "No browsers selected"; + } + versions = []; + _ref = prefixes.browsers.selected; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + browser = _ref[_i]; + _ref1 = browser.split(' '), name = _ref1[0], version = _ref1[1]; + name = names[name] || capitalize(name); + if (versions[name]) { + versions[name].push(version); + } else { + versions[name] = [version]; + } + } + out = "Browsers:\n"; + for (browser in versions) { + list = versions[browser]; + list = list.sort(function(a, b) { + return parseFloat(b) - parseFloat(a); + }); + out += ' ' + browser + ': ' + list.join(', ') + "\n"; + } + atrules = ''; + _ref2 = prefixes.add; + for (name in _ref2) { + data = _ref2[name]; + if (name[0] === '@' && data.prefixes) { + atrules += prefix(name, false, data.prefixes); + } + } + if (atrules !== '') { + out += "\nAt-Rules:\n" + atrules; + } + selectors = ''; + _ref3 = prefixes.add.selectors; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + selector = _ref3[_j]; + if (selector.prefixes) { + selectors += prefix(selector.name, false, selector.prefixes); + } + } + if (selectors !== '') { + out += "\nSelectors:\n" + selectors; + } + values = ''; + props = ''; + useTransition = false; + needTransition = (_ref4 = prefixes.add.transition) != null ? _ref4.prefixes : void 0; + _ref5 = prefixes.add; + for (name in _ref5) { + data = _ref5[name]; + if (name[0] !== '@' && data.prefixes) { + transitionProp = needTransition && prefixes.data[name].transition; + if (transitionProp) { + useTransition = true; + } + props += prefix(name, transitionProp, data.prefixes); + } + if (!data.values) { + continue; + } + if (prefixes.transitionProps.some(function(i) { + return i === name; + })) { + continue; + } + _ref6 = data.values; + for (_k = 0, _len2 = _ref6.length; _k < _len2; _k++) { + value = _ref6[_k]; + string = prefix(value.name, false, value.prefixes); + if (values.indexOf(string) === -1) { + values += string; + } + } + } + if (useTransition) { + props += " * - can be used in transition\n"; + } + if (props !== '') { + out += "\nProperties:\n" + props; + } + if (values !== '') { + out += "\nValues:\n" + values; + } + if (atrules === '' && selectors === '' && props === '' && values === '') { + out += '\nAwesome! Your browsers don\'t require any vendor prefixes.' + '\nNow you can remove Autoprefixer from build steps.'; + } + return out; + }; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/keyframes.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/keyframes.js new file mode 100644 index 0000000..28f75be --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/keyframes.js @@ -0,0 +1,51 @@ +(function() { + var Keyframes, Prefixer, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Prefixer = require('./prefixer'); + + Keyframes = (function(_super) { + __extends(Keyframes, _super); + + function Keyframes() { + return Keyframes.__super__.constructor.apply(this, arguments); + } + + Keyframes.prototype.add = function(atRule, prefix) { + var already, cloned, prefixed; + prefixed = prefix + atRule.name; + already = atRule.parent.some(function(i) { + return i.name === prefixed && i.params === atRule.params; + }); + if (already) { + return; + } + cloned = this.clone(atRule, { + name: prefixed + }); + return atRule.parent.insertBefore(atRule, cloned); + }; + + Keyframes.prototype.process = function(node) { + var parent, prefix, _i, _len, _ref, _results; + parent = this.parentPrefix(node); + _ref = this.prefixes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prefix = _ref[_i]; + if (parent && parent !== prefix) { + continue; + } + _results.push(this.add(node, prefix)); + } + return _results; + }; + + return Keyframes; + + })(Prefixer); + + module.exports = Keyframes; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-selector.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-selector.js new file mode 100644 index 0000000..1b3e18c --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-selector.js @@ -0,0 +1,68 @@ +(function() { + var OldSelector; + + OldSelector = (function() { + function OldSelector(selector, prefix) { + var _i, _len, _ref; + this.prefix = prefix; + this.prefixed = selector.prefixed(this.prefix); + this.regexp = selector.regexp(this.prefix); + this.prefixeds = []; + _ref = selector.possible(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prefix = _ref[_i]; + this.prefixeds.push([selector.prefixed(prefix), selector.regexp(prefix)]); + } + this.unprefixed = selector.name; + this.nameRegexp = selector.regexp(); + } + + OldSelector.prototype.isHack = function(rule) { + var before, index, regexp, rules, some, string, _i, _len, _ref, _ref1; + index = rule.parent.index(rule) + 1; + rules = rule.parent.nodes; + while (index < rules.length) { + before = rules[index].selector; + if (!before) { + return true; + } + if (before.indexOf(this.unprefixed) !== -1 && before.match(this.nameRegexp)) { + return false; + } + some = false; + _ref = this.prefixeds; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + _ref1 = _ref[_i], string = _ref1[0], regexp = _ref1[1]; + if (before.indexOf(string) !== -1 && before.match(regexp)) { + some = true; + break; + } + } + if (!some) { + return true; + } + index += 1; + } + return true; + }; + + OldSelector.prototype.check = function(rule) { + if (rule.selector.indexOf(this.prefixed) === -1) { + return false; + } + if (!rule.selector.match(this.regexp)) { + return false; + } + if (this.isHack(rule)) { + return false; + } + return true; + }; + + return OldSelector; + + })(); + + module.exports = OldSelector; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-value.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-value.js new file mode 100644 index 0000000..38819e2 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/old-value.js @@ -0,0 +1,29 @@ +(function() { + var OldValue, utils; + + utils = require('./utils'); + + OldValue = (function() { + function OldValue(name, string, regexp) { + this.name = name; + this.string = string; + this.regexp = regexp; + this.regexp || (this.regexp = utils.regexp(this.name)); + this.string || (this.string = this.name); + } + + OldValue.prototype.check = function(value) { + if (value.indexOf(this.string) !== -1) { + return !!value.match(this.regexp); + } else { + return false; + } + }; + + return OldValue; + + })(); + + module.exports = OldValue; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixer.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixer.js new file mode 100644 index 0000000..0ef08f8 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixer.js @@ -0,0 +1,95 @@ +(function() { + var Browsers, Prefixer, utils, vendor; + + Browsers = require('./browsers'); + + vendor = require('postcss/lib/vendor'); + + utils = require('./utils'); + + Prefixer = (function() { + Prefixer.hack = function(klass) { + var name, _i, _len, _ref, _results; + this.hacks || (this.hacks = {}); + _ref = klass.names; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + _results.push(this.hacks[name] = klass); + } + return _results; + }; + + Prefixer.load = function(name, prefixes, all) { + var klass, _ref; + klass = (_ref = this.hacks) != null ? _ref[name] : void 0; + if (klass) { + return new klass(name, prefixes, all); + } else { + return new this(name, prefixes, all); + } + }; + + Prefixer.clone = function(node, overrides) { + var cloned; + cloned = node.clone(overrides); + if (node.type === 'decl') { + cloned.between = node.between; + cloned.before = node.before; + } + delete cloned._autoprefixerPrefix; + delete cloned._autoprefixerValues; + return cloned; + }; + + function Prefixer(name, prefixes, all) { + this.name = name; + this.prefixes = prefixes; + this.all = all; + } + + Prefixer.prototype.parentPrefix = function(node) { + var prefix; + prefix = node._autoprefixerPrefix != null ? node._autoprefixerPrefix : node.type === 'decl' && node.prop[0] === '-' ? vendor.prefix(node.prop) : node.type === 'root' ? false : node.type === 'rule' && node.selector.indexOf(':-') !== -1 ? node.selector.match(/:(-\w+-)/)[1] : node.type === 'atrule' && node.name[0] === '-' ? vendor.prefix(node.name) : this.parentPrefix(node.parent); + if (Browsers.prefixes().indexOf(prefix) === -1) { + prefix = false; + } + return node._autoprefixerPrefix = prefix; + }; + + Prefixer.prototype.process = function(node) { + var added, parent, prefix, prefixes, _i, _j, _len, _len1, _ref; + if (!this.check(node)) { + return; + } + parent = this.parentPrefix(node); + prefixes = []; + _ref = this.prefixes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prefix = _ref[_i]; + if (parent && parent !== utils.removeNote(prefix)) { + continue; + } + prefixes.push(prefix); + } + added = []; + for (_j = 0, _len1 = prefixes.length; _j < _len1; _j++) { + prefix = prefixes[_j]; + if (this.add(node, prefix, added.concat([prefix]))) { + added.push(prefix); + } + } + return added; + }; + + Prefixer.prototype.clone = function(node, overrides) { + return Prefixer.clone(node, overrides); + }; + + return Prefixer; + + })(); + + module.exports = Prefixer; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixes.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixes.js new file mode 100644 index 0000000..5eff191 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/prefixes.js @@ -0,0 +1,354 @@ +(function() { + var Browsers, Declaration, Keyframes, Prefixes, Processor, Selector, Supports, Value, declsCache, utils, vendor; + + utils = require('./utils'); + + vendor = require('postcss/lib/vendor'); + + Declaration = require('./declaration'); + + Processor = require('./processor'); + + Keyframes = require('./keyframes'); + + Supports = require('./supports'); + + Browsers = require('./browsers'); + + Selector = require('./selector'); + + Value = require('./value'); + + Selector.hack(require('./hacks/fullscreen')); + + Selector.hack(require('./hacks/placeholder')); + + Declaration.hack(require('./hacks/flex')); + + Declaration.hack(require('./hacks/order')); + + Declaration.hack(require('./hacks/filter')); + + Declaration.hack(require('./hacks/flex-flow')); + + Declaration.hack(require('./hacks/flex-grow')); + + Declaration.hack(require('./hacks/flex-wrap')); + + Declaration.hack(require('./hacks/align-self')); + + Declaration.hack(require('./hacks/flex-basis')); + + Declaration.hack(require('./hacks/align-items')); + + Declaration.hack(require('./hacks/flex-shrink')); + + Declaration.hack(require('./hacks/break-inside')); + + Declaration.hack(require('./hacks/border-image')); + + Declaration.hack(require('./hacks/align-content')); + + Declaration.hack(require('./hacks/border-radius')); + + Declaration.hack(require('./hacks/transform-decl')); + + Declaration.hack(require('./hacks/flex-direction')); + + Declaration.hack(require('./hacks/justify-content')); + + Declaration.hack(require('./hacks/background-size')); + + Value.hack(require('./hacks/gradient')); + + Value.hack(require('./hacks/transition')); + + Value.hack(require('./hacks/display-flex')); + + Value.hack(require('./hacks/filter-value')); + + Value.hack(require('./hacks/fill-available')); + + Value.hack(require('./hacks/transform-value')); + + declsCache = {}; + + Prefixes = (function() { + function Prefixes(data, browsers, options) { + var _ref; + this.data = data; + this.browsers = browsers; + this.options = options != null ? options : {}; + _ref = this.preprocess(this.select(this.data)), this.add = _ref[0], this.remove = _ref[1]; + this.processor = new Processor(this); + } + + Prefixes.prototype.transitionProps = ['transition', 'transition-property']; + + Prefixes.prototype.cleaner = function() { + var empty; + if (!this.cleanerCache) { + if (this.browsers.selected.length) { + empty = new Browsers(this.browsers.data, []); + this.cleanerCache = new Prefixes(this.data, empty, this.options); + } else { + return this; + } + } + return this.cleanerCache; + }; + + Prefixes.prototype.select = function(list) { + var add, all, data, name, notes, selected; + selected = { + add: {}, + remove: {} + }; + for (name in list) { + data = list[name]; + add = data.browsers.map(function(i) { + var params; + params = i.split(' '); + return { + browser: params[0] + ' ' + params[1], + note: params[2] + }; + }); + notes = add.filter(function(i) { + return i.note; + }).map((function(_this) { + return function(i) { + return _this.browsers.prefix(i.browser) + ' ' + i.note; + }; + })(this)); + notes = utils.uniq(notes); + add = add.filter((function(_this) { + return function(i) { + return _this.browsers.isSelected(i.browser); + }; + })(this)).map((function(_this) { + return function(i) { + var prefix; + prefix = _this.browsers.prefix(i.browser); + if (i.note) { + return prefix + ' ' + i.note; + } else { + return prefix; + } + }; + })(this)); + add = this.sort(utils.uniq(add)); + all = data.browsers.map((function(_this) { + return function(i) { + return _this.browsers.prefix(i); + }; + })(this)); + if (data.mistakes) { + all = all.concat(data.mistakes); + } + all = all.concat(notes); + all = utils.uniq(all); + if (add.length) { + selected.add[name] = add; + if (add.length < all.length) { + selected.remove[name] = all.filter(function(i) { + return add.indexOf(i) === -1; + }); + } + } else { + selected.remove[name] = all; + } + } + return selected; + }; + + Prefixes.prototype.sort = function(prefixes) { + return prefixes.sort(function(a, b) { + var aLength, bLength; + aLength = utils.removeNote(a).length; + bLength = utils.removeNote(b).length; + if (aLength === bLength) { + return b.length - a.length; + } else { + return bLength - aLength; + } + }); + }; + + Prefixes.prototype.preprocess = function(selected) { + var add, name, old, olds, prefix, prefixed, prefixes, prop, props, remove, selector, value, values, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _len6, _m, _n, _o, _ref, _ref1, _ref2; + add = { + selectors: [], + '@supports': new Supports(this) + }; + _ref = selected.add; + for (name in _ref) { + prefixes = _ref[name]; + if (name === '@keyframes') { + add[name] = new Keyframes(name, prefixes, this); + } else if (this.data[name].selector) { + add.selectors.push(Selector.load(name, prefixes, this)); + } else { + props = this.data[name].transition ? this.transitionProps : this.data[name].props; + if (props) { + value = Value.load(name, prefixes, this); + for (_i = 0, _len = props.length; _i < _len; _i++) { + prop = props[_i]; + if (!add[prop]) { + add[prop] = { + values: [] + }; + } + add[prop].values.push(value); + } + } + if (!this.data[name].props) { + values = ((_ref1 = add[name]) != null ? _ref1.values : void 0) || []; + add[name] = Declaration.load(name, prefixes, this); + add[name].values = values; + } + } + } + remove = { + selectors: [] + }; + _ref2 = selected.remove; + for (name in _ref2) { + prefixes = _ref2[name]; + if (this.data[name].selector) { + selector = Selector.load(name, prefixes); + for (_j = 0, _len1 = prefixes.length; _j < _len1; _j++) { + prefix = prefixes[_j]; + remove.selectors.push(selector.old(prefix)); + } + } else if (name[0] === '@') { + for (_k = 0, _len2 = prefixes.length; _k < _len2; _k++) { + prefix = prefixes[_k]; + prefixed = '@' + prefix + name.slice(1); + remove[prefixed] = { + remove: true + }; + } + } else { + props = this.data[name].transition ? this.transitionProps : this.data[name].props; + if (props) { + value = Value.load(name, [], this); + for (_l = 0, _len3 = prefixes.length; _l < _len3; _l++) { + prefix = prefixes[_l]; + old = value.old(prefix); + if (old) { + for (_m = 0, _len4 = props.length; _m < _len4; _m++) { + prop = props[_m]; + if (!remove[prop]) { + remove[prop] = {}; + } + if (!remove[prop].values) { + remove[prop].values = []; + } + remove[prop].values.push(old); + } + } + } + } + if (!this.data[name].props) { + for (_n = 0, _len5 = prefixes.length; _n < _len5; _n++) { + prefix = prefixes[_n]; + prop = vendor.unprefixed(name); + olds = this.decl(name).old(name, prefix); + for (_o = 0, _len6 = olds.length; _o < _len6; _o++) { + prefixed = olds[_o]; + if (!remove[prefixed]) { + remove[prefixed] = {}; + } + remove[prefixed].remove = true; + } + } + } + } + } + return [add, remove]; + }; + + Prefixes.prototype.decl = function(prop) { + var decl; + decl = declsCache[prop]; + if (decl) { + return decl; + } else { + return declsCache[prop] = Declaration.load(prop); + } + }; + + Prefixes.prototype.unprefixed = function(prop) { + prop = vendor.unprefixed(prop); + return this.decl(prop).normalize(prop); + }; + + Prefixes.prototype.prefixed = function(prop, prefix) { + prop = vendor.unprefixed(prop); + return this.decl(prop).prefixed(prop, prefix); + }; + + Prefixes.prototype.values = function(type, prop) { + var data, global, values, _ref, _ref1; + data = this[type]; + global = (_ref = data['*']) != null ? _ref.values : void 0; + values = (_ref1 = data[prop]) != null ? _ref1.values : void 0; + if (global && values) { + return utils.uniq(global.concat(values)); + } else { + return global || values || []; + } + }; + + Prefixes.prototype.group = function(decl) { + var checker, index, length, rule, unprefixed; + rule = decl.parent; + index = rule.index(decl); + length = rule.nodes.length; + unprefixed = this.unprefixed(decl.prop); + checker = (function(_this) { + return function(step, callback) { + var other; + index += step; + while (index >= 0 && index < length) { + other = rule.nodes[index]; + if (other.type === 'decl') { + if (step === -1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + if (_this.unprefixed(other.prop) !== unprefixed) { + break; + } else if (callback(other) === true) { + return true; + } + if (step === +1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + } + index += step; + } + return false; + }; + })(this); + return { + up: function(callback) { + return checker(-1, callback); + }, + down: function(callback) { + return checker(+1, callback); + } + }; + }; + + return Prefixes; + + })(); + + module.exports = Prefixes; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/processor.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/processor.js new file mode 100644 index 0000000..f383b22 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/processor.js @@ -0,0 +1,187 @@ +(function() { + var Processor, Value, utils, vendor; + + vendor = require('postcss/lib/vendor'); + + Value = require('./value'); + + utils = require('./utils'); + + Processor = (function() { + function Processor(prefixes) { + this.prefixes = prefixes; + } + + Processor.prototype.add = function(css) { + var keyframes, supports; + keyframes = this.prefixes.add['@keyframes']; + supports = this.prefixes.add['@supports']; + css.eachAtRule((function(_this) { + return function(rule) { + if (rule.name === 'keyframes') { + if (!_this.disabled(rule)) { + return keyframes != null ? keyframes.process(rule) : void 0; + } + } else if (rule.name === 'supports') { + if (!_this.disabled(rule)) { + return supports.process(rule); + } + } + }; + })(this)); + css.eachRule((function(_this) { + return function(rule) { + var selector, _i, _len, _ref, _results; + if (_this.disabled(rule)) { + return; + } + _ref = _this.prefixes.add.selectors; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + selector = _ref[_i]; + _results.push(selector.process(rule)); + } + return _results; + }; + })(this)); + css.eachDecl((function(_this) { + return function(decl) { + var prefix; + prefix = _this.prefixes.add[decl.prop]; + if (prefix && prefix.prefixes) { + if (!_this.disabled(decl)) { + return prefix.process(decl); + } + } + }; + })(this)); + return css.eachDecl((function(_this) { + return function(decl) { + var unprefixed, value, _i, _len, _ref; + if (_this.disabled(decl)) { + return; + } + unprefixed = _this.prefixes.unprefixed(decl.prop); + _ref = _this.prefixes.values('add', unprefixed); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + value = _ref[_i]; + value.process(decl); + } + return Value.save(_this.prefixes, decl); + }; + })(this)); + }; + + Processor.prototype.remove = function(css) { + var checker, _i, _len, _ref; + css.eachAtRule((function(_this) { + return function(rule, i) { + if (_this.prefixes.remove['@' + rule.name]) { + if (!_this.disabled(rule)) { + return rule.parent.remove(i); + } + } + }; + })(this)); + _ref = this.prefixes.remove.selectors; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + checker = _ref[_i]; + css.eachRule((function(_this) { + return function(rule, i) { + if (checker.check(rule)) { + if (!_this.disabled(rule)) { + return rule.parent.remove(i); + } + } + }; + })(this)); + } + return css.eachDecl((function(_this) { + return function(decl, i) { + var notHack, rule, unprefixed, _j, _len1, _ref1, _ref2; + if (_this.disabled(decl)) { + return; + } + rule = decl.parent; + unprefixed = _this.prefixes.unprefixed(decl.prop); + if ((_ref1 = _this.prefixes.remove[decl.prop]) != null ? _ref1.remove : void 0) { + notHack = _this.prefixes.group(decl).down(function(other) { + return other.prop === unprefixed; + }); + if (notHack) { + if (decl.before.indexOf("\n") > -1) { + _this.reduceSpaces(decl); + } + rule.remove(i); + return; + } + } + _ref2 = _this.prefixes.values('remove', unprefixed); + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + checker = _ref2[_j]; + if (checker.check(decl.value)) { + rule.remove(i); + return; + } + } + }; + })(this)); + }; + + Processor.prototype.disabled = function(node) { + var status; + if (node._autoprefixerDisabled != null) { + return node._autoprefixerDisabled; + } else if (node.nodes) { + status = void 0; + node.each(function(i) { + if (i.type !== 'comment') { + return; + } + if (i.text === 'autoprefixer: off') { + status = false; + return false; + } else if (i.text === 'autoprefixer: on') { + status = true; + return false; + } + }); + return node._autoprefixerDisabled = status != null ? !status : node.parent ? this.disabled(node.parent) : false; + } else { + return node._autoprefixerDisabled = this.disabled(node.parent); + } + }; + + Processor.prototype.reduceSpaces = function(decl) { + var diff, parts, prevMin, stop; + stop = false; + this.prefixes.group(decl).up(function(other) { + return stop = true; + }); + if (stop) { + return; + } + parts = decl.before.split("\n"); + prevMin = parts[parts.length - 1].length; + diff = false; + return this.prefixes.group(decl).down(function(other) { + var last; + parts = other.before.split("\n"); + last = parts.length - 1; + if (parts[last].length > prevMin) { + if (diff === false) { + diff = parts[last].length - prevMin; + } + parts[last] = parts[last].slice(0, -diff); + return other.before = parts.join("\n"); + } + }); + }; + + return Processor; + + })(); + + module.exports = Processor; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/selector.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/selector.js new file mode 100644 index 0000000..50d243d --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/selector.js @@ -0,0 +1,117 @@ +(function() { + var Browsers, OldSelector, Prefixer, Selector, utils, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + OldSelector = require('./old-selector'); + + Prefixer = require('./prefixer'); + + Browsers = require('./browsers'); + + utils = require('./utils'); + + Selector = (function(_super) { + __extends(Selector, _super); + + function Selector(name, prefixes, all) { + this.name = name; + this.prefixes = prefixes; + this.all = all; + this.regexpCache = {}; + } + + Selector.prototype.check = function(rule) { + if (rule.selector.indexOf(this.name) !== -1) { + return !!rule.selector.match(this.regexp()); + } else { + return false; + } + }; + + Selector.prototype.prefixed = function(prefix) { + return this.name.replace(/^([^\w]*)/, '$1' + prefix); + }; + + Selector.prototype.regexp = function(prefix) { + var name; + if (this.regexpCache[prefix]) { + return this.regexpCache[prefix]; + } + name = prefix ? this.prefixed(prefix) : this.name; + return this.regexpCache[prefix] = RegExp("(^|[^:\"'=])" + (utils.escapeRegexp(name)), "gi"); + }; + + Selector.prototype.possible = function() { + return Browsers.prefixes(); + }; + + Selector.prototype.prefixeds = function(rule) { + var prefix, prefixeds, _i, _len, _ref; + if (rule._autoprefixerPrefixeds) { + return rule._autoprefixerPrefixeds; + } + prefixeds = {}; + _ref = this.possible(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prefix = _ref[_i]; + prefixeds[prefix] = this.replace(rule.selector, prefix); + } + return rule._autoprefixerPrefixeds = prefixeds; + }; + + Selector.prototype.already = function(rule, prefixeds, prefix) { + var before, index, key, prefixed, some; + index = rule.parent.index(rule) - 1; + while (index >= 0) { + before = rule.parent.nodes[index]; + if (before.type !== 'rule') { + return false; + } + some = false; + for (key in prefixeds) { + prefixed = prefixeds[key]; + if (before.selector === prefixed) { + if (prefix === key) { + return true; + } else { + some = true; + break; + } + } + } + if (!some) { + return false; + } + index -= 1; + } + return false; + }; + + Selector.prototype.replace = function(selector, prefix) { + return selector.replace(this.regexp(), '$1' + this.prefixed(prefix)); + }; + + Selector.prototype.add = function(rule, prefix) { + var cloned, prefixeds; + prefixeds = this.prefixeds(rule); + if (this.already(rule, prefixeds, prefix)) { + return; + } + cloned = this.clone(rule, { + selector: prefixeds[prefix] + }); + return rule.parent.insertBefore(rule, cloned); + }; + + Selector.prototype.old = function(prefix) { + return new OldSelector(this, prefix); + }; + + return Selector; + + })(Prefixer); + + module.exports = Selector; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/supports.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/supports.js new file mode 100644 index 0000000..900e7c9 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/supports.js @@ -0,0 +1,115 @@ +(function() { + var Prefixes, Supports, Value, findCondition, findDecl, list, postcss, split, utils; + + Prefixes = require('./prefixes'); + + Value = require('./value'); + + utils = require('./utils'); + + postcss = require('postcss'); + + list = require('postcss/lib/list'); + + split = /\(\s*([^\(\):]+)\s*:([^\)]+)/; + + findDecl = /\(\s*([^\(\):]+)\s*:\s*(.+)\s*\)/g; + + findCondition = /(not\s*)?\(\s*([^\(\):]+)\s*:\s*(.+?(?!\s*or\s*).+?)\s*\)*\s*\)\s*or\s*/gi; + + Supports = (function() { + function Supports(all) { + this.all = all; + } + + Supports.prototype.virtual = function(prop, value) { + var rule; + rule = postcss.parse('a{}').first; + rule.append({ + prop: prop, + value: value, + before: '' + }); + return rule; + }; + + Supports.prototype.prefixed = function(prop, value) { + var decl, prefixer, rule, _i, _j, _len, _len1, _ref, _ref1; + rule = this.virtual(prop, value); + prefixer = this.all.add[prop]; + if (prefixer != null) { + if (typeof prefixer.process === "function") { + prefixer.process(rule.first); + } + } + _ref = rule.nodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + decl = _ref[_i]; + _ref1 = this.all.values('add', prop); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + value = _ref1[_j]; + value.process(decl); + } + Value.save(this.all, decl); + } + return rule.nodes; + }; + + Supports.prototype.clean = function(params) { + return params.replace(findCondition, (function(_this) { + return function(all) { + var check, checker, prop, unprefixed, value, _, _i, _len, _ref, _ref1, _ref2; + if (all.slice(0, 3).toLowerCase() === 'not') { + return all; + } + _ref = all.match(split), _ = _ref[0], prop = _ref[1], value = _ref[2]; + unprefixed = _this.all.unprefixed(prop); + if ((_ref1 = _this.all.cleaner().remove[prop]) != null ? _ref1.remove : void 0) { + check = new RegExp('(\\(|\\s)' + utils.escapeRegexp(unprefixed) + ':'); + if (check.test(params)) { + return ''; + } + } + _ref2 = _this.all.cleaner().values('remove', unprefixed); + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + checker = _ref2[_i]; + if (checker.check(value)) { + return ''; + } + } + return all; + }; + })(this)).replace(/\(\s*\((.*)\)\s*\)/g, '($1)'); + }; + + Supports.prototype.process = function(rule) { + rule.params = this.clean(rule.params); + return rule.params = rule.params.replace(findDecl, (function(_this) { + return function(all, prop, value) { + var i, stringed; + stringed = (function() { + var _i, _len, _ref, _results; + _ref = this.prefixed(prop, value); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + i = _ref[_i]; + _results.push("(" + i.prop + ": " + i.value + ")"); + } + return _results; + }).call(_this); + if (stringed.length === 1) { + return stringed[0]; + } else { + return '(' + stringed.join(' or ') + ')'; + } + }; + })(this)); + }; + + return Supports; + + })(); + + module.exports = Supports; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/utils.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/utils.js new file mode 100644 index 0000000..3256816 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/utils.js @@ -0,0 +1,41 @@ +(function() { + module.exports = { + error: function(text) { + var err; + err = new Error(text); + err.autoprefixer = true; + throw err; + }, + uniq: function(array) { + var filtered, i, _i, _len; + filtered = []; + for (_i = 0, _len = array.length; _i < _len; _i++) { + i = array[_i]; + if (filtered.indexOf(i) === -1) { + filtered.push(i); + } + } + return filtered; + }, + removeNote: function(string) { + if (string.indexOf(' ') === -1) { + return string; + } else { + return string.split(' ')[0]; + } + }, + escapeRegexp: function(string) { + return string.replace(/[.?*+\^\$\[\]\\(){}|\-]/g, '\\$&'); + }, + regexp: function(word, escape) { + if (escape == null) { + escape = true; + } + if (escape) { + word = this.escapeRegexp(word); + } + return RegExp("(^|[\\s,(])(" + word + "($|[\\s(,]))", "gi"); + } + }; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/value.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/value.js new file mode 100644 index 0000000..c2601c2 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/lib/value.js @@ -0,0 +1,99 @@ +(function() { + var OldValue, Prefixer, Value, utils, vendor, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + Prefixer = require('./prefixer'); + + OldValue = require('./old-value'); + + utils = require('./utils'); + + vendor = require('postcss/lib/vendor'); + + Value = (function(_super) { + __extends(Value, _super); + + function Value() { + return Value.__super__.constructor.apply(this, arguments); + } + + Value.save = function(prefixes, decl) { + var already, cloned, prefix, prefixed, propPrefix, rule, trimmed, value, _ref, _results; + _ref = decl._autoprefixerValues; + _results = []; + for (prefix in _ref) { + value = _ref[prefix]; + if (value === decl.value) { + continue; + } + propPrefix = vendor.prefix(decl.prop); + if (propPrefix === prefix) { + _results.push(decl.value = value); + } else if (propPrefix === '-pie-') { + continue; + } else { + prefixed = prefixes.prefixed(decl.prop, prefix); + rule = decl.parent; + if (rule.every(function(i) { + return i.prop !== prefixed; + })) { + trimmed = value.replace(/\s+/, ' '); + already = rule.some(function(i) { + return i.prop === decl.prop && i.value.replace(/\s+/, ' ') === trimmed; + }); + if (!already) { + cloned = this.clone(decl, { + value: value + }); + _results.push(decl.parent.insertBefore(decl, cloned)); + } else { + _results.push(void 0); + } + } else { + _results.push(void 0); + } + } + } + return _results; + }; + + Value.prototype.check = function(decl) { + var value; + value = decl.value; + if (value.indexOf(this.name) !== -1) { + return !!value.match(this.regexp()); + } else { + return false; + } + }; + + Value.prototype.regexp = function() { + return this.regexpCache || (this.regexpCache = utils.regexp(this.name)); + }; + + Value.prototype.replace = function(string, prefix) { + return string.replace(this.regexp(), '$1' + prefix + '$2'); + }; + + Value.prototype.add = function(decl, prefix) { + var value, _ref; + decl._autoprefixerValues || (decl._autoprefixerValues = {}); + value = decl._autoprefixerValues[prefix] || ((_ref = decl._value) != null ? _ref.raw : void 0) || decl.value; + value = this.replace(value, prefix); + if (value) { + return decl._autoprefixerValues[prefix] = value; + } + }; + + Value.prototype.old = function(prefix) { + return new OldValue(prefix + this.name); + }; + + return Value; + + })(Prefixer); + + module.exports = Value; + +}).call(this); diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/.npmignore b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/.npmignore new file mode 100644 index 0000000..1aa2d59 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/.npmignore @@ -0,0 +1,8 @@ +.gitignore + +node_modules/ + +test/ +.travis.yml + +gulpfile.js diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/ChangeLog.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/ChangeLog.md new file mode 100644 index 0000000..ebdf4ca --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/ChangeLog.md @@ -0,0 +1,8 @@ +## 0.1.2 +* Do not create global `browserslist` var (by Maxime Thirouin). + +## 0.1.1 +* Sort browsers by name and version. + +## 0.1 +* Initial release. diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/LICENSE b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/LICENSE new file mode 100644 index 0000000..1ae47a2 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2014 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/README.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/README.md new file mode 100644 index 0000000..bcd8ccb --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/README.md @@ -0,0 +1,100 @@ +# Browserslist [![Build Status](https://travis-ci.org/ai/browserslist.svg)](https://travis-ci.org/ai/browserslist) + +Get browser versions that match given criteria. +Useful for tools like [Autoprefixer]. + +You can select browsers by passing a string. This library will use Can I Use +data to return the appropriate list of all matching versions. + +For example, the last version of each major browser and version, +with a usage of over 5% in global usage statistics: + +```js +browserslist('> 5%, last 1 version'); +//=> ['safari 8', 'opera 26', 'ios_saf 8.1', 'ie_mob 11', 'ie 11', 'and_chr 39', +// 'firefox 33', 'firefox 32', 'chrome 39', 'chrome 38', 'chrome 37'] +``` + +If you don't provide an argument, Browserslist will look for a `browserslist` +config file in current or parent directories. + +If no config file is found, Browserslist will use the default list: +`> 1%, last 2 versions, Firefox ESR, Opera 12.1`. + + +Sponsored by Evil Martians + + +[Autoprefixer]: https://github.com/postcss/autoprefixer + +## Queries + +You can specify the browsers by queries (case insensitive): + +* `last 2 versions`: the last 2 versions for each major browser. +* `last 2 Chrome versions`: the last 2 versions of Chrome browser. +* `> 5%`: versions selected by global usage statistics. +* `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code]. +* `Firefox > 20`: versions of Firefox newer than 20. +* `Firefox >= 20`: versions of Firefox newer than or equal to 20. +* `Firefox < 20`: versions of Firefox less than 20. +* `Firefox <= 20`: versions of Firefox less than or equal to 20. +* `Firefox ESR`: the latest [Firefox ESR] version. +* `iOS 7`: the iOS browser version 7 directly. + +Blackberry and Android WebView will not be used in `last n versions`. +You should add them by name. + +[two-letter country codes]: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements + +## Browsers + +Names are case insensitive: + +* `Android` for Android WebView. +* `BlackBerry` or `bb` for Blackberry browser. +* `Chrome` for Google Chrome. +* `Firefox` or `ff` for Mozilla Firefox. +* `Explorer` or `ie` for Internet Explorer. +* `iOS` or `ios_saf` for iOS Safari. +* `Opera` for Opera. +* `Safari` for desktop Safari. +* `OperaMobile` or `op_mob` for Opera Mobile. +* `OperaMini` or `op_mini` for Opera Mini. +* `ChromeAndroid` or `and_chr` for Chrome for Android + (mostly same as common `Chrome`). +* `FirefoxAndroid` or `and_ff` for Firefox for Android. +* `ExplorerMobile` or `ie_mob` for Internet Explorer Mobile. + + +## Usage + +```js +var browserslist = require('browserslist'); + +// Your CSS/JS build tool code +var process = function (css, opts) { + var browsers = browserslist(opts.browsers, { path: opts.file }); + // Your code to add features for selected browsers +} +``` + +If a list is missing, Browserslist will look for a config file. +You can provide a `path` option (that can be a file) to find the config file +relatively to it. + +Queries can be a string `"> 5%, last 1 version"` +or and array `['> 5%', 'last 1 version']`. + +## Config File + +Browserslist’s config should be named `browserslist` and have browsers queries +split by a new line. You can write a comment after `#`: + +``` +# Browsers that we support + +> 1% +Last 2 versions +IE 8 # sorry +``` diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/index.js b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/index.js new file mode 100644 index 0000000..6944da3 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/index.js @@ -0,0 +1,296 @@ +var caniuse = require('caniuse-db/data').agents; +var path = require('path'); +var fs = require('fs'); + +var uniq = function (array) { + var filtered = []; + for ( var i = 0; i < array.length; i++ ) { + if ( filtered.indexOf(array[i]) == -1 ) filtered.push(array[i]); + } + return filtered; +}; + +// Return array of browsers by selection queries: +// +// browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8'] +var browserslist = function (selections, opts) { + if ( typeof(opts) == 'undefined' ) opts = { }; + + if ( typeof(selections) == 'undefined' || selections === null ) { + var config = browserslist.readConfig(opts.path); + if ( config === false ) { + selections = browserslist.defaults; + } else { + selections = config; + } + } + + if ( typeof(selections) == 'string' ) { + selections = selections.split(/,\s*/); + } + + var result = []; + + var query, match, array, used; + selections.forEach(function (selection) { + if ( selection.trim() === '' ) return; + used = false; + + for ( var i in browserslist.queries ) { + query = browserslist.queries[i]; + match = selection.match(query.regexp); + if ( match ) { + array = query.select.apply(browserslist, match.slice(1)); + result = result.concat(array); + used = true; + break; + } + } + + if ( !used ) { + throw 'Unknown browser query `' + selection + '`'; + } + }); + + return uniq(result).sort(function (name1, name2) { + name1 = name1.split(' '); + name2 = name2.split(' '); + if ( name1[0] == name2[0] ) { + return parseFloat(name2[1]) - parseFloat(name1[1]); + } else { + return name1[0].localeCompare(name2[0]); + } + }); +}; + +// Will be filled by Can I Use data below +browserslist.data = { }; +browserslist.usage = { + global: { } +}; + +// Default browsers query +browserslist.defaults = [ + '> 1%', + 'last 2 versions', + 'Firefox ESR', + 'Opera 12.1' +]; + +// What browsers will be used in `last n version` query +browserslist.major = ['safari', 'opera', 'ios_saf', 'ie_mob', 'ie', + 'firefox', 'chrome']; + +// Browser names aliases +browserslist.aliases = { + fx: 'firefox', + ff: 'firefox', + ios: 'ios_saf', + explorer: 'ie', + blackberry: 'bb', + explorermobile: 'ie_mob', + operamini: 'op_mini', + operamobile: 'op_mob', + chromeandroid: 'and_chr', + firefoxandroid: 'and_ff' +}; + +// Get browser data by alias or case insensitive name +browserslist.byName = function (name) { + name = name.toLowerCase(); + name = browserslist.aliases[name] || name; + + var data = browserslist.data[name]; + if ( !data ) throw 'Unknown browser ' + name; + return data; +}; + +// Find config, read file and parse it +browserslist.readConfig = function (from) { + if ( from === false ) return false; + if ( !fs.readFileSync ) return false; + if ( typeof(from) == 'undefined' ) from = '.'; + + var dirs = path.resolve(from).split(path.sep); + var config, stat; + while ( dirs.length ) { + config = dirs.concat(['browserslist']).join(path.sep); + + if ( fs.existsSync(config) && fs.lstatSync(config).isFile() ) { + return browserslist.parseConfig( fs.readFileSync(config) ); + } + + dirs.pop(); + } + + return false; +}; + +// Return array of queries from config content +browserslist.parseConfig = function (string) { + return string.toString() + .replace(/#[^\n]*/g, '') + .split(/\n/) + .map(function (i) { + return i.trim(); + }) + .filter(function (i) { + return i !== ''; + }); +}; + +browserslist.queries = { + + lastVersions: { + regexp: /^last (\d+) versions?$/i, + select: function (versions) { + var selected = []; + browserslist.major.forEach(function (name) { + var data = browserslist.byName(name); + var array = data.released.slice(-versions); + + array = array.map(function (v) { + return data.name + ' ' + v; + }); + selected = selected.concat(array); + }); + return selected; + } + }, + + lastByBrowser: { + regexp: /^last (\d+) (\w+) versions?$/i, + select: function (versions, name) { + var data = browserslist.byName(name); + return data.released.slice(-versions).map(function (v) { + return data.name + ' ' + v; + }); + } + }, + + globalStatistics: { + regexp: /^> (\d+\.?\d*)%$/, + select: function (popularity) { + popularity = parseFloat(popularity); + var result = []; + + for ( var version in browserslist.usage.global ) { + if ( browserslist.usage.global[version] > popularity ) { + result.push(version); + } + } + + return result; + } + }, + + countryStatistics: { + regexp: /^> (\d+\.?\d*)% in (\w\w)$/, + select: function (popularity, country) { + popularity = parseFloat(popularity); + country = country.toUpperCase(); + var result = []; + + var usage = browserslist.usage[country]; + if ( !usage ) { + usage = { }; + var data = require('caniuse-db/region-usage-json/' + country); + for ( var i in data.data ) { + fillUsage(usage, i, data.data[i]); + } + browserslist.usage[country] = usage; + } + + for ( var version in usage ) { + if ( usage[version] > popularity ) { + result.push(version); + } + } + + return result; + } + }, + + versions: { + regexp: /^(\w+) (>=?|<=?)\s*([\d\.]+)/, + select: function (name, sign, version) { + var data = browserslist.byName(name); + version = parseFloat(version); + + var filter; + if ( sign == '>' ) { + filter = function (v) { + return parseFloat(v) > version; + }; + } else if ( sign == '>=' ) { + filter = function (v) { + return parseFloat(v) >= version; + }; + } else if ( sign == '<' ) { + filter = function (v) { + return parseFloat(v) < version; + }; + } else if ( sign == '<=' ) { + filter = function (v) { + return parseFloat(v) <= version; + }; + } + + return data.released.filter(filter).map(function (v) { + return data.name + ' ' + v; + }); + } + }, + + esr: { + regexp: /^(firefox|ff|fx) esr$/i, + select: function (versions) { + return ['firefox 31']; + } + }, + + direct: { + regexp: /^(\w+) ([\d\.]+)$/, + select: function (name, version) { + var data = browserslist.byName(name); + if ( data.versions.indexOf(version) == -1 ) { + throw 'Unknown version ' + version + ' of ' + name; + } + + return [data.name + ' ' + version]; + } + } + +}; + +// Get and convert Can I Use data + +var normalizeVersion = function (version) { + var interval = version.split('-'); + return interval[interval.length - 1]; +}; + +var normalize = function (versions) { + return versions + .filter(function (version) { + return typeof(version) == 'string'; + }) + .map(normalizeVersion); +}; + +var fillUsage = function (result, name, data) { + for ( var i in data ) { + result[name + ' ' + normalizeVersion(i)] = data[i]; + } +}; + +for ( var name in caniuse ) { + browserslist.data[name] = { + name: name, + versions: normalize(caniuse[name].versions), + released: normalize(caniuse[name].versions.slice(0, -3)) + }; + fillUsage(browserslist.usage.global, name, caniuse[name].usage_global); +} + +module.exports = browserslist; diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/package.json b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/package.json new file mode 100644 index 0000000..c5c11b6 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/browserslist/package.json @@ -0,0 +1,58 @@ +{ + "name": "browserslist", + "version": "0.1.2", + "description": "Get browsers versions that matches given criterias like in Autoprefixer", + "keywords": [ + "caniuse", + "browsers" + ], + "author": { + "name": "Andrey Sitnik", + "email": "andrey@sitnik.ru" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/ai/browserslist.git" + }, + "dependencies": { + "caniuse-db": "^1.0.30000048" + }, + "devDependencies": { + "jshint-stylish": "1.0.0", + "gulp-jshint": "1.9.0", + "gulp-mocha": "2.0.0", + "mocha": "2.1.0", + "chai": "1.10.0", + "gulp": "3.8.10" + }, + "scripts": { + "test": "gulp" + }, + "gitHead": "da97ec2e9fb1f984f94460f704fb439212bac6b0", + "bugs": { + "url": "https://github.com/ai/browserslist/issues" + }, + "homepage": "https://github.com/ai/browserslist", + "_id": "browserslist@0.1.2", + "_shasum": "e27e20730dd426149bab8051073a41fc9d3cf238", + "_from": "browserslist@~0.1.1", + "_npmVersion": "2.1.18", + "_nodeVersion": "0.10.33", + "_npmUser": { + "name": "ai", + "email": "andrey@sitnik.ru" + }, + "maintainers": [ + { + "name": "ai", + "email": "andrey@sitnik.ru" + } + ], + "dist": { + "shasum": "e27e20730dd426149bab8051073a41fc9d3cf238", + "tarball": "http://registry.npmjs.org/browserslist/-/browserslist-0.1.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.1.2.tgz" +} diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/.npmignore b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/.npmignore new file mode 100644 index 0000000..c23eb6f --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/.npmignore @@ -0,0 +1,8 @@ +.gitignore +.gitattributes + +.travis.yml +validator/ + +Contributing.md +sample-data.json diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/CONTRIBUTING.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/CONTRIBUTING.md new file mode 100644 index 0000000..c638f4e --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/CONTRIBUTING.md @@ -0,0 +1,87 @@ +# Contributing to the caniuse data + +## Filing issues + +Issues can be filed on existing **caniuse support data** or on **site functionality**. If you'd like to propose a new web technology feature to be added, please submit/vote for the issue on [Google Moderator](http://www.google.com/moderator/#15/e=ae425&t=ae425.40) rather than submitting an issue. This way features can be added based on the popularity of the feature. + +## Caniuse data + +The `features-json` directory includes JSON files for every feature found on [the caniuse.com website](http://caniuse.com/). +Maintaining these files on GitHub allows anyone to update or contribute to the support data on the site. + +**Note:** when submitting a patch, don’t modify the minified `data.json` file in the root — that is done automatically. Only modify the contents of the `features-json` directory. + +### How it works + +The data on the site is stored in a database. +This data is periodically exported to the JSON files on GitHub. +Once a change or new file here has been approved, it is integrated back into the database +and the subsequent export files should be the same as the imported ones. +Not too confusing, I hope. :) + +### Supported changes + +Currently the following feature information can be modified: +* **title** — Feature name (used for the title of the table) +* **description** — Brief description of feature +* **spec** — Spec URL +* **status** — Spec status, one of the following: + * `ls` - WHATWG Living Standard + * `rec` - W3C Recommendation + * `pr` - W3C Proposed Recommendation + * `cr` - W3C Candidate Recommendation + * `wd` - W3C Working Draft + * `other` - Non-W3C, but reputable + * `unoff` - Unofficial or W3C "Note" +* **links** — Array of "link" objects consisting of URL and short description of link +* **bugs** — Array of "bug" objects consisting of a bug description +* **categories** — Array of categories, any of the following: + * `HTML5` + * `CSS` + * `CSS2` + * `CSS3` + * `SVG` + * `PNG` + * `JS API` + * `Canvas` + * `DOM` + * `Other` +* **stats** — The collection of support data for a given set of browsers/versions. Only the support value strings can be modified. Values are space-separated characters with these meanings, and must answer the question "*Can I use* the feature by default?": + * `y` - (**Y**)es, supported by default + * `a` - (**A**)lmost supported (aka Partial support) + * `n` - (**N**)o support, or disabled by default + * `p` - No support, but has (**P**)olyfill + * `u` - Support (**u**)nknown + * `x` - Requires prefi(**x**) to work + * `d` - (**D**)isabled by default (need to enable flag or something) + * `#n` - Where n is a number, starting with 1, corresponds to the **notes_by_num** note. For example: `"42":"y #1"` means version 42 is supported by default and see note 1. +* **notes** — Notes on feature support, often to explain what partial support refers to +* **notes_by_num** - Map of numbers corresponding to notes. Used in conjection with the #n notation under **stats**. Each key should be a number (no hash), the value is the related note. For example: `"1": "Foo"` +* **ucprefix** — Prefix should start with an uppercase letter +* **parent** — ID of parent feature +* **keywords** — Comma separated words that will match the feature in a search +* **ie_id** — Comma separated IDs used by [status.modern.ie](http://status.modern.ie) - Each ID is the string in the feature's URL +* **chrome_id** — Comma separated IDs used by [chromestatus.com](http://chromestatus.com) - Each ID is the number in the feature's URL +* **shown** — Whether or not feature is ready to be shown on the site. This can be left as false if the support data or information for other fields is still being collected + +### Adding a feature + +To add a feature, simply add another JSON file, following the [example](/sample-data.json), to the `features-json` directory with the base file name as the feature ID (only alphanumeric characters and hyphens please). If you want to submit a feature but don't have all information available for it yet, make sure you set the "shown" flag to false. + +### Unsupported changes + +Currently it is not possible to: +* Add a new browser or browser version (this will be made possible later) +* Add a test for any given feature (should also come later) +* Add any object properties not already defined above +* Modify the **usage\_perc\_y** or **usage\_perc\_a** values (these values are generated) + +### Testing +Make sure you have NodeJS installed on your system. + +Run + +`node validator/validate-jsons.js` + +If something is wrong, it will throw an error. +Everything is ok otherwise. diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/README.md b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/README.md new file mode 100644 index 0000000..009bef4 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/README.md @@ -0,0 +1,13 @@ +This repo contains raw data from the caniuse.com support tables. It serves two purposes: + +1. The ability for anyone interested to update or add to the support data on the site. If you are interested in this, please read the [CONTRIBUTING file](CONTRIBUTING.md). + +2. Access to the site's data for other projects. For this use the [data.json](data.json) file which includes all support data. + +The data in this repo is available for use under a CC BY 3.0 license (http://creativecommons.org/licenses/by/3.0/). For attribution just mention somewhere that the source is caniuse.com. While usage of the data for alternative tools, visualizations, etc. is encouraged, it is not permitted to use it directly to create another browser support website. If you have any questions about using the data for your project please contact me here: http://a.deveria.com/contact + +Thanks, + +Alexis Deveria +
http://caniuse.com +
http://a.deveria.com diff --git a/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/data.json b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/data.json new file mode 100644 index 0000000..b30c821 --- /dev/null +++ b/node_modules/grunt-autoprefixer/node_modules/autoprefixer-core/node_modules/caniuse-db/data.json @@ -0,0 +1 @@ +{"eras":{"e-36":"36 versions back","e-35":"35 versions back","e-34":"34 versions back","e-33":"33 versions back","e-32":"32 versions back","e-31":"31 versions back","e-30":"30 versions back","e-29":"29 versions back","e-28":"28 versions back","e-27":"27 versions back","e-26":"26 versions back","e-25":"25 versions back","e-24":"24 versions back","e-23":"23 versions back","e-22":"22 versions back","e-21":"21 versions back","e-20":"20 versions back","e-19":"19 versions back","e-18":"18 versions back","e-17":"17 versions back","e-16":"16 versions back","e-15":"15 versions back","e-14":"14 versions back","e-13":"13 versions back","e-12":"12 versions back","e-11":"11 versions back","e-10":"10 versions back","e-9":"9 versions back","e-8":"8 versions back","e-7":"7 versions back","e-6":"6 versions back","e-5":"5 versions back","e-4":"4 versions back","e-3":"3 versions back","e-2":"2 versions back","e-1":"Previous version","e0":"Current","e1":"Near future","e2":"Farther future","e3":"3 versions ahead"},"agents":{"ie":{"browser":"IE","abbr":"IE","prefix":"ms","type":"desktop","usage_global":{"5.5":0.009298,"6":0.0737794,"7":0.187802,"8":4.07799,"9":2.1329,"10":1.63656,"11":8.33707,"TP":0},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"5.5","6","7","8","9","10","11","TP",null,null]},"firefox":{"browser":"Firefox","abbr":"FF","prefix":"moz","type":"desktop","usage_global":{"2":0.006597,"3":0.026388,"3.5":0.013194,"3.6":0.092358,"4":0.026388,"5":0.013194,"6":0.026388,"7":0.013194,"8":0.046179,"9":0.013194,"10":0.026388,"11":0.046179,"12":0.059373,"13":0.026388,"14":0.026388,"15":0.032985,"16":0.052776,"17":0.039582,"18":0.032985,"19":0.026388,"20":0.032985,"21":0.039582,"22":0.032985,"23":0.046179,"24":0.079164,"25":0.052776,"26":0.059373,"27":0.098955,"28":0.059373,"29":0.092358,"30":0.151731,"31":0.448596,"32":0.369432,"33":2.90928,"34":6.50464,"35":0.237492,"36":0.006597,"37":0.006597,"38":0},"versions":[null,"2","3","3.5","3.6","4","5","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"]},"chrome":{"browser":"Chrome","abbr":"Chr.","prefix":"webkit","type":"desktop","usage_global":{"4":0.026388,"5":0.013194,"6":0.019791,"7":0.013194,"8":0.013194,"9":0.013194,"10":0.019791,"11":0.098955,"12":0.039582,"13":0.026388,"14":0.026388,"15":0.026388,"16":0.019791,"17":0.013194,"18":0.032985,"19":0.013194,"20":0.013194,"21":0.072567,"22":0.059373,"23":0.032985,"24":0.039582,"25":0.032985,"26":0.052776,"27":0.072567,"28":0.079164,"29":0.06597,"30":0.13194,"31":0.752058,"32":0.145134,"33":0.46179,"34":0.32985,"35":0.613521,"36":0.890595,"37":1.02253,"38":1.326,"39":25.3919,"40":0.125343,"41":0.184716,"42":0,"43":0},"versions":["4","5","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","41","42","43"]},"safari":{"browser":"Safari","abbr":"Saf.","prefix":"webkit","type":"desktop","usage_global":{"3.1":0,"3.2":0.008692,"4":0.052776,"5":0.125343,"5.1":0.409014,"6":0.098955,"6.1":0.277074,"7":0.448596,"7.1":0.567342,"8":1.00274},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"3.1","3.2","4","5","5.1","6","6.1","7","7.1","8",null,null,null]},"opera":{"browser":"Opera","abbr":"Op.","prefix":"webkit","type":"desktop","usage_global":{"9.5-9.6":0.00685,"10.0-10.1":0.013194,"10.5":0.008392,"10.6":0.007296,"11":0.014996,"11.1":0.008219,"11.5":0.00685,"11.6":0.013194,"12":0.013194,"12.1":0.19791,"15":0.00685,"16":0.00685,"17":0.00685,"18":0.013194,"19":0.006597,"20":0.013194,"21":0.006597,"22":0.006597,"23":0.013434,"24":0.013194,"25":0.026388,"26":0.606924,"27":0.006597,"28":0},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"9.5-9.6","10.0-10.1","10.5","10.6","11","11.1","11.5","11.6","12","12.1","15","16","17","18","19","20","21","22","23","24","25","26","27","28",null],"prefix_exceptions":{"9.5-9.6":"o","10.0-10.1":"o","10.5":"o","10.6":"o","11":"o","11.1":"o","11.5":"o","11.6":"o","12":"o","12.1":"o"}},"ios_saf":{"browser":"iOS Safari","abbr":"iOS","prefix":"webkit","type":"mobile","usage_global":{"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0454654,"6.0-6.1":0.188026,"7.0-7.1":2.22703,"8":0.631121,"8.1":4.58892},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"3.2","4.0-4.1","4.2-4.3","5.0-5.1","6.0-6.1","7.0-7.1","8","8.1",null,null,null]},"op_mini":{"browser":"Opera Mini","abbr":"O.Mini","prefix":"o","type":"mobile","usage_global":{"5.0-8.0":3.0738},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"5.0-8.0",null,null,null]},"android":{"browser":"Android Browser","abbr":"And.","prefix":"webkit","type":"mobile","usage_global":{"2.1":0,"2.2":0.00527484,"2.3":0.148355,"3":0,"4":0.305941,"4.1":0.937603,"4.2-4.3":1.49344,"4.4":2.50621,"4.4.3-4.4.4":1.02464,"37":0},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"2.1","2.2","2.3","3","4","4.1","4.2-4.3","4.4","4.4.3-4.4.4","37",null,null,null]},"op_mob":{"browser":"Opera Mobile","abbr":"O.Mob","prefix":"o","type":"mobile","usage_global":{"10":0,"11.5":0,"12":0.00438935,"12.1":0.0219467,"24":0},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"10",null,null,"11.5","12","12.1","24",null,null,null],"prefix_exceptions":{"24":"webkit"}},"bb":{"browser":"Blackberry Browser","abbr":"BB","prefix":"webkit","type":"mobile","usage_global":{"7":0.0935825,"10":0},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"7","10",null,null,null]},"and_chr":{"browser":"Chrome for Android","abbr":"Chr/And.","prefix":"webkit","type":"mobile","usage_global":{"40":10.5231},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"40",null,null,null]},"and_ff":{"browser":"Firefox for Android","abbr":"FF/And.","prefix":"moz","type":"mobile","usage_global":{"33":0.129314},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"33",null,null,null]},"ie_mob":{"browser":"IE Mobile","abbr":"IE.Mob","prefix":"ms","type":"mobile","usage_global":{"10":0.331242,"11":0.400403},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"10","11",null,null,null]},"and_uc":{"browser":"UC Browser for Android","abbr":"UC","prefix":"webkit","type":"mobile","usage_global":{"9.9":3.77733},"versions":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"9.9",null,null,null],"prefix_exceptions":{"9.9":"webkit"}}},"statuses":{"rec":"W3C Recommendation","pr":"W3C Proposed Recommendation","cr":"W3C Candidate Recommendation","wd":"W3C Working Draft","ls":"WHATWG Living Standard","other":"Other","unoff":"Unofficial / Note"},"cats":{"CSS":["CSS","CSS2","CSS3"],"HTML5":["Canvas","HTML5"],"JS API":["JS API"],"Other":["PNG","Other","DOM"],"SVG":["SVG"]},"updated":1422244185,"data":{"png-alpha":{"title":"PNG alpha transparency","description":"Semi-transparent areas in PNG files","spec":"http://www.w3.org/TR/PNG/","status":"rec","links":[{"url":"http://en.wikipedia.org/wiki/Portable_Network_Graphics","title":"Wikipedia"},{"url":"http://dillerdesign.com/experiment/DD_belatedPNG/","title":"Workaround for IE6"}],"categories":["PNG"],"stats":{"ie":{"5.5":"n","6":"p","7":"y","8":"y","9":"y","10":"y","11":"y","TP":"y"},"firefox":{"2":"y","3":"y","3.5":"y","3.6":"y","4":"y","5":"y","6":"y","7":"y","8":"y","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y"},"chrome":{"4":"y","5":"y","6":"y","7":"y","8":"y","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y"},"safari":{"3.1":"y","3.2":"y","4":"y","5":"y","5.1":"y","6":"y","6.1":"y","7":"y","7.1":"y","8":"y"},"opera":{"9":"y","9.5-9.6":"y","10.0-10.1":"y","10.5":"y","10.6":"y","11":"y","11.1":"y","11.5":"y","11.6":"y","12":"y","12.1":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y"},"ios_saf":{"3.2":"y","4.0-4.1":"y","4.2-4.3":"y","5.0-5.1":"y","6.0-6.1":"y","7.0-7.1":"y","8":"y","8.1":"y"},"op_mini":{"5.0-8.0":"y"},"android":{"2.1":"y","2.2":"y","2.3":"y","3":"y","4":"y","4.1":"y","4.2-4.3":"y","4.4":"y","4.4.3-4.4.4":"y","37":"y"},"bb":{"7":"y","10":"y"},"op_mob":{"10":"y","11":"y","11.1":"y","11.5":"y","12":"y","12.1":"y","24":"y"},"and_chr":{"40":"y"},"and_ff":{"33":"y"},"ie_mob":{"10":"y","11":"y"},"and_uc":{"9.9":"y"}},"notes":"IE6 does support full transparency in 8-bit PNGs, which can sometimes be an alternative to 24-bit PNGs.","notes_by_num":{},"usage_perc_y":97.04,"usage_perc_a":0,"ucprefix":false,"parent":"","keywords":"","ie_id":"","chrome_id":""},"apng":{"title":"Animated PNG (APNG)","description":"Like animated GIFs, but allowing 24-bit colors and alpha transparency","spec":"https://wiki.mozilla.org/APNG_Specification","status":"unoff","links":[{"url":"http://en.wikipedia.org/wiki/APNG","title":"Wikipedia"},{"url":"https://github.com/davidmz/apng-canvas","title":"Polyfill using canvas"},{"url":"https://chrome.google.com/webstore/detail/ehkepjiconegkhpodgoaeamnpckdbblp","title":"Chrome extension providing support"}],"categories":["PNG"],"stats":{"ie":{"5.5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","TP":"n"},"firefox":{"2":"n","3":"y","3.5":"y","3.6":"y","4":"y","5":"y","6":"y","7":"y","8":"y","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y"},"chrome":{"4":"n","5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","12":"n","13":"n","14":"n","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"n","23":"n","24":"n","25":"n","26":"n","27":"n","28":"n","29":"n","30":"n","31":"n","32":"n","33":"n","34":"n","35":"n","36":"n","37":"n","38":"n","39":"n","40":"n","41":"n","42":"n","43":"n"},"safari":{"3.1":"n","3.2":"n","4":"n","5":"n","5.1":"n","6":"n","6.1":"n","7":"n","7.1":"n","8":"y"},"opera":{"9":"n","9.5-9.6":"y","10.0-10.1":"y","10.5":"y","10.6":"y","11":"y","11.1":"y","11.5":"y","11.6":"y","12":"y","12.1":"y","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"n","23":"n","24":"n","25":"n","26":"n","27":"n","28":"n"},"ios_saf":{"3.2":"n","4.0-4.1":"n","4.2-4.3":"n","5.0-5.1":"n","6.0-6.1":"n","7.0-7.1":"n","8":"y","8.1":"y"},"op_mini":{"5.0-8.0":"n"},"android":{"2.1":"n","2.2":"n","2.3":"n","3":"n","4":"n","4.1":"n","4.2-4.3":"n","4.4":"n","4.4.3-4.4.4":"n","37":"n"},"bb":{"7":"n","10":"n"},"op_mob":{"10":"y","11":"y","11.1":"y","11.5":"y","12":"y","12.1":"y","24":"n"},"and_chr":{"40":"n"},"and_ff":{"33":"y"},"ie_mob":{"10":"n","11":"n"},"and_uc":{"9.9":"n"}},"notes":"Where support for APNG is missing, only the first frame is displayed","notes_by_num":{},"usage_perc_y":18.54,"usage_perc_a":0,"ucprefix":false,"parent":"","keywords":"","ie_id":"","chrome_id":""},"video":{"title":"Video element","description":"Method of playing videos on webpages (without requiring a plug-in).","spec":"https://html.spec.whatwg.org/multipage/embedded-content.html#the-video-element","status":"ls","links":[{"url":"https://dev.opera.com/articles/view/everything-you-need-to-know-about-html5-video-and-audio/","title":"Detailed article on video/audio elements"},{"url":"http://webmproject.org","title":"WebM format information"},{"url":"http://camendesign.co.uk/code/video_for_everybody","title":"Video for Everybody"},{"url":"http://diveintohtml5.info/video.html","title":"Video on the Web - includes info on Android support"},{"url":"https://raw.github.com/phiggins42/has.js/master/detect/video.js#video","title":"has.js test"},{"url":"http://docs.webplatform.org/wiki/html/elements/video","title":"WebPlatform Docs"}],"categories":["HTML5"],"stats":{"ie":{"5.5":"n","6":"n","7":"n","8":"n","9":"y","10":"y","11":"y","TP":"y"},"firefox":{"2":"n","3":"n","3.5":"y","3.6":"y","4":"y","5":"y","6":"y","7":"y","8":"y","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y"},"chrome":{"4":"y","5":"y","6":"y","7":"y","8":"y","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y"},"safari":{"3.1":"n","3.2":"n","4":"y","5":"y","5.1":"y","6":"y","6.1":"y","7":"y","7.1":"y","8":"y"},"opera":{"9":"n","9.5-9.6":"n","10.0-10.1":"n","10.5":"y","10.6":"y","11":"y","11.1":"y","11.5":"y","11.6":"y","12":"y","12.1":"y","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y"},"ios_saf":{"3.2":"y","4.0-4.1":"y","4.2-4.3":"y","5.0-5.1":"y","6.0-6.1":"y","7.0-7.1":"y","8":"y","8.1":"y"},"op_mini":{"5.0-8.0":"n"},"android":{"2.1":"a","2.2":"a","2.3":"y","3":"y","4":"y","4.1":"y","4.2-4.3":"y","4.4":"y","4.4.3-4.4.4":"y","37":"y"},"bb":{"7":"y","10":"y"},"op_mob":{"10":"n","11":"y","11.1":"y","11.5":"y","12":"y","12.1":"y","24":"y"},"and_chr":{"40":"y"},"and_ff":{"33":"y"},"ie_mob":{"10":"y","11":"y"},"and_uc":{"9.9":"y"}},"notes":"Different browsers have support for different video formats, see sub-features for details. \r\n\r\nThe Android browser (before 2.3) requires [specific handling](http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/) to run the video element.","notes_by_num":{},"usage_perc_y":89.62,"usage_perc_a":0.01,"ucprefix":false,"parent":"","keywords":"