master 9585e63563ea cached
8 files
145.3 KB
40.0k tokens
22 symbols
1 requests
Download .txt
Repository: willfarrell/alfred-caniuse-workflow
Branch: master
Commit: 9585e63563ea
Files: 8
Total size: 145.3 KB

Directory structure:
gitextract_buzijdyh/

├── .github/
│   └── FUNDING.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── caniuse.alfredworkflow
└── src/
    ├── caniuse.php
    ├── data.json
    └── workflows.php

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: [willfarrell] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: CONTRIBUTING.md
================================================
# How to contribute
First off, thanks for you interest in contributing. Everyone who uses this repos really appreciates it.

![alt text][alfred]

## Issues
All are welcome.

## Pull Requests
Good pull requests - patches, improvements, new features - are a fantastic help.
They should remain focused in scope and avoid containing unrelated commits. If
your contribution involves a significant amount of work or substantial changes
to any part of the project, please open an issue to discuss it first.

Make sure to adhere to the coding conventions used throughout a project
(indentation, accurate comments, etc.). Please update any documentation that is
relevant to the change you're making.

## Pull Request Checklist
Before you submit your PR please make sure everything is in order.

- [ ] Installed `.alfredworkflow` file from repo before making changes.
- [ ] Update the version in the workflow title. Double-click the workflow to edit.
- [ ] Increase the version number in `update.json`. Right-click the workflow in Alfred, click `Show in Finder`. The `update.json` file will be in that folder.

- [ ] Increase the version number in `current-version.json`.
- [ ] If needed include a large icon in the `src/icon-src/` folder that has square dimensions.
- [ ] If needed include a cached icon in the `sec/icon-cache/` folder that 256x256 pixels. Alfred creates these when you insert an image into a workflow. You can get this from inside the `.alfredworkflow`. Right-click the workflow in Alfred, click `Show in Finder`. The `--hash-value--.png` file will be in that folder. Copy to `/src/icon-cache` and rename.
- [ ] If needed add a screenshot. Use ⌘ (command) + ⇧ (shift) + 4, press ␣ (space), then click on the Alfred window to create a clean screen shot. Place in the `screenshots` folder.
- [ ] Update README.md with new version and any additional screenshots.
- [ ] Export workflow to repo folder. Right-click the workflow in Alfred, click `Export...`. Don't include the `(v1.0)` in the name.

## Pull Request Process
Please follow this process; it's the best way to get your work included in the
project:

1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,
   and configure the remotes:

   ```bash
   # Clones your fork of the repo into the current directory in terminal
   git clone https://github.com/<your-username>/<this-repo-name>.git
   # Navigate to the newly cloned directory
   cd <folder-name>
   # Assigns the original repo to a remote called "upstream"
   git remote add upstream https://github.com/<this-username>/<this-repo-name>.git
   ```

2. If you cloned a while ago, get the latest changes from upstream:

   ```bash
   git checkout master
   git pull upstream master
   ```

3. Create a new topic branch to contain your feature, change, or fix:

   ```bash
   git checkout -b <topic-branch-name>
   ```

4. Commit your changes in logical chunks. Please adhere to these [git commit
   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
   or your pull request is unlikely be merged into the main project. Use git's
   [interactive rebase](https://help.github.com/articles/interactive-rebase)
   feature to tidy up your commits before making them public.

5. Locally merge (or rebase) the upstream development branch into your topic
   branch:

   ```bash
   git pull [--rebase] upstream master
   ```

6. Push your topic branch up to your fork:

   ```bash
   git push origin <topic-branch-name>
   ```

7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests)
   with a clear title and description.

[alfred]: ./screenshots/alfred.png "Alfred Workflow"


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2013 will Farrell

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.


================================================
FILE: README.md
================================================
caniuse ([Download v1.10](https://raw.github.com/willfarrell/alfred-caniuse-workflow/master/caniuse.alfredworkflow))
=====================

Alfred App Workflow for caniuse.com

## Requirements
1. [Alfred App v3](http://www.alfredapp.com/#download)
1. [Alfred Powerpack](https://buy.alfredapp.com/)

## Installing
1. Click the download buttons below
2. Double-click to import into Alfred
3. Review the workflow to add custom Hotkeys

## About
Alfred App Workflow for caniuse.com

![alt text][caniuse]

Upon making your first search the caniuse db is cached (7 days).

## Commands
- `caniuse {query}`

## Contributors
- [@willfarrell](https://github.com/willfarrell)
- [@sydlawrence](https://github.com/sydlawrence) - [alfred-dev-doctor](https://github.com/sydlawrence/alfred-dev-doctor)
- [@Fyrd](https://github.com/Fyrd) - [caniuse](https://github.com/Fyrd/caniuse)
- [@mcdado](https://github.com/mcdado)

[caniuse]: ./screenshots/caniuse-browser.png "Sample search"


================================================
FILE: src/caniuse.php
================================================
<?php
// ****************
//error_reporting(0);
require_once('workflows.php');
$w = new Workflows();

function getSSLPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

function browserVersion($stats) {
    $version = 0;
    $support = '';
    foreach ($stats as $key => $val) {
        $key = floatval($key);
        if ($version < $key && $val == 'y') {
            $support = $key."+";
            break;
        } elseif ($version < $key && strpos($val, 'y x') !== false) {
            $version = $key;
            $support = $key."-px-";
        } elseif ($version < $key && strpos($val, 'a') !== false) {
            $version = $key;
            $support = $key."!pa.";
        } elseif ($version < $key && strpos($val, 'p') !== false) {
            $version = $key;
            $support = $key."w/pl";
        }
    }
    return $support ? $support : "n/a";
}

// cache
if ( filemtime("data.json") <= (time() - 86400 * 7)) {
    $data = json_decode(getSSLPage("https://raw.githubusercontent.com/Fyrd/caniuse/master/data.json"));
    $arr = array();
    foreach ($data->data as $key => $val) {
        $title = $val->title;
        $url = "https://caniuse.com/#feat=" . $key;
        $description = $val->description;
        $keywords = $val->keywords;
        $name = $key;

        $stats = array();
        foreach ($val->stats as $browser => $stat) {
            $stats[$browser] = browserVersion($val->stats->$browser);
        }

        $arr[] = array(
            "name" => $name,
            "url" => $url,
            "keywords" => $keywords,
            "title" => $title,
            "description" =>str_replace("&mdash;","-",html_entity_decode(trim(str_replace("\n"," ",strip_tags($val->description))))),
            "stats" => "[IE:{$stats['ie']}, FF:{$stats['firefox']}, GC:{$stats['chrome']}, S:{$stats['safari']}]"
        );
    }
    if (count($arr)) {
        file_put_contents("data.json", json_encode($arr));
    }
}

if (!isset($query)) { $query = urlencode( "css" ); }

$data = json_decode(file_get_contents("data.json"));

function registerResult($result) {
    global $w;
    $w->result( $result->title, $result->url, $result->title." ".$result->stats, $result->description, "icon.png" );
    return;
}

$found = array();
$query = urldecode(strtolower(trim($query)));

foreach ($data as $key => $result) {
    $value = strtolower(trim($result->title));
    $description = mb_convert_encoding(strip_tags($result->description), 'UTF-8', mb_list_encodings());
    $keywords = mb_convert_encoding($result->keywords, 'UTF-8', mb_list_encodings());
    $name = $result->name;

    if (strpos( $value, $query ) === 0) {
        if (!isset($found[$value])) {
            $found[$value] = true;
            registerResult($result);
        }
    }
    else if (strpos($value, $query) > 0) {
        if (!isset($found[$value])) {
            $found[$value] = true;
            registerResult($result);
        }
    }
    else if (strpos($name, $query) === 0) {
        if (!isset($found[$value])) {
            $found[$value] = true;
            registerResult($result);
        }
    }
    else if (strpos($keywords, $query) !== false) {
        if (!isset($found[$value])) {
            $found[$value] = true;
            registerResult($result);
        }
    }
    else if (strpos($description, $query) !== false) {
        if (!isset($found[$value])) {
            $found[$value] = true;
            registerResult($result);
        }
    }
}

echo $w->toxml();
// ****************
?>


================================================
FILE: src/data.json
================================================
[{"name":"png-alpha","url":"http:\/\/caniuse.com\/#feat=png-alpha","keywords":"","title":"PNG alpha transparency","description":"Semi-transparent areas in PNG files","stats":"[IE:7+, FF:2+, GC:4+, S:3.1+]"},{"name":"apng","url":"http:\/\/caniuse.com\/#feat=apng","keywords":"","title":"Animated PNG (APNG)","description":"Like animated GIFs, but allowing 24-bit colors and alpha transparency","stats":"[IE:n\/a, FF:3+, GC:n\/a, S:8+]"},{"name":"video","url":"http:\/\/caniuse.com\/#feat=video","keywords":"<video>","title":"Video element","description":"Method of playing videos on webpages (without requiring a plug-in).","stats":"[IE:9+, FF:3.5+, GC:4+, S:4+]"},{"name":"audio","url":"http:\/\/caniuse.com\/#feat=audio","keywords":"<audio>","title":"Audio element","description":"Method of playing sound on webpages (without requiring a plug-in).","stats":"[IE:9+, FF:3.5+, GC:4+, S:4+]"},{"name":"contenteditable","url":"http:\/\/caniuse.com\/#feat=contenteditable","keywords":"","title":"contenteditable attribute (basic support)","description":"Method of making any HTML element editable.","stats":"[IE:5.5+, FF:3.5+, GC:4+, S:3.1+]"},{"name":"dragndrop","url":"http:\/\/caniuse.com\/#feat=dragndrop","keywords":"draganddrop","title":"Drag and Drop","description":"Method of easily dragging and dropping elements on a page, requiring minimal JavaScript.","stats":"[IE:11!pa., FF:3.5+, GC:4+, S:3.1+]"},{"name":"internationalization","url":"http:\/\/caniuse.com\/#feat=internationalization","keywords":"Intl,Collator,NumberFormat,DateTimeFormat","title":"Internationalization API","description":"Locale-sensitive collation (string comparison), number formatting, and date and time formatting.","stats":"[IE:11+, FF:29+, GC:24+, S:10+]"},{"name":"queryselector","url":"http:\/\/caniuse.com\/#feat=queryselector","keywords":"query,selectors,selectors api,document.queryselector","title":"querySelector\/querySelectorAll","description":"Method of accessing DOM elements using CSS selectors","stats":"[IE:9+, FF:3.5+, GC:4+, S:3.1+]"},{"name":"getelementsbyclassname","url":"http:\/\/caniuse.com\/#feat=getelementsbyclassname","keywords":"byclassname","title":"getElementsByClassName","description":"Method of accessing DOM elements by class name","stats":"[IE:9+, FF:3+, GC:4+, S:3.1+]"},{"name":"forms","url":"http:\/\/caniuse.com\/#feat=forms","keywords":"input,datepicker","title":"HTML5 form features","description":"Expanded form options, including things like date pickers, sliders, validation, placeholders and multiple file uploads. Previously known as \"Web forms 2.0\".","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"html5semantic","url":"http:\/\/caniuse.com\/#feat=html5semantic","keywords":"","title":"New semantic elements","description":"HTML5 offers some new elements, primarily for semantic purposes. The elements include: `section`, `article`, `aside`, `header`, `footer`, `nav`, `figure`, `figcaption`, `time`, `mark` & `main`.","stats":"[IE:11!pa., FF:21+, GC:26+, S:6.1+]"},{"name":"css-line-clamp","url":"http:\/\/caniuse.com\/#feat=css-line-clamp","keywords":"","title":"CSS line-clamp","description":"Proprietary and undocumented CSS property that will contain text to a given amount of lines when used in combination with `display: -webkit-box`. It will end with ellipsis when `text-overflow: ellipsis` is included.","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:10-px-]"},{"name":"offline-apps","url":"http:\/\/caniuse.com\/#feat=offline-apps","keywords":"appcache,applicationcache,app cache,application cache,online","title":"Offline web applications","description":"Now deprecated method of defining web page files to be cached using a cache manifest file, allowing them to work offline on subsequent visits to the page.","stats":"[IE:10+, FF:3.5+, GC:4+, S:4+]"},{"name":"webworkers","url":"http:\/\/caniuse.com\/#feat=webworkers","keywords":"","title":"Web Workers","description":"Method of running scripts in the background, isolated from the web page","stats":"[IE:10+, FF:3.5+, GC:4+, S:4+]"},{"name":"fontface","url":"http:\/\/caniuse.com\/#feat=fontface","keywords":"font face","title":"@font-face Web fonts","description":"Method of displaying fonts downloaded from websites","stats":"[IE:9+, FF:3.5+, GC:4+, S:3.2+]"},{"name":"eot","url":"http:\/\/caniuse.com\/#feat=eot","keywords":"","title":"EOT - Embedded OpenType fonts","description":"Type of font that can be derived from a regular font, allowing small files and legal use of high-quality fonts. Usage is restricted by the file being tied to the website","stats":"[IE:6+, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"woff","url":"http:\/\/caniuse.com\/#feat=woff","keywords":"","title":"WOFF - Web Open Font Format","description":"Compressed TrueType\/OpenType font that contains information about the font's source.","stats":"[IE:9+, FF:3.6+, GC:5+, S:5.1+]"},{"name":"multibackgrounds","url":"http:\/\/caniuse.com\/#feat=multibackgrounds","keywords":"","title":"CSS3 Multiple backgrounds","description":"Method of using multiple images as a background","stats":"[IE:9+, FF:3.6+, GC:4+, S:3.1+]"},{"name":"border-image","url":"http:\/\/caniuse.com\/#feat=border-image","keywords":"border-image-source,border-image-slice,border-image-repeat,border-image-width,,border-image-outset","title":"CSS3 Border images","description":"Method of using images for borders","stats":"[IE:11+, FF:50+, GC:56!pa., S:9!pa.]"},{"name":"background-img-opts","url":"http:\/\/caniuse.com\/#feat=background-img-opts","keywords":"","title":"CSS3 Background-image options","description":"New properties to affect background images, including background-clip, background-origin and background-size","stats":"[IE:9+, FF:4+, GC:15+, S:7+]"},{"name":"css-table","url":"http:\/\/caniuse.com\/#feat=css-table","keywords":"display:table,table-cell,table-row,table-layout","title":"CSS Table display","description":"Method of displaying elements as tables, rows, and cells. Includes support for all `display: table-*` properties as well as `display: inline-table`","stats":"[IE:8+, FF:3+, GC:4+, S:3.1+]"},{"name":"css-gencontent","url":"http:\/\/caniuse.com\/#feat=css-gencontent","keywords":"before,after","title":"CSS Generated content for pseudo-elements","description":"Method of displaying text or images before or after the given element's contents using the ::before and ::after pseudo-elements. All browsers with support also support the `attr()` notation in the `content` property.","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"css-fixed","url":"http:\/\/caniuse.com\/#feat=css-fixed","keywords":"","title":"CSS position:fixed","description":"Method of keeping an element in a fixed location regardless of scroll position","stats":"[IE:7+, FF:2+, GC:4+, S:3.1+]"},{"name":"beacon","url":"http:\/\/caniuse.com\/#feat=beacon","keywords":"","title":"Beacon API","description":"Allows data to be sent asynchronously to a server with `navigator.sendBeacon`, even after a page was closed. Useful for posting analytics data the moment a user was finished using the page.","stats":"[IE:n\/a, FF:31+, GC:39+, S:n\/a]"},{"name":"hashchange","url":"http:\/\/caniuse.com\/#feat=hashchange","keywords":"onhashchange,HashChangeEvent","title":"Hashchange event","description":"Event triggered in JavaScript when the URL's hash has changed (for example: page.html#foo to page.html#bar)","stats":"[IE:8+, FF:3.6+, GC:5+, S:5+]"},{"name":"css-sel2","url":"http:\/\/caniuse.com\/#feat=css-sel2","keywords":"attribute selector","title":"CSS 2.1 selectors","description":"Basic CSS selectors including: `*` (universal selector), `>` (child selector), `:first-child`, `:link`, `:visited`, `:active`, `:hover`, `:focus`, `:lang()`, `+` (adjacent sibling selector), `[attr]`, `[attr=\"val\"]`, `[attr~=\"val\"]`, `[attr|=\"bar\"]`, `.foo` (class selector), `#foo` (id selector)","stats":"[IE:7+, FF:2+, GC:4+, S:3.1+]"},{"name":"css-sel3","url":"http:\/\/caniuse.com\/#feat=css-sel3","keywords":"","title":"CSS3 selectors","description":"Advanced element selection using selectors including: `[foo^=\"bar\"]`, `[foo$=\"bar\"]`, `[foo*=\"bar\"]`, `:root`, `:nth-child()`,  `:nth-last-child()`, `nth-of-type`, `nth-last-of-type()`, `:last-child`, `:first-of-type`, `:last-of-type`, `:only-child`, `:only-of-type`, `:empty`, `:target`, `:enabled`, `:disabled`, `:checked`, `:not()`, `~` (general sibling)","stats":"[IE:9+, FF:3.5+, GC:4+, S:3.2+]"},{"name":"css-textshadow","url":"http:\/\/caniuse.com\/#feat=css-textshadow","keywords":"text shadow","title":"CSS3 Text-shadow","description":"Method of applying one or more shadow or blur effects to text","stats":"[IE:n\/a, FF:3.5+, GC:4+, S:4+]"},{"name":"css-boxshadow","url":"http:\/\/caniuse.com\/#feat=css-boxshadow","keywords":"box-shadows,boxshadows,box shadow,shaow","title":"CSS3 Box-shadow","description":"Method of displaying an inner or outer shadow effect to elements","stats":"[IE:9+, FF:4+, GC:10+, S:5.1+]"},{"name":"css3-colors","url":"http:\/\/caniuse.com\/#feat=css3-colors","keywords":"rgb,hsl,rgba,hsla","title":"CSS3 Colors","description":"Method of describing colors using Hue, Saturation and Lightness (hsl()) rather than just RGB, as well as allowing alpha-transparency with rgba() and hsla().","stats":"[IE:9+, FF:3+, GC:4+, S:3.1+]"},{"name":"css3-boxsizing","url":"http:\/\/caniuse.com\/#feat=css3-boxsizing","keywords":"border-box,content-box","title":"CSS3 Box-sizing","description":"Method of specifying whether or not an element's borders and padding should be included in size units","stats":"[IE:8+, FF:29+, GC:10+, S:5.1+]"},{"name":"css-mediaqueries","url":"http:\/\/caniuse.com\/#feat=css-mediaqueries","keywords":"@media","title":"CSS3 Media Queries","description":"Method of applying styles based on media information. Includes things like page and device dimensions","stats":"[IE:8w\/pl, FF:3.5+, GC:26+, S:6.1+]"},{"name":"multicolumn","url":"http:\/\/caniuse.com\/#feat=multicolumn","keywords":"column-count,column-width,column-gap,column-rule,column-span,column-fill","title":"CSS3 Multiple column layout","description":"Method of flowing information in multiple columns","stats":"[IE:10+, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"border-radius","url":"http:\/\/caniuse.com\/#feat=border-radius","keywords":"roundedcorners, border radius,-moz-border-radius","title":"CSS3 Border-radius (rounded corners)","description":"Method of making the border corners round. Covers support for the shorthand `border-radius` as well as the long-hand properties (e.g. `border-top-left-radius`)","stats":"[IE:9+, FF:4+, GC:5+, S:5+]"},{"name":"transforms2d","url":"http:\/\/caniuse.com\/#feat=transforms2d","keywords":"transformation,translate,translatex,translatey,translatez,transform3d,rotation,rotate,scale,css-transforms,transform-origin,transform:rotate,transform:scale","title":"CSS3 2D Transforms","description":"Method of transforming an element including rotating, scaling, etc. Includes support for `transform` as well as `transform-origin` properties.","stats":"[IE:10+, FF:16+, GC:36+, S:9+]"},{"name":"use-strict","url":"http:\/\/caniuse.com\/#feat=use-strict","keywords":"","title":"ECMAScript 5 Strict Mode","description":"Method of placing code in a \"strict\" operating context.","stats":"[IE:10+, FF:4+, GC:13+, S:6+]"},{"name":"devicepixelratio","url":"http:\/\/caniuse.com\/#feat=devicepixelratio","keywords":"device,pixel,ratio,size","title":"Window.devicePixelRatio","description":"Read-only property that returns the ratio of the (vertical) size of one physical pixel on the current display device to the size of one CSS pixel.","stats":"[IE:11+, FF:18+, GC:4+, S:3.1+]"},{"name":"transforms3d","url":"http:\/\/caniuse.com\/#feat=transforms3d","keywords":"css 3d,3dtransforms,translate3d,backface visibility,perspective,transform-origin,transform-style","title":"CSS3 3D Transforms","description":"Method of transforming an element in the third dimension using the `transform` property. Includes support for the `perspective` property to set the perspective in z-space and the `backface-visibility` property to toggle display of the reverse side of a 3D-transformed element.","stats":"[IE:11!pa., FF:16+, GC:36+, S:8-px-]"},{"name":"sharedworkers","url":"http:\/\/caniuse.com\/#feat=sharedworkers","keywords":"shared worker","title":"Shared Web Workers","description":"Method of allowing multiple scripts to communicate with a single web worker.","stats":"[IE:n\/a, FF:29+, GC:4+, S:5+]"},{"name":"css-hyphens","url":"http:\/\/caniuse.com\/#feat=css-hyphens","keywords":"hyphen,shy","title":"CSS Hyphenation","description":"Method of controlling when words at the end of lines should be hyphenated using the \"hyphens\" property.","stats":"[IE:11-px-, FF:43+, GC:n\/a, S:10-px-]"},{"name":"css-transitions","url":"http:\/\/caniuse.com\/#feat=css-transitions","keywords":"css transition,transitionend,transition-property,transition-duration,transition-timing-function,transition-delay","title":"CSS3 Transitions","description":"Simple method of animating certain properties of an element, with ability to define property, duration, delay and timing function.","stats":"[IE:10+, FF:16+, GC:26+, S:6.1+]"},{"name":"font-feature","url":"http:\/\/caniuse.com\/#feat=font-feature","keywords":"font-feature,font-feature-settings,kern,kerning,font-variant-alternates,ligatures,font-variant-ligatures","title":"CSS font-feature-settings","description":"Method of applying advanced typographic and language-specific font features to supported OpenType fonts.","stats":"[IE:10+, FF:34+, GC:48+, S:9.1+]"},{"name":"css-animation","url":"http:\/\/caniuse.com\/#feat=css-animation","keywords":"animations,css-animations,animation-name,animation-duration,animation-delay,animation-timing-function,@keyframes,animationstart,animationend,animationiteration,css3 animation","title":"CSS Animation","description":"Complex method of animating certain properties of an element","stats":"[IE:10+, FF:16+, GC:43+, S:9+]"},{"name":"css-gradients","url":"http:\/\/caniuse.com\/#feat=css-gradients","keywords":"linear,linear-gradient,gradiant","title":"CSS Gradients","description":"Method of defining a linear or radial color gradient as a CSS image.","stats":"[IE:10+, FF:16+, GC:26+, S:6.1+]"},{"name":"css-canvas","url":"http:\/\/caniuse.com\/#feat=css-canvas","keywords":"","title":"CSS Canvas Drawings","description":"Method of using HTML5 Canvas as a background image. Not currently part of any specification.","stats":"[IE:n\/a, FF:n\/a, GC:47-px-, S:10-px-]"},{"name":"css-reflections","url":"http:\/\/caniuse.com\/#feat=css-reflections","keywords":"box-reflect","title":"CSS Reflections","description":"Method of displaying a reflection of an element","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:10-px-]"},{"name":"css-masks","url":"http:\/\/caniuse.com\/#feat=css-masks","keywords":"clip,clip-path,clip-rule,mask,mask-border,mask-clip,mask-image,mask-mode,mask-type","title":"CSS Masks","description":"Method of displaying part of an element, using a selected image as a mask","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"console-basic","url":"http:\/\/caniuse.com\/#feat=console-basic","keywords":"console.log,console.info,console.warn,console.error,window.console","title":"Basic console logging functions","description":"Method of outputting data to the browser's console, intended for development purposes.","stats":"[IE:10+, FF:4+, GC:4+, S:3.1+]"},{"name":"svg","url":"http:\/\/caniuse.com\/#feat=svg","keywords":"rect,circle,ellipse,line,polyline,polygon,defs,symbol,use,tspan,tref,textpath,stroke-dasharray,stroke-dashoffset","title":"SVG (basic support)","description":"Method of displaying basic Vector Graphics features using the embed or object elements. Refers to the SVG 1.1 spec.","stats":"[IE:8w\/pl, FF:3+, GC:4+, S:3.2+]"},{"name":"svg-css","url":"http:\/\/caniuse.com\/#feat=svg-css","keywords":"svg-in-css,svgincss,css-svg","title":"SVG in CSS backgrounds","description":"Method of using SVG images as CSS backgrounds","stats":"[IE:9+, FF:24+, GC:5+, S:5+]"},{"name":"svg-smil","url":"http:\/\/caniuse.com\/#feat=svg-smil","keywords":"svg animation","title":"SVG SMIL animation","description":"Method of using animation elements to animate SVG images","stats":"[IE:11w\/pl, FF:4+, GC:5+, S:6+]"},{"name":"svg-fonts","url":"http:\/\/caniuse.com\/#feat=svg-fonts","keywords":"","title":"SVG fonts","description":"Method of using fonts defined as SVG shapes. Removed from [SVG 2.0](http:\/\/www.w3.org\/TR\/SVG2\/changes.html#fonts) and considered as a deprecated feature with support being removed from browsers.","stats":"[IE:8w\/pl, FF:n\/a, GC:4+, S:3.2+]"},{"name":"svg-filters","url":"http:\/\/caniuse.com\/#feat=svg-filters","keywords":"","title":"SVG filters","description":"Method of using photoshop-like effects on SVG objects including blurring and color manipulation.","stats":"[IE:10+, FF:3+, GC:8+, S:6+]"},{"name":"svg-html","url":"http:\/\/caniuse.com\/#feat=svg-html","keywords":"","title":"SVG effects for HTML","description":"Method of using SVG transforms, filters, etc on HTML elements using either CSS or the foreignObject element","stats":"[IE:11!pa., FF:3.5+, GC:56!pa., S:10!pa.]"},{"name":"svg-html5","url":"http:\/\/caniuse.com\/#feat=svg-html5","keywords":"","title":"Inline SVG in HTML5","description":"Method of using SVG tags directly in HTML documents. Requires HTML5 parser.","stats":"[IE:8w\/pl, FF:4+, GC:7+, S:9+]"},{"name":"canvas","url":"http:\/\/caniuse.com\/#feat=canvas","keywords":"toDataURL()","title":"Canvas (basic support)","description":"Method of generating fast, dynamic graphics using JavaScript.","stats":"[IE:9+, FF:3.6+, GC:4+, S:4+]"},{"name":"canvas-text","url":"http:\/\/caniuse.com\/#feat=canvas-text","keywords":"","title":"Text API for Canvas","description":"Method of displaying text on Canvas elements","stats":"[IE:9+, FF:3.5+, GC:4+, S:4+]"},{"name":"namevalue-storage","url":"http:\/\/caniuse.com\/#feat=namevalue-storage","keywords":"webstorage,local storage","title":"Web Storage - name\/value pairs","description":"Method of storing data locally like cookies, but for larger amounts of data (sessionStorage and localStorage, used to fall under HTML5).","stats":"[IE:8+, FF:3.5+, GC:4+, S:4+]"},{"name":"sql-storage","url":"http:\/\/caniuse.com\/#feat=sql-storage","keywords":"db-storage,websql","title":"Web SQL Database","description":"Method of storing data client-side, allows Sqlite database queries for access and manipulation","stats":"[IE:n\/a, FF:n\/a, GC:4+, S:3.1+]"},{"name":"indexeddb","url":"http:\/\/caniuse.com\/#feat=indexeddb","keywords":"indexdb","title":"IndexedDB","description":"Method of storing data client-side, allows indexed database queries.","stats":"[IE:11!pa., FF:16+, GC:24+, S:10+]"},{"name":"online-status","url":"http:\/\/caniuse.com\/#feat=online-status","keywords":"","title":"Online\/offline status","description":"Events to indicate when the user's connected (`online` and `offline` events) and the `navigator.onLine` property to see current status.","stats":"[IE:9+, FF:3.5+, GC:14+, S:5+]"},{"name":"eventsource","url":"http:\/\/caniuse.com\/#feat=eventsource","keywords":"serversent,s-sent-events","title":"Server-sent events","description":"Method of continuously sending data from a server to the browser, rather than repeatedly requesting it (EventSource interface, used to fall under HTML5)","stats":"[IE:n\/a, FF:6+, GC:6+, S:5+]"},{"name":"x-doc-messaging","url":"http:\/\/caniuse.com\/#feat=x-doc-messaging","keywords":"","title":"Cross-document messaging","description":"Method of sending information from a page on one domain to a page on a different one (using postMessage)","stats":"[IE:11!pa., FF:3+, GC:4+, S:4+]"},{"name":"sni","url":"http:\/\/caniuse.com\/#feat=sni","keywords":"sni","title":"Server Name Indication","description":"An extension to the TLS computer networking protocol by which a client indicates which hostname it is attempting to connect to at the start of the handshaking process.","stats":"[IE:9+, FF:2+, GC:6+, S:3.1+]"},{"name":"datauri","url":"http:\/\/caniuse.com\/#feat=datauri","keywords":"data url,datauris,data uri,dataurl,dataurls,base64","title":"Data URIs","description":"Method of embedding images and other files in webpages as a string of text, generally using base64 encoding.","stats":"[IE:11!pa., FF:2+, GC:4+, S:3.1+]"},{"name":"wav","url":"http:\/\/caniuse.com\/#feat=wav","keywords":"","title":"Wav audio format","description":"Waveform Audio File Format, aka WAV or WAVE, a typically uncompressed audio format.","stats":"[IE:n\/a, FF:3.5+, GC:8+, S:4+]"},{"name":"mathml","url":"http:\/\/caniuse.com\/#feat=mathml","keywords":"","title":"MathML","description":"Special tags that allow mathematical formulas and notations to be written on web pages.","stats":"[IE:8w\/pl, FF:4+, GC:24+, S:5.1+]"},{"name":"css-featurequeries","url":"http:\/\/caniuse.com\/#feat=css-featurequeries","keywords":"supports,conditional","title":"CSS Feature Queries","description":"CSS Feature Queries allow authors to condition rules based on whether particular property declarations are supported in CSS using the @supports at rule.","stats":"[IE:n\/a, FF:22+, GC:28+, S:9+]"},{"name":"xhtml","url":"http:\/\/caniuse.com\/#feat=xhtml","keywords":"xhtml+xml","title":"XHTML served as application\/xhtml+xml","description":"A strict form of HTML, and allows embedding of other XML languages","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"xhtmlsmil","url":"http:\/\/caniuse.com\/#feat=xhtmlsmil","keywords":"","title":"XHTML+SMIL animation","description":"Method of using SMIL animation in web pages","stats":"[IE:8!pa., FF:52w\/pl, GC:56w\/pl, S:10w\/pl]"},{"name":"wai-aria","url":"http:\/\/caniuse.com\/#feat=wai-aria","keywords":"wai,aria","title":"WAI-ARIA Accessibility features","description":"Method of providing ways for people with disabilities to use dynamic web content and web applications.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"geolocation","url":"http:\/\/caniuse.com\/#feat=geolocation","keywords":"","title":"Geolocation","description":"Method of informing a website of the user's geographical location","stats":"[IE:9+, FF:3.5+, GC:5+, S:5+]"},{"name":"flexbox","url":"http:\/\/caniuse.com\/#feat=flexbox","keywords":"flex-box,flex-direction,flex-wrap,flex-flow,flex-grow,flex-basis,display:flex,flex box","title":"Flexible Box Layout Module","description":"Method of positioning elements in horizontal or vertical stacks. Support includes the support for the all properties prefixed with `flex` as well as `display: flex`, `display: inline-flex`, `align-content`, `align-items`, `align-self`, `justify-content` and `order`.","stats":"[IE:11!pa., FF:28+, GC:29+, S:9+]"},{"name":"webgl","url":"http:\/\/caniuse.com\/#feat=webgl","keywords":"web gl","title":"WebGL - 3D Canvas graphics","description":"Method of generating dynamic 3D graphics using JavaScript, accelerated through hardware","stats":"[IE:10w\/pl, FF:52!pa., GC:33+, S:8+]"},{"name":"fileapi","url":"http:\/\/caniuse.com\/#feat=fileapi","keywords":"FileReader","title":"File API","description":"Method of manipulating file objects in web applications client-side, as well as programmatically selecting them and accessing their data.","stats":"[IE:11!pa., FF:28+, GC:38+, S:10+]"},{"name":"shadowdom","url":"http:\/\/caniuse.com\/#feat=shadowdom","keywords":"web components","title":"Shadow DOM v0","description":"Method of establishing and maintaining functional boundaries between DOM trees and how these trees interact with each other within a document, thus enabling better functional encapsulation within the DOM.","stats":"[IE:n\/a, FF:n\/a, GC:35+, S:10+]"},{"name":"websockets","url":"http:\/\/caniuse.com\/#feat=websockets","keywords":"","title":"Web Sockets","description":"Bidirectional communication technology for web apps","stats":"[IE:10+, FF:11+, GC:16+, S:7+]"},{"name":"hidden","url":"http:\/\/caniuse.com\/#feat=hidden","keywords":"","title":"hidden attribute","description":"The `hidden` attribute may be applied to any element, and effectively hides elements similar to `display: none` in CSS.","stats":"[IE:11+, FF:4+, GC:6+, S:5.1+]"},{"name":"script-async","url":"http:\/\/caniuse.com\/#feat=script-async","keywords":"","title":"async attribute for external scripts","description":"The boolean async attribute on script elements allows the external JavaScript file to run when it's available, without delaying page load first.","stats":"[IE:10+, FF:3.6+, GC:8+, S:5.1+]"},{"name":"mediasource","url":"http:\/\/caniuse.com\/#feat=mediasource","keywords":"sourcebuffer,endofstream,mse","title":"Media Source Extensions","description":"API allowing media data to be accessed from HTML `video` and `audio` elements.","stats":"[IE:11!pa., FF:42+, GC:31+, S:8+]"},{"name":"cors","url":"http:\/\/caniuse.com\/#feat=cors","keywords":"","title":"Cross-Origin Resource Sharing","description":"Method of performing XMLHttpRequests across domains","stats":"[IE:11+, FF:3.5+, GC:13+, S:5.1!pa.]"},{"name":"css-backdrop-filter","url":"http:\/\/caniuse.com\/#feat=css-backdrop-filter","keywords":"blue,hue-rotate,invert,saturate,filter","title":"CSS Backdrop Filter","description":"Method of applying filter effects (like blur, grayscale or hue) to content\/elements below the target element.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:10-px-]"},{"name":"calc","url":"http:\/\/caniuse.com\/#feat=calc","keywords":"","title":"calc() as CSS unit value","description":"Method of allowing calculated values for length units, i.e. `width: calc(100% - 3em)`","stats":"[IE:10+, FF:16+, GC:26+, S:6.1+]"},{"name":"dom-range","url":"http:\/\/caniuse.com\/#feat=dom-range","keywords":"DOM,range,selection","title":"Document Object Model Range","description":"A contiguous range of content in a Document, DocumentFragment or Attr","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"ruby","url":"http:\/\/caniuse.com\/#feat=ruby","keywords":"ruby-base,ruby-text,ruby-position,ruby-merge,ruby-align","title":"Ruby annotation","description":"Method of adding pronunciation or other annotations using ruby elements (primarily used in East Asian typography).","stats":"[IE:11!pa., FF:38+, GC:56!pa., S:10!pa.]"},{"name":"css-opacity","url":"http:\/\/caniuse.com\/#feat=css-opacity","keywords":"transparent,transparency,alpha","title":"CSS3 Opacity","description":"Method of setting the transparency level of an element","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"form-validation","url":"http:\/\/caniuse.com\/#feat=form-validation","keywords":"","title":"Form validation","description":"Method of setting required fields and field types without requiring JavaScript. This includes preventing forms from being submitted when appropriate, the `checkValidity()` method as well as support for the `:invalid`, `:valid`, and `:required` CSS pseudo-classes.","stats":"[IE:10+, FF:4+, GC:10+, S:10!pa.]"},{"name":"history","url":"http:\/\/caniuse.com\/#feat=history","keywords":"onpushstate,onreplacestate","title":"Session history management","description":"Method of manipulating the user's browser's session history in JavaScript using `history.pushState`, `history.replaceState` and the `popstate` event.","stats":"[IE:10+, FF:4+, GC:5+, S:6+]"},{"name":"json","url":"http:\/\/caniuse.com\/#feat=json","keywords":"","title":"JSON parsing","description":"Method of converting JavaScript objects to JSON strings and JSON back to objects using JSON.stringify() and JSON.parse()","stats":"[IE:9+, FF:3.5+, GC:4+, S:4+]"},{"name":"classlist","url":"http:\/\/caniuse.com\/#feat=classlist","keywords":"","title":"classList (DOMTokenList)","description":"Method of easily manipulating classes on elements, using the DOMTokenList object.","stats":"[IE:11!pa., FF:26+, GC:28+, S:7+]"},{"name":"text-overflow","url":"http:\/\/caniuse.com\/#feat=text-overflow","keywords":"textoverflow,ellipsis","title":"CSS3 Text-overflow","description":"Append ellipsis when text overflows its containing element","stats":"[IE:6+, FF:7+, GC:4+, S:3.1+]"},{"name":"webm","url":"http:\/\/caniuse.com\/#feat=webm","keywords":"matroska","title":"WebM video format","description":"Multimedia format designed to provide a royalty-free, high-quality open video compression format for use with HTML5 video. WebM supports the video codec VP8 and VP9.","stats":"[IE:11w\/pl, FF:28+, GC:25+, S:10w\/pl]"},{"name":"mpeg4","url":"http:\/\/caniuse.com\/#feat=mpeg4","keywords":"avc,mp4,mpv,mov,aac,h264","title":"MPEG-4\/H.264 video format","description":"Commonly used video compression format.","stats":"[IE:9+, FF:35+, GC:4+, S:3.2+]"},{"name":"ogv","url":"http:\/\/caniuse.com\/#feat=ogv","keywords":"xiph","title":"Ogg\/Theora video format","description":"Free lossy video compression format.","stats":"[IE:11w\/pl, FF:3.5+, GC:4+, S:n\/a]"},{"name":"wordwrap","url":"http:\/\/caniuse.com\/#feat=wordwrap","keywords":"wordwrap,word-wrap","title":"CSS3 Overflow-wrap","description":"Allows lines to be broken within words if an otherwise unbreakable string is too long to fit. Currently mostly supported using the `word-wrap` property.","stats":"[IE:11!pa., FF:49+, GC:23+, S:6.1+]"},{"name":"pointerlock","url":"http:\/\/caniuse.com\/#feat=pointerlock","keywords":"mouselock,pointer lock,mouse lock,requestPointerLock,pointerLockElement,exitPointerLock,movementX,movementY","title":"PointerLock API","description":"API that provides access to raw mouse movement data. This is done by ignoring boundaries resulting from screen edges where the cursor can't go beyond, providing proper control for first person or real time strategy games.","stats":"[IE:n\/a, FF:41+, GC:37+, S:n\/a]"},{"name":"object-fit","url":"http:\/\/caniuse.com\/#feat=object-fit","keywords":"objectfit,objectposition","title":"CSS3 object-fit\/object-position","description":"Method of specifying how an object (image or video) should fit inside its box. object-fit options include \"contain\" (fit according to aspect ratio), \"fill\" (stretches object to fill) and \"cover\" (overflows box but maintains ratio), where object-position allows the object to be repositioned like background-image does.","stats":"[IE:n\/a, FF:36+, GC:31+, S:10+]"},{"name":"xhr2","url":"http:\/\/caniuse.com\/#feat=xhr2","keywords":"formdata","title":"XMLHttpRequest advanced features","description":"Adds more functionality to XHR (aka AJAX) requests like file uploads, transfer progress information and the ability to send form data. Previously known as [XMLHttpRequest Level 2](http:\/\/www.w3.org\/TR\/2012\/WD-XMLHttpRequest-20120117\/), these features now appear simply in the XMLHttpRequest spec.","stats":"[IE:11!pa., FF:12+, GC:31+, S:7.1+]"},{"name":"minmaxwh","url":"http:\/\/caniuse.com\/#feat=minmaxwh","keywords":"min-width,min-height,max-width,max-height","title":"CSS min\/max-width\/height","description":"Method of setting a minimum or maximum width or height to an element.","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"details","url":"http:\/\/caniuse.com\/#feat=details","keywords":"","title":"Details & Summary elements","description":"The  element generates a simple no-JavaScript widget to show\/hide element contents, optionally by clicking on its child  element.","stats":"[IE:8w\/pl, FF:49+, GC:36+, S:5.1w\/pl]"},{"name":"text-stroke","url":"http:\/\/caniuse.com\/#feat=text-stroke","keywords":"textstroke,stroke-color,stroke-width,fill-color,text-outline","title":"CSS text-stroke","description":"Method of declaring the outline (stroke) width and color for text.","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:10-px-]"},{"name":"chacha20-poly1305","url":"http:\/\/caniuse.com\/#feat=chacha20-poly1305","keywords":"chacha20,poly1305,tls,cipher","title":"ChaCha20-Poly1305 cipher suites for TLS","description":"A set of cipher suites used in Transport Layer Security (TLS) protocol, using ChaCha20 for symmetric encryption and Poly1305 for authentication.","stats":"[IE:n\/a, FF:47+, GC:49+, S:n\/a]"},{"name":"inline-block","url":"http:\/\/caniuse.com\/#feat=inline-block","keywords":"inlineblock,display:inline-block","title":"CSS inline-block","description":"Method of displaying an element as a block while flowing it with text.","stats":"[IE:8+, FF:3+, GC:4+, S:3.1+]"},{"name":"notifications","url":"http:\/\/caniuse.com\/#feat=notifications","keywords":"","title":"Web Notifications","description":"Method of alerting the user outside of a web page by displaying notifications (that do not require interaction by the user).","stats":"[IE:n\/a, FF:22+, GC:22+, S:6+]"},{"name":"stream","url":"http:\/\/caniuse.com\/#feat=stream","keywords":"camera,device,getUserMedia,media stream,mediastream,Media Capture API","title":"getUserMedia\/Stream API","description":"Method of accessing external device data (such as a webcam video stream). Formerly this was envisioned as the  element.","stats":"[IE:n\/a, FF:52-px-, GC:56!pa., S:n\/a]"},{"name":"svg-img","url":"http:\/\/caniuse.com\/#feat=svg-img","keywords":"svg-as-img,svg-in-img","title":"SVG in HTML img element","description":"Method of displaying SVG images in HTML using .","stats":"[IE:9+, FF:4+, GC:28+, S:9+]"},{"name":"datalist","url":"http:\/\/caniuse.com\/#feat=datalist","keywords":"list attribute","title":"Datalist element","description":"Method of setting a list of options for a user to select in a text field, while leaving the ability to enter a custom value.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10w\/pl]"},{"name":"dataset","url":"http:\/\/caniuse.com\/#feat=dataset","keywords":"DOMStringMap","title":"dataset & data-* attributes","description":"Method of applying and accessing custom data to elements.","stats":"[IE:11+, FF:6+, GC:45+, S:5!pa.]"},{"name":"css-grid","url":"http:\/\/caniuse.com\/#feat=css-grid","keywords":"grids,grid-row,grid-column,display:grid","title":"CSS Grid Layout","description":"Method of using a grid concept to lay out content, providing a mechanism for authors to divide available space for lay out into columns and rows using a set of predictable sizing behaviors","stats":"[IE:11!pa., FF:52w\/pl, GC:56w\/pl, S:10w\/pl]"},{"name":"menu","url":"http:\/\/caniuse.com\/#feat=menu","keywords":"contextmenu,menuitem,command","title":"Toolbar\/context menu","description":"Method of defining a toolbar menu, a context menu or a list of (interactive) options using the  element.","stats":"[IE:n\/a, FF:52!pa., GC:n\/a, S:n\/a]"},{"name":"css-zoom","url":"http:\/\/caniuse.com\/#feat=css-zoom","keywords":"-ms-zoom,transform,-moz-transform,-ms-transform,-webkit-transform,-o-transform,scale,css-transforms","title":"CSS zoom","description":"Non-standard method of scaling content.","stats":"[IE:5.5+, FF:n\/a, GC:4+, S:4+]"},{"name":"rem","url":"http:\/\/caniuse.com\/#feat=rem","keywords":"rems","title":"rem (root em) units","description":"Type of unit similar to `em`, but relative only to the root element, not any parent element. Thus compounding does not occur as it does with `em` units.","stats":"[IE:11+, FF:3.6+, GC:4+, S:5+]"},{"name":"ttf","url":"http:\/\/caniuse.com\/#feat=ttf","keywords":"","title":"TTF\/OTF - TrueType and OpenType font support","description":"Support for the TrueType (.ttf) and OpenType (.otf) outline font formats in @font-face.","stats":"[IE:11!pa., FF:3.5+, GC:4+, S:3.1+]"},{"name":"touch","url":"http:\/\/caniuse.com\/#feat=touch","keywords":"touchstart,touchend,touchmove,touchenter,touchleave,touchcancel","title":"Touch events","description":"Method of registering when, where and how the interface is touched, for devices with a touch screen. These DOM events are similar to mousedown, mousemove, etc.","stats":"[IE:11w\/pl, FF:18+, GC:22+, S:n\/a]"},{"name":"matchesselector","url":"http:\/\/caniuse.com\/#feat=matchesselector","keywords":" matchesSelector","title":"matches() DOM method","description":"Method of testing whether or not a DOM element matches a given selector. Formerly known (and largely supported with prefix) as matchesSelector.","stats":"[IE:11!pa., FF:34+, GC:34+, S:7.1+]"},{"name":"pointer-events","url":"http:\/\/caniuse.com\/#feat=pointer-events","keywords":"pointerevents,pointer-events:none","title":"CSS pointer-events (for HTML)","description":"This CSS property, when set to \"none\" allows elements to not receive hover\/click events, instead the event will occur on anything behind it.","stats":"[IE:11+, FF:3.6+, GC:4+, S:4+]"},{"name":"blobbuilder","url":"http:\/\/caniuse.com\/#feat=blobbuilder","keywords":"","title":"Blob constructing","description":"Construct Blobs (binary large objects) either using the BlobBuilder API (deprecated) or the Blob constructor.","stats":"[IE:10+, FF:13+, GC:20+, S:6+]"},{"name":"filereader","url":"http:\/\/caniuse.com\/#feat=filereader","keywords":"","title":"FileReader API","description":"Method of reading the contents of a File or Blob object into memory","stats":"[IE:11!pa., FF:3.6+, GC:6+, S:6+]"},{"name":"filesystem","url":"http:\/\/caniuse.com\/#feat=filesystem","keywords":"filewriter,requestFileSystem","title":"Filesystem & FileWriter API","description":"Method of reading and writing files to a sandboxed file system.","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:n\/a]"},{"name":"bloburls","url":"http:\/\/caniuse.com\/#feat=bloburls","keywords":"createobjecturl,revokeobjecturl","title":"Blob URLs","description":"Method of creating URL handles to the specified File or Blob object.","stats":"[IE:10+, FF:4+, GC:23+, S:6.1+]"},{"name":"rellist","url":"http:\/\/caniuse.com\/#feat=rellist","keywords":"","title":"relList (DOMTokenList)","description":"Method of easily manipulating rel attribute values on elements, using the DOMTokenList object (similar to classList).","stats":"[IE:n\/a, FF:30+, GC:n\/a, S:9+]"},{"name":"typedarrays","url":"http:\/\/caniuse.com\/#feat=typedarrays","keywords":"ES6,JavaScript,dataview,arraybuffer","title":"Typed Arrays","description":"JavaScript typed arrays provide a mechanism for accessing raw binary data much more efficiently. Includes: `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `Float32Array` & `Float64Array`","stats":"[IE:11+, FF:4+, GC:7+, S:6+]"},{"name":"deviceorientation","url":"http:\/\/caniuse.com\/#feat=deviceorientation","keywords":"","title":"DeviceOrientation & DeviceMotion events","description":"API for detecting orientation and motion events from the device running the browser.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:n\/a]"},{"name":"script-defer","url":"http:\/\/caniuse.com\/#feat=script-defer","keywords":"","title":"defer attribute for external scripts","description":"The boolean defer attribute on script elements allows the external JavaScript file to run when the DOM is loaded, without delaying page load first.","stats":"[IE:10+, FF:3.5+, GC:8+, S:5+]"},{"name":"nav-timing","url":"http:\/\/caniuse.com\/#feat=nav-timing","keywords":"performance,performance.timing","title":"Navigation Timing API","description":"API for accessing timing information related to navigation and elements.","stats":"[IE:9+, FF:7+, GC:13+, S:8+]"},{"name":"audio-api","url":"http:\/\/caniuse.com\/#feat=audio-api","keywords":"web-audio,webaudio,AudioContext,AudioBuffer,AudioNode","title":"Web Audio API","description":"High-level JavaScript API for processing and synthesizing audio","stats":"[IE:n\/a, FF:25+, GC:34+, S:10-px-]"},{"name":"css-regions","url":"http:\/\/caniuse.com\/#feat=css-regions","keywords":"","title":"CSS Regions","description":"Method of flowing content into multiple elements.","stats":"[IE:11!pa., FF:n\/a, GC:18!pa., S:10-px-]"},{"name":"spellcheck-attribute","url":"http:\/\/caniuse.com\/#feat=spellcheck-attribute","keywords":"spelling","title":"Spellcheck attribute","description":"Attribute for `input`\/`textarea` fields to enable\/disable the browser's spellchecker.","stats":"[IE:10+, FF:2+, GC:9+, S:5.1+]"},{"name":"fullscreen","url":"http:\/\/caniuse.com\/#feat=fullscreen","keywords":"full-screen","title":"Full Screen API","description":"API for allowing content (like a video or canvas element) to take up the entire screen.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"css-exclusions","url":"http:\/\/caniuse.com\/#feat=css-exclusions","keywords":"floats,exclusions,wrap-flow,wrap-through","title":"CSS Exclusions Level 1","description":"Exclusions defines how inline content flows around elements. It extends the content wrapping ability of floats to any block-level element.","stats":"[IE:11-px-, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"requestanimationframe","url":"http:\/\/caniuse.com\/#feat=requestanimationframe","keywords":"","title":"requestAnimationFrame","description":"API allowing a more efficient way of running script-based animation, compared to traditional methods using timeouts. Also covers support for `cancelAnimationFrame`","stats":"[IE:10+, FF:23+, GC:24+, S:6.1+]"},{"name":"input-range","url":"http:\/\/caniuse.com\/#feat=input-range","keywords":"input type=\"range\"","title":"Range input type","description":"Form field type that allows the user to select a value using a slider widget.","stats":"[IE:10+, FF:23+, GC:4+, S:3.1+]"},{"name":"matchmedia","url":"http:\/\/caniuse.com\/#feat=matchmedia","keywords":"mediaquerylist","title":"matchMedia","description":"API for finding out whether or not a media query applies to the document.","stats":"[IE:10+, FF:6+, GC:9+, S:5.1+]"},{"name":"input-datetime","url":"http:\/\/caniuse.com\/#feat=input-datetime","keywords":"datepicker,timepicker,input type=\"date\",input type=\"time\",input date,datetime-local","title":"Date and time input types","description":"Form field widget to easily allow users to enter a date, time or both, generally by using a calendar\/time input widget.","stats":"[IE:n\/a, FF:n\/a, GC:20+, S:n\/a]"},{"name":"document-execcommand","url":"http:\/\/caniuse.com\/#feat=document-execcommand","keywords":"document,text,editor,commands,designMode","title":"Document.execCommand()","description":"Allows running commands to manipulate the contents of an editable region in a document switched to designMode","stats":"[IE:5.5+, FF:9+, GC:4+, S:6+]"},{"name":"input-color","url":"http:\/\/caniuse.com\/#feat=input-color","keywords":"colour,input type=\"color\"","title":"Color input type","description":"Form field allowing the user to select a color.","stats":"[IE:n\/a, FF:29+, GC:20+, S:10+]"},{"name":"input-number","url":"http:\/\/caniuse.com\/#feat=input-number","keywords":"spinner,input type=\"number\"","title":"Number input type","description":"Form field type for numbers.","stats":"[IE:n\/a, FF:n\/a, GC:6+, S:5+]"},{"name":"getboundingclientrect","url":"http:\/\/caniuse.com\/#feat=getboundingclientrect","keywords":"getBoundingClientRect,bounding,client,rect,DOMRect,box,cssom","title":"Element.getBoundingClientRect()","description":"Method to get the size and position of an element's bounding box, relative to the viewport.","stats":"[IE:9+, FF:12+, GC:4+, S:4+]"},{"name":"iframe-sandbox","url":"http:\/\/caniuse.com\/#feat=iframe-sandbox","keywords":"","title":"sandbox attribute for iframes","description":"Method of running external site pages with reduced privileges (e.g. no JavaScript) in iframes.","stats":"[IE:10+, FF:28+, GC:4+, S:5+]"},{"name":"css-counters","url":"http:\/\/caniuse.com\/#feat=css-counters","keywords":"","title":"CSS Counters","description":"Method of controlling number values in generated content, using the `counter-reset` and `counter-increment` properties.","stats":"[IE:8+, FF:2+, GC:4+, S:3.1+]"},{"name":"css-resize","url":"http:\/\/caniuse.com\/#feat=css-resize","keywords":"horizontal,vertical","title":"CSS resize property","description":"Method of allowing an element to be resized by the user, with options to limit to a given direction.","stats":"[IE:n\/a, FF:5+, GC:4+, S:4+]"},{"name":"input-placeholder","url":"http:\/\/caniuse.com\/#feat=input-placeholder","keywords":"","title":"input placeholder attribute","description":"Method of setting placeholder text for text-like input fields, to suggest the expected inserted information.","stats":"[IE:10+, FF:4+, GC:4+, S:5+]"},{"name":"spdy","url":"http:\/\/caniuse.com\/#feat=spdy","keywords":"","title":"SPDY protocol","description":"Networking protocol for low-latency transport of content over the web. Superseded by HTTP version 2.","stats":"[IE:11+, FF:13+, GC:4+, S:8+]"},{"name":"css-repeating-gradients","url":"http:\/\/caniuse.com\/#feat=css-repeating-gradients","keywords":"repeating-linear-gradient,repeating-radial-gradient","title":"CSS Repeating Gradients","description":"Method of defining a repeating linear or radial color gradient as a CSS image.","stats":"[IE:10+, FF:16+, GC:26+, S:6.1+]"},{"name":"css-filters","url":"http:\/\/caniuse.com\/#feat=css-filters","keywords":"sepia,hue-rotate,invert,saturate,filter:blur","title":"CSS Filter Effects","description":"Method of applying filter effects (like blur, grayscale, brightness, contrast and hue) to elements, previously only possible by using SVG.","stats":"[IE:n\/a, FF:35+, GC:53+, S:9.1+]"},{"name":"getcomputedstyle","url":"http:\/\/caniuse.com\/#feat=getcomputedstyle","keywords":"","title":"getComputedStyle","description":"API to get the current computed CSS styles applied to an element. This may be the current value applied by an animation or as set by a stylesheet.","stats":"[IE:9+, FF:4+, GC:11+, S:5+]"},{"name":"mp3","url":"http:\/\/caniuse.com\/#feat=mp3","keywords":"mpeg","title":"MP3 audio format","description":"Popular lossy audio compression format","stats":"[IE:9+, FF:22+, GC:4+, S:4+]"},{"name":"word-break","url":"http:\/\/caniuse.com\/#feat=word-break","keywords":"break-all,keep-all","title":"CSS3 word-break","description":"Property to prevent or allow words to be broken over multiple lines between letters.","stats":"[IE:5.5+, FF:15+, GC:44+, S:9+]"},{"name":"viewport-units","url":"http:\/\/caniuse.com\/#feat=viewport-units","keywords":"vm,viewport-percentage","title":"Viewport units: vw, vh, vmin, vmax","description":"Length units representing 1% of the viewport size for viewport width (vw), height (vh), the smaller of the two (vmin), or the larger of the two (vmax).","stats":"[IE:11!pa., FF:19+, GC:26+, S:6.1+]"},{"name":"contentsecuritypolicy","url":"http:\/\/caniuse.com\/#feat=contentsecuritypolicy","keywords":"csp,security,header","title":"Content Security Policy 1.0","description":"Mitigate cross-site scripting attacks by whitelisting allowed sources of script, style, and other resources.","stats":"[IE:11!pa., FF:23+, GC:25+, S:7+]"},{"name":"pagevisibility","url":"http:\/\/caniuse.com\/#feat=pagevisibility","keywords":"visibilitystate","title":"Page Visibility","description":"JavaScript API for determining whether a document is visible on the display","stats":"[IE:10+, FF:18+, GC:33+, S:6.1+]"},{"name":"stricttransportsecurity","url":"http:\/\/caniuse.com\/#feat=stricttransportsecurity","keywords":"sts,hsts,security,header","title":"Strict Transport Security","description":"Declare that a website is only accessible over a secure connection (HTTPS).","stats":"[IE:n\/a, FF:4+, GC:4+, S:7+]"},{"name":"style-scoped","url":"http:\/\/caniuse.com\/#feat=style-scoped","keywords":"scope","title":"Scoped CSS","description":"Allows CSS rules to be scoped to part of the document, based on the position of the style element. The attribute has been [removed from the current specification](https:\/\/github.com\/whatwg\/html\/issues\/552).","stats":"[IE:n\/a, FF:21+, GC:n\/a, S:n\/a]"},{"name":"svg-fragment","url":"http:\/\/caniuse.com\/#feat=svg-fragment","keywords":"fragments,sprite,svg,use","title":"SVG fragment identifiers","description":"Method of displaying only a part of an SVG image by defining a view ID or view box dimensions as the file's fragment identifier.","stats":"[IE:9+, FF:15+, GC:50+, S:8!pa.]"},{"name":"outline","url":"http:\/\/caniuse.com\/#feat=outline","keywords":"-moz-outline,outline-width,outline-style,outline-color","title":"CSS outline","description":"The CSS outline property is a shorthand property for setting one or more of the individual outline properties outline-style, outline-width and outline-color in a single rule. In most cases the use of this shortcut is preferable and more convenient.","stats":"[IE:8+, FF:2+, GC:4+, S:3.1+]"},{"name":"download","url":"http:\/\/caniuse.com\/#feat=download","keywords":"download,a.download,a[download],download attribute","title":"Download attribute","description":"When used on an anchor, this attribute signifies that the browser should download the resource the anchor points to rather than navigate to it.","stats":"[IE:n\/a, FF:20+, GC:14+, S:n\/a]"},{"name":"pointer","url":"http:\/\/caniuse.com\/#feat=pointer","keywords":"pointerdown,pointermove,pointerup,pointercancel,pointerover,pointerout,pointerenter,pointerleave","title":"Pointer events","description":"This specification integrates various inputs from mice, touchscreens, and pens, making separate implementations no longer necessary and authoring for cross-device pointers easier. Not to be mistaken with the unrelated \"pointer-events\" CSS property.","stats":"[IE:11+, FF:52!pa., GC:56w\/pl, S:10w\/pl]"},{"name":"user-select-none","url":"http:\/\/caniuse.com\/#feat=user-select-none","keywords":"","title":"CSS user-select: none","description":"Method of preventing text\/element selection using CSS.","stats":"[IE:11-px-, FF:52-px-, GC:56-px-, S:10-px-]"},{"name":"input-file-accept","url":"http:\/\/caniuse.com\/#feat=input-file-accept","keywords":"","title":"accept attribute for file input","description":"Allows a filter to be defined for what type of files a user may pick with from an `` dialog","stats":"[IE:10+, FF:37+, GC:26+, S:10!pa.]"},{"name":"webp","url":"http:\/\/caniuse.com\/#feat=webp","keywords":"","title":"WebP image format","description":"Image format that supports lossy and lossless compression, as well as animation and alpha transparency.","stats":"[IE:n\/a, FF:52w\/pl, GC:23+, S:n\/a]"},{"name":"input-autocomplete-onoff","url":"http:\/\/caniuse.com\/#feat=input-autocomplete-onoff","keywords":"","title":"autocomplete attribute: on & off values","description":"The `autocomplete` attribute for `input` elements indicates to the browser whether a value should or should not be autofilled when appropriate.","stats":"[IE:5.5+, FF:2+, GC:17+, S:5.1+]"},{"name":"intrinsic-width","url":"http:\/\/caniuse.com\/#feat=intrinsic-width","keywords":"fill,fill-available,max-content,min-content,fit-content,contain-floats,intrinsic,extrinsic,sizing","title":"Intrinsic & Extrinsic Sizing","description":"Allows for the heights and widths to be specified in intrinsic values using the `fill`, `max-content`, `min-content`, and `fit-content` properties.","stats":"[IE:n\/a, FF:52!pa., GC:45-px-, S:10!pa.]"},{"name":"cryptography","url":"http:\/\/caniuse.com\/#feat=cryptography","keywords":"subtle,subtlecrypto","title":"Web Cryptography","description":"JavaScript API for performing basic cryptographic operations in web applications","stats":"[IE:11!pa., FF:34+, GC:37+, S:10-px-]"},{"name":"template","url":"http:\/\/caniuse.com\/#feat=template","keywords":"web components, template","title":"HTML templates","description":"Method of declaring a portion of reusable markup that is parsed but not rendered until cloned.","stats":"[IE:n\/a, FF:22+, GC:26+, S:7.1+]"},{"name":"opus","url":"http:\/\/caniuse.com\/#feat=opus","keywords":"","title":"Opus","description":"Royalty-free open audio codec by IETF, which incorporated SILK from Skype and CELT from Xiph.org, to serve higher sound quality and lower latency at the same bitrate.","stats":"[IE:n\/a, FF:15+, GC:33+, S:n\/a]"},{"name":"jpegxr","url":"http:\/\/caniuse.com\/#feat=jpegxr","keywords":"","title":"JPEG XR image format","description":"The latest JPEG image format of Joint Photographic Experts Group which boasts better compression and supports lossless compression, alpha channel, and 48-bit deep color over normal jpg format.","stats":"[IE:9+, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"channel-messaging","url":"http:\/\/caniuse.com\/#feat=channel-messaging","keywords":"","title":"Channel messaging","description":"Method for having two-way communication between browsing contexts (using MessageChannel)","stats":"[IE:10+, FF:41+, GC:4+, S:5+]"},{"name":"css3-tabsize","url":"http:\/\/caniuse.com\/#feat=css3-tabsize","keywords":"tab-size,tab-width","title":"CSS3 tab-size","description":"Method of customizing the width of the tab character. Only effective using 'white-space: pre' or 'white-space: pre-wrap'.","stats":"[IE:n\/a, FF:52!pa., GC:42+, S:10!pa.]"},{"name":"mutationobserver","url":"http:\/\/caniuse.com\/#feat=mutationobserver","keywords":"MutationObserver","title":"Mutation Observer","description":"Method for observing and reacting to changes to the DOM. Replaces MutationEvents, which is deprecated.","stats":"[IE:11+, FF:14+, GC:27+, S:6.1+]"},{"name":"css-selection","url":"http:\/\/caniuse.com\/#feat=css-selection","keywords":"::selection,selection","title":"::selection CSS pseudo-element","description":"The ::selection CSS pseudo-element applies rules to the portion of a document that has been highlighted (e.g., selected with the mouse or another pointing device) by the user.","stats":"[IE:9+, FF:52-px-, GC:4+, S:3.1+]"},{"name":"css-placeholder","url":"http:\/\/caniuse.com\/#feat=css-placeholder","keywords":"::placeholder,placeholder","title":"::placeholder CSS pseudo-element","description":"The ::placeholder pseudo-element represents placeholder text in an input field: text that represents the input and provides a hint to the user on how to fill out the form. For example, a date-input field might have the placeholder text `YYYY\/MM\/DD` to clarify that numeric dates are to be entered in year-month-day order.","stats":"[IE:11!pa., FF:51+, GC:56!pa., S:10!pa.]"},{"name":"css-deviceadaptation","url":"http:\/\/caniuse.com\/#feat=css-deviceadaptation","keywords":"viewport","title":"CSS Device Adaptation","description":"A standard way to override the size of viewport in web page using the `@viewport` rule, standardizing and replacing Apple's own popular `` viewport implementation.","stats":"[IE:11!pa., FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"text-emphasis","url":"http:\/\/caniuse.com\/#feat=text-emphasis","keywords":"text-emphasis,text-emphasis-position,text-emphasis-style,text-emphasis-color","title":"text-emphasis styling","description":"Method of using small symbols next to each glyph to emphasize a run of text, commonly used in East Asian languages. The `text-emphasis` shorthand, and its `text-emphasis-style` and `text-emphasis-color` longhands, can be used to apply marks to the text. The `text-emphasis-position` property, which inherits separately, allows setting the emphasis marks' position with respect to the text.","stats":"[IE:n\/a, FF:46+, GC:56!pa., S:7.1+]"},{"name":"midi","url":"http:\/\/caniuse.com\/#feat=midi","keywords":"","title":"Web MIDI API","description":"The Web MIDI API specification defines a means for web developers to enumerate, manipulate and access MIDI devices","stats":"[IE:n\/a, FF:n\/a, GC:43+, S:n\/a]"},{"name":"canvas-blending","url":"http:\/\/caniuse.com\/#feat=canvas-blending","keywords":"","title":"Canvas blend modes","description":"Method of defining the effect resulting from overlaying two layers on a Canvas element.","stats":"[IE:n\/a, FF:20+, GC:30+, S:6.1+]"},{"name":"clipboard","url":"http:\/\/caniuse.com\/#feat=clipboard","keywords":"cut,copy,paste,clipboarddata,clipboardevent","title":"Clipboard API","description":"API to provide copy, cut and paste events as well as provide access to the OS clipboard.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"rtcpeerconnection","url":"http:\/\/caniuse.com\/#feat=rtcpeerconnection","keywords":"","title":"WebRTC Peer-to-peer connections","description":"Method of allowing two users to communicate directly, browser to browser using the RTCPeerConnection API.","stats":"[IE:n\/a, FF:44+, GC:56-px-, S:n\/a]"},{"name":"css3-cursors","url":"http:\/\/caniuse.com\/#feat=css3-cursors","keywords":"cursors, pointers","title":"CSS3 Cursors (original values)","description":"CSS3 cursor values added in the 2004 spec, including none, context-menu, cell, vertical-text, alias, copy, no-drop, not-allowed, nesw-resize, nwse-resize, col-resize, row-resize and all-scroll.","stats":"[IE:9+, FF:4+, GC:5+, S:5+]"},{"name":"css3-cursors-newer","url":"http:\/\/caniuse.com\/#feat=css3-cursors-newer","keywords":"cursors, pointers","title":"CSS3 Cursors: zoom-in & zoom-out","description":"Support for `zoom-in`, `zoom-out` values for the CSS3 `cursor` property.","stats":"[IE:n\/a, FF:24+, GC:37+, S:9+]"},{"name":"webvtt","url":"http:\/\/caniuse.com\/#feat=webvtt","keywords":"captions,track,vtt,subtitles","title":"WebVTT - Web Video Text Tracks","description":"Format for marking up text captions for multimedia resources.","stats":"[IE:10+, FF:n\/a, GC:18+, S:6+]"},{"name":"promises","url":"http:\/\/caniuse.com\/#feat=promises","keywords":"futures","title":"Promises","description":"A promise represents the eventual result of an asynchronous operation.","stats":"[IE:11w\/pl, FF:29+, GC:33+, S:7.1+]"},{"name":"css-sticky","url":"http:\/\/caniuse.com\/#feat=css-sticky","keywords":"","title":"CSS position:sticky","description":"Keeps elements positioned as \"fixed\" or \"relative\" depending on how it appears in the viewport. As a result the element is \"stuck\" when necessary while scrolling.","stats":"[IE:n\/a, FF:32+, GC:n\/a, S:10-px-]"},{"name":"dialog","url":"http:\/\/caniuse.com\/#feat=dialog","keywords":"HTMLDialogElement,showModal,backdrop","title":"Dialog element","description":"Method of easily creating custom dialog boxes to display to the user with modal or non-modal options. Also includes a `::backdrop` pseudo-element for behind the element.","stats":"[IE:n\/a, FF:n\/a, GC:37+, S:n\/a]"},{"name":"css-variables","url":"http:\/\/caniuse.com\/#feat=css-variables","keywords":"css variables,custom properties","title":"CSS Variables (Custom Properties)","description":"Permits the declaration and usage of cascading variables in stylesheets.","stats":"[IE:n\/a, FF:31+, GC:49+, S:9.1+]"},{"name":"vibration","url":"http:\/\/caniuse.com\/#feat=vibration","keywords":"vibration,mobile,device","title":"Vibration API","description":"Method to access the vibration mechanism of the hosting device.","stats":"[IE:n\/a, FF:16+, GC:30+, S:n\/a]"},{"name":"css-backgroundblendmode","url":"http:\/\/caniuse.com\/#feat=css-backgroundblendmode","keywords":"css blend modes,css blending modes,blending,multiply,screen,background","title":"CSS background-blend-mode","description":"Allows blending between CSS background images, gradients, and colors.","stats":"[IE:n\/a, FF:30+, GC:35+, S:10!pa.]"},{"name":"css-mixblendmode","url":"http:\/\/caniuse.com\/#feat=css-mixblendmode","keywords":"mix-blend-mode,css blend modes,css blending modes","title":"Blending of HTML\/SVG elements","description":"Allows blending between arbitrary SVG and HTML elements","stats":"[IE:n\/a, FF:32+, GC:41+, S:10!pa.]"},{"name":"speech-recognition","url":"http:\/\/caniuse.com\/#feat=speech-recognition","keywords":"#web-speech,speech,recognition,ASR","title":"Speech Recognition API","description":"Method to provide speech input in a web browser.","stats":"[IE:n\/a, FF:n\/a, GC:56!pa., S:n\/a]"},{"name":"high-resolution-time","url":"http:\/\/caniuse.com\/#feat=high-resolution-time","keywords":"performance,now,testing","title":"High Resolution Time API","description":"Method to provide the current time in sub-millisecond resolution and such that it is not subject to system clock skew or adjustments. Called using `performance.now()`","stats":"[IE:10+, FF:15+, GC:24+, S:8+]"},{"name":"battery-status","url":"http:\/\/caniuse.com\/#feat=battery-status","keywords":"navigator.battery,navigator.getbattery,batterymanager","title":"Battery Status API","description":"Method to provide information about the battery status of the hosting device.","stats":"[IE:n\/a, FF:43+, GC:38+, S:n\/a]"},{"name":"serviceworkers","url":"http:\/\/caniuse.com\/#feat=serviceworkers","keywords":"","title":"Service Workers","description":"Method that enables applications to take advantage of persistent background processing, including hooks to enable bootstrapping of web applications while offline.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:n\/a]"},{"name":"text-decoration","url":"http:\/\/caniuse.com\/#feat=text-decoration","keywords":"text-decoration-line,text-decoration-style,text-decoration-color,text-decoration-skip","title":"text-decoration styling","description":"Method of defining the type, style and color of lines in the text-decoration property. These can be defined as shorthand (e.g. `text-decoration: line-through dashed blue`) or as single properties (e.g. `text-decoration-color: blue`)","stats":"[IE:n\/a, FF:36+, GC:n\/a, S:10!pa.]"},{"name":"iframe-srcdoc","url":"http:\/\/caniuse.com\/#feat=iframe-srcdoc","keywords":"","title":"srcdoc attribute for iframes","description":"Override the content specified in the `src` attribute (if present) with HTML content within the attribute.","stats":"[IE:11w\/pl, FF:25+, GC:20+, S:6+]"},{"name":"speech-synthesis","url":"http:\/\/caniuse.com\/#feat=speech-synthesis","keywords":"speech,synthesis,speechSynthesis,TTS,SpeechSynthesisUtterance,","title":"Speech Synthesis API","description":"A web API for controlling a text-to-speech output.","stats":"[IE:n\/a, FF:n\/a, GC:33+, S:7+]"},{"name":"user-timing","url":"http:\/\/caniuse.com\/#feat=user-timing","keywords":"performance,testing,mark,measure","title":"User Timing API","description":"Method to help web developers measure the performance of their applications by giving them access to high precision timestamps.","stats":"[IE:10+, FF:38+, GC:25+, S:n\/a]"},{"name":"srcset","url":"http:\/\/caniuse.com\/#feat=srcset","keywords":"","title":"Srcset attribute","description":"Allows authors to define various image resources and \"hints\" that assist a user agent to determine the most appropriate image source to display (e.g. high-resolution displays, small monitors, etc).","stats":"[IE:n\/a, FF:38+, GC:38+, S:9+]"},{"name":"ambient-light","url":"http:\/\/caniuse.com\/#feat=ambient-light","keywords":"","title":"Ambient Light API","description":"Defines events that provide information about the ambient light level, as measured by a device's light sensor.","stats":"[IE:n\/a, FF:52!pa., GC:n\/a, S:n\/a]"},{"name":"will-change","url":"http:\/\/caniuse.com\/#feat=will-change","keywords":"scroll-position","title":"CSS will-change property","description":"Method of optimizing animations by informing the browser which elements will change and what properties will change.","stats":"[IE:n\/a, FF:36+, GC:36+, S:9.1+]"},{"name":"css-shapes","url":"http:\/\/caniuse.com\/#feat=css-shapes","keywords":"circle,ellipse,polygon,inset,shape-outside,shape-inside","title":"CSS Shapes Level 1","description":"Allows geometric shapes to be set in CSS to define an area for text to flow around.","stats":"[IE:n\/a, FF:n\/a, GC:37+, S:10-px-]"},{"name":"domcontentloaded","url":"http:\/\/caniuse.com\/#feat=domcontentloaded","keywords":"dom,domready,onload,contentloaded,document","title":"DOMContentLoaded","description":"JavaScript event that fires when the DOM is loaded, but before all page assets are loaded (CSS, images, etc.).","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"proximity","url":"http:\/\/caniuse.com\/#feat=proximity","keywords":"","title":"Proximity API","description":"Defines events that provide information about the distance between a device and an object, as measured by a proximity sensor.","stats":"[IE:n\/a, FF:15+, GC:n\/a, S:n\/a]"},{"name":"kerning-pairs-ligatures","url":"http:\/\/caniuse.com\/#feat=kerning-pairs-ligatures","keywords":"optimizeLegibility,optimizeSpeed,geometricPrecision","title":"Improved kerning pairs & ligatures","description":"Currently non-standard method of improving kerning pairs & ligatures using `text-rendering: optimizeLegibility`.","stats":"[IE:n\/a, FF:3+, GC:4+, S:5+]"},{"name":"iframe-seamless","url":"http:\/\/caniuse.com\/#feat=iframe-seamless","keywords":"","title":"seamless attribute for iframes","description":"The seamless attribute makes an iframe's contents actually part of a page, and adopts the styles from its hosting page. The attribute has been [removed from the current specification](https:\/\/github.com\/whatwg\/html\/issues\/331).","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"css-image-orientation","url":"http:\/\/caniuse.com\/#feat=css-image-orientation","keywords":"image-orientation,from-image,flip","title":"CSS3 image-orientation","description":"CSS property used generally to fix the intended orientation of an image. This can be done using 90 degree increments or based on the image's EXIF data using the \"from-image\" value.","stats":"[IE:n\/a, FF:26+, GC:n\/a, S:n\/a]"},{"name":"picture","url":"http:\/\/caniuse.com\/#feat=picture","keywords":"<picture>","title":"Picture element","description":"A responsive images method to control which image resource a user agent presents to a user, based on resolution, media query and\/or support for a particular image format","stats":"[IE:n\/a, FF:38+, GC:38+, S:9.1+]"},{"name":"woff2","url":"http:\/\/caniuse.com\/#feat=woff2","keywords":"woff, fontface, webfonts","title":"WOFF 2.0 - Web Open Font Format","description":"TrueType\/OpenType font that provides better compression than WOFF 1.0.","stats":"[IE:n\/a, FF:39+, GC:36+, S:10+]"},{"name":"text-size-adjust","url":"http:\/\/caniuse.com\/#feat=text-size-adjust","keywords":"","title":"CSS text-size-adjust","description":"On mobile devices, the text-size-adjust CSS property allows Web authors to control if and how the text-inflating algorithm is applied to the textual content of the element it is applied to.","stats":"[IE:n\/a, FF:n\/a, GC:54+, S:n\/a]"},{"name":"web-animation","url":"http:\/\/caniuse.com\/#feat=web-animation","keywords":"animate,play,pause,reverse,finish,currentTime,startTime,playbackRate,playState","title":"Web Animations API","description":"Lets you create animations that are run in the browser and as well as inspect and manipulate animations created through declarative means like CSS.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:n\/a]"},{"name":"resource-timing","url":"http:\/\/caniuse.com\/#feat=resource-timing","keywords":"performance,testing,resource","title":"Resource Timing","description":"Method to help web developers to collect complete timing information related to resources on a document.","stats":"[IE:10+, FF:35+, GC:25+, S:n\/a]"},{"name":"custom-elements","url":"http:\/\/caniuse.com\/#feat=custom-elements","keywords":"web components,registerElement","title":"Custom Elements v0","description":"Method of defining new HTML tags.","stats":"[IE:11w\/pl, FF:52w\/pl, GC:33+, S:10w\/pl]"},{"name":"imports","url":"http:\/\/caniuse.com\/#feat=imports","keywords":"web components","title":"HTML Imports","description":"Method of including and reusing HTML documents in other HTML documents.","stats":"[IE:11w\/pl, FF:52w\/pl, GC:36+, S:10w\/pl]"},{"name":"input-file-multiple","url":"http:\/\/caniuse.com\/#feat=input-file-multiple","keywords":"","title":"Multiple file selection","description":"Allows users to select multiple files in the file picker.","stats":"[IE:10+, FF:3.6+, GC:5+, S:4+]"},{"name":"atob-btoa","url":"http:\/\/caniuse.com\/#feat=atob-btoa","keywords":"atob,btoa","title":"Base64 encoding and decoding","description":"Utility functions for of encoding and decoding strings to and from base 64: window.atob() and window.btoa().","stats":"[IE:10+, FF:2+, GC:4+, S:3.1+]"},{"name":"css-appearance","url":"http:\/\/caniuse.com\/#feat=css-appearance","keywords":"","title":"CSS Appearance","description":"The `appearance` property defines how elements (particularly form controls) appear by default. By setting the value to `none` the default appearance can be entirely redefined using other CSS properties.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"objectrtc","url":"http:\/\/caniuse.com\/#feat=objectrtc","keywords":"RTC,WebRTC,ORTC,ObjectRTC,RTCIceTransport,RTCIceGatherer,RTCRtpSender,RTCRtpReceiver,Real Time,video,webcam","title":"Object RTC (ORTC) API for WebRTC","description":"Enables mobile endpoints to talk to servers and web browsers with Real-Time Communications (RTC) capabilities via native and simple JavaScript APIs","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"css-background-offsets","url":"http:\/\/caniuse.com\/#feat=css-background-offsets","keywords":"4 value syntax","title":"CSS background-position edge offsets","description":"Allows CSS background images to be positioned relative to the specified edge using the 3 to 4 value syntax. For example: `background-position: right 5px bottom 5px;` for positioning 5px from the bottom-right corner.","stats":"[IE:9+, FF:13+, GC:25+, S:7+]"},{"name":"css-supports-api","url":"http:\/\/caniuse.com\/#feat=css-supports-api","keywords":"conditional","title":"CSS.supports() API","description":"The CSS.supports() static methods returns a Boolean value indicating if the browser supports a given CSS feature, or not.","stats":"[IE:n\/a, FF:23+, GC:28+, S:9+]"},{"name":"css-touch-action","url":"http:\/\/caniuse.com\/#feat=css-touch-action","keywords":"touch action","title":"CSS touch-action property","description":"touch-action is a CSS property that controls filtering of gesture events, providing developers with a declarative mechanism to selectively disable touch scrolling (in one or both axes), pinch-zooming or double-tap-zooming.","stats":"[IE:11+, FF:n\/a, GC:36+, S:10!pa.]"},{"name":"autofocus","url":"http:\/\/caniuse.com\/#feat=autofocus","keywords":"","title":"Autofocus attribute","description":"Allows a form field to be immediately focused on page load.","stats":"[IE:10+, FF:4+, GC:5+, S:5+]"},{"name":"css-clip-path","url":"http:\/\/caniuse.com\/#feat=css-clip-path","keywords":"clippath","title":"CSS clip-path property","description":"Method of defining the visible region of an element using SVG or a shape definition.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"getrandomvalues","url":"http:\/\/caniuse.com\/#feat=getrandomvalues","keywords":"","title":"crypto.getRandomValues()","description":"Method of generating cryptographically random values.","stats":"[IE:11-px-, FF:21+, GC:11+, S:6.1+]"},{"name":"screen-orientation","url":"http:\/\/caniuse.com\/#feat=screen-orientation","keywords":"lockorientation,unlockorientation","title":"Screen Orientation","description":"Provides the ability to read the screen orientation state, to be informed when this state changes, and to be able to lock the screen orientation to a specific state.","stats":"[IE:11!pa., FF:44+, GC:38+, S:n\/a]"},{"name":"font-loading","url":"http:\/\/caniuse.com\/#feat=font-loading","keywords":"fontface,fontfaceset,fontfacesource","title":"CSS Font Loading","description":"This CSS module defines a scripting interface to font faces in CSS, allowing font faces to be easily created and loaded from script. It also provides methods to track the loading status of an individual font, or of all the fonts on an entire page.","stats":"[IE:n\/a, FF:41+, GC:35+, S:10+]"},{"name":"font-unicode-range","url":"http:\/\/caniuse.com\/#feat=font-unicode-range","keywords":"font face,unicode,unicode-range","title":"Font unicode-range subsetting","description":"This @font-face descriptor defines the set of Unicode codepoints that may be supported by the font face for which it is declared. The descriptor value is a comma-delimited list of Unicode range () values. The union of these ranges defines the set of codepoints that serves as a hint for user agents when deciding whether or not to download a font resource for a given text run.","stats":"[IE:11!pa., FF:44+, GC:36+, S:10+]"},{"name":"gamepad","url":"http:\/\/caniuse.com\/#feat=gamepad","keywords":"","title":"Gamepad API","description":"API to support input from USB gamepad controllers through JavaScript.","stats":"[IE:n\/a, FF:29+, GC:25+, S:n\/a]"},{"name":"css-font-stretch","url":"http:\/\/caniuse.com\/#feat=css-font-stretch","keywords":"font stretch","title":"CSS font-stretch","description":"If a font has multiple types of variations based on the width of characters, the `font-stretch` property allows the appropriate one to be selected. The property in itself does not cause the browser to stretch to a font.","stats":"[IE:9+, FF:9+, GC:48+, S:n\/a]"},{"name":"font-size-adjust","url":"http:\/\/caniuse.com\/#feat=font-size-adjust","keywords":"","title":"CSS font-size-adjust","description":"Method of adjusting the font size in a matter that relates to the height of lowercase vs. uppercase letters. This makes it easier to set the size of fallback fonts.","stats":"[IE:n\/a, FF:3+, GC:n\/a, S:n\/a]"},{"name":"link-icon-png","url":"http:\/\/caniuse.com\/#feat=link-icon-png","keywords":"","title":"PNG favicons","description":"Icon used by browsers to identify a webpage or site. While all browsers support the `.ico` format, the PNG format can be preferable.","stats":"[IE:11+, FF:2+, GC:n\/a, S:n\/a]"},{"name":"link-icon-svg","url":"http:\/\/caniuse.com\/#feat=link-icon-svg","keywords":"","title":"SVG favicons","description":"Icon used by browsers to identify a webpage or site. While all browsers support the `.ico` format, the SVG format can be preferable to more easily support higher resolutions or larger icons.","stats":"[IE:n\/a, FF:40!pa., GC:n\/a, S:10!pa.]"},{"name":"css-media-resolution","url":"http:\/\/caniuse.com\/#feat=css-media-resolution","keywords":"@media,device-pixel-ratio,resolution,dppx,dpcm,dpi","title":"Media Queries: resolution feature","description":"Allows a media query to be set based on the device pixels used per CSS unit. While the standard uses `min`\/`max-resolution` for this, some browsers support the older non-standard `device-pixel-ratio` media query.","stats":"[IE:11!pa., FF:16+, GC:29+, S:10!pa.]"},{"name":"xml-serializer","url":"http:\/\/caniuse.com\/#feat=xml-serializer","keywords":"parseFromString","title":"DOM Parsing and Serialization","description":"Various DOM parsing and serializing functions, specifically `DOMParser`, `XMLSerializer`, `innerHTML`, `outerHTML` and `adjacentHTML`.","stats":"[IE:10+, FF:12+, GC:30+, S:7.1+]"},{"name":"css-image-set","url":"http:\/\/caniuse.com\/#feat=css-image-set","keywords":"","title":"CSS image-set","description":"Method of letting the browser pick the most appropriate CSS background image from a given set, primarily for high PPI screens.","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:10-px-]"},{"name":"css-boxdecorationbreak","url":"http:\/\/caniuse.com\/#feat=css-boxdecorationbreak","keywords":"box-decoration,box decoration,break","title":"CSS box-decoration-break","description":"Controls whether the box's margins, borders, padding, and other decorations wrap the broken edges of the box fragments (when the box is split by a break (page\/column\/region\/line).","stats":"[IE:n\/a, FF:32+, GC:56!pa., S:10!pa.]"},{"name":"object-observe","url":"http:\/\/caniuse.com\/#feat=object-observe","keywords":"","title":"Object.observe data binding","description":"Method for data binding, a now-withdrawn ECMAScript 7 proposal","stats":"[IE:n\/a, FF:n\/a, GC:36+, S:n\/a]"},{"name":"css-at-counter-style","url":"http:\/\/caniuse.com\/#feat=css-at-counter-style","keywords":"css @counter-style, list-style","title":"CSS Counter Styles","description":"The @counter-style CSS at-rule allows custom counter styles to be defined. A @counter-style rule defines how to convert a counter value into a string representation.","stats":"[IE:n\/a, FF:52!pa., GC:n\/a, S:n\/a]"},{"name":"css-page-break","url":"http:\/\/caniuse.com\/#feat=css-page-break","keywords":"page-break-before,page-break-after,page-break-inside,always,avoid","title":"CSS page-break properties","description":"Properties to control the way elements are broken across (printed) pages.","stats":"[IE:11!pa., FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"css-placeholder-shown","url":"http:\/\/caniuse.com\/#feat=css-placeholder-shown","keywords":":placeholder-shown,placeholder-shown,placeholder","title":":placeholder-shown CSS pseudo-class","description":"Input elements can sometimes show placeholder text as a hint to the user on what to type in. See, for example, the placeholder attribute in HTML5. The :placeholder-shown pseudo-class matches an input element that is showing such placeholder text.","stats":"[IE:n\/a, FF:51+, GC:47+, S:9+]"},{"name":"broadcastchannel","url":"http:\/\/caniuse.com\/#feat=broadcastchannel","keywords":"broadcast,channel,messaging","title":"BroadcastChannel","description":"BroadcastChannel allows scripts from the same origin but other browsing contexts (windows, workers) to send each other messages.","stats":"[IE:n\/a, FF:38+, GC:54+, S:n\/a]"},{"name":"css-crisp-edges","url":"http:\/\/caniuse.com\/#feat=css-crisp-edges","keywords":"image-rendering,crisp-edges","title":"Crisp edges\/pixelated images","description":"Scales images with an algorithm that preserves edges and contrast, without smoothing colors or introducing blur. This is intended for images such as pixel art. Official values that accomplish this for the `image-rendering` property are `crisp-edges` and `pixelated`.","stats":"[IE:11!pa., FF:52-px-, GC:n\/a, S:10+]"},{"name":"css-text-align-last","url":"http:\/\/caniuse.com\/#feat=css-text-align-last","keywords":"text align last","title":"CSS3 text-align-last","description":"CSS property to describe how the last line of a block or a line right before a forced line break when `text-align` is `justify`.","stats":"[IE:11!pa., FF:49+, GC:47+, S:n\/a]"},{"name":"css-logical-props","url":"http:\/\/caniuse.com\/#feat=css-logical-props","keywords":"margin-start,margin-end,padding-start,padding-end,border-start,border-end,inline-start,inline-end,block-start,block-end","title":"CSS Logical Properties","description":"Use start\/end properties that depend on LTR or RTL writing direction instead of left\/right","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"fetch","url":"http:\/\/caniuse.com\/#feat=fetch","keywords":"fetch,service,workers,xhr,xmlhttprequest","title":"Fetch","description":"A modern replacement for XMLHttpRequest.","stats":"[IE:n\/a, FF:40+, GC:42+, S:n\/a]"},{"name":"referrer-policy","url":"http:\/\/caniuse.com\/#feat=referrer-policy","keywords":"meta,referrer,referer","title":"Referrer Policy","description":"Allow control of HTTP referrers via the referrer meta tag.","stats":"[IE:n\/a, FF:36+, GC:21+, S:10!pa.]"},{"name":"background-attachment","url":"http:\/\/caniuse.com\/#feat=background-attachment","keywords":"","title":"CSS background-attachment","description":"Method of defining how a background image is attached to a scrollable element. Values include `scroll` (default), `fixed` and `local`.","stats":"[IE:9+, FF:25+, GC:4+, S:5+]"},{"name":"currentcolor","url":"http:\/\/caniuse.com\/#feat=currentcolor","keywords":"","title":"CSS currentColor value","description":"A CSS value that will apply the existing `color` value to other properties like `background-color`, etc.","stats":"[IE:9+, FF:2+, GC:4+, S:4+]"},{"name":"input-pattern","url":"http:\/\/caniuse.com\/#feat=input-pattern","keywords":"","title":"Pattern attribute for input fields","description":"Allows validation of an input field based on a given regular expression pattern.","stats":"[IE:10+, FF:4+, GC:10+, S:10!pa.]"},{"name":"registerprotocolhandler","url":"http:\/\/caniuse.com\/#feat=registerprotocolhandler","keywords":"","title":"Custom protocol handling","description":"Method of allowing a webpage to handle a given protocol using `navigator.registerProtocolHandler`. This allows certain URLs to be opened by a given web application, for example `mailto:` addresses can be opened by a webmail client.","stats":"[IE:n\/a, FF:3+, GC:n\/a, S:n\/a]"},{"name":"css-snappoints","url":"http:\/\/caniuse.com\/#feat=css-snappoints","keywords":"scroll-snap-points-x,scroll-snap-points-y,scroll-snap-type,scroll-snap-destination,scroll-snap-coordinate","title":"CSS Scroll snap points","description":"CSS technique that allows customizable scrolling experiences like pagination of carousels by setting defined snap points.","stats":"[IE:11!pa., FF:39+, GC:n\/a, S:10!pa.]"},{"name":"input-minlength","url":"http:\/\/caniuse.com\/#feat=input-minlength","keywords":"","title":"Minimum length attribute for input fields","description":"Declares a lower bound on the number of characters a user can input.","stats":"[IE:n\/a, FF:51+, GC:40+, S:n\/a]"},{"name":"css-media-interaction","url":"http:\/\/caniuse.com\/#feat=css-media-interaction","keywords":"@media,interaction,hover,any-hover,pointer,any-pointer","title":"Media Queries: interaction media features","description":"Allows a media query to be set based on the presence and accuracy of the user's pointing device, and whether they have the ability to hover over elements on the page. This includes the `pointer`, `any-pointer`, `hover`, and `any-hover` media features.","stats":"[IE:n\/a, FF:n\/a, GC:41+, S:9+]"},{"name":"ime","url":"http:\/\/caniuse.com\/#feat=ime","keywords":"ime,cjk,input,internationalization,inputMethodContext,candidatewindow,composition","title":"Input Method Editor API","description":"Provides scripted access to the Input Method Editor (IME). An IME is often used to input characters from East Asian languages by typing roman characters and selecting from the resulting suggestions.","stats":"[IE:11-px-, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"font-smooth","url":"http:\/\/caniuse.com\/#feat=font-smooth","keywords":"font smooth,font smoothing,-webkit-font-smoothing,-moz-osx-font-smoothing","title":"CSS font-smooth","description":"Controls the application of anti-aliasing when fonts are rendered.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:10!pa.]"},{"name":"audiotracks","url":"http:\/\/caniuse.com\/#feat=audiotracks","keywords":"AudioTrack,AudioTrackList,media,multiple,selection","title":"Audio Tracks","description":"Method of specifying and selecting between multiple audio tracks. Useful for providing audio descriptions, director's commentary, additional languages, alternative takes, etc.","stats":"[IE:10+, FF:n\/a, GC:n\/a, S:6.1+]"},{"name":"videotracks","url":"http:\/\/caniuse.com\/#feat=videotracks","keywords":"VideoTrack,VideoTrackList,media,multiple,selection","title":"Video Tracks","description":"Method of specifying and selecting between multiple video tracks. Useful for providing sign language tracks, burnt-in captions or subtitles, alternative camera angles, etc.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:6.1+]"},{"name":"contentsecuritypolicy2","url":"http:\/\/caniuse.com\/#feat=contentsecuritypolicy2","keywords":"csp,header,nonce,hash","title":"Content Security Policy Level 2","description":"Mitigate cross-site scripting attacks by whitelisting allowed sources of script, style, and other resources. CSP 2 adds hash-source, nonce-source, and five new directives","stats":"[IE:n\/a, FF:52!pa., GC:40+, S:10+]"},{"name":"permissions-api","url":"http:\/\/caniuse.com\/#feat=permissions-api","keywords":"web-permissions,navigator.permissions","title":"Permissions API","description":"High-level JavaScript API for checking and requesting permissions","stats":"[IE:n\/a, FF:46+, GC:43+, S:n\/a]"},{"name":"http2","url":"http:\/\/caniuse.com\/#feat=http2","keywords":"","title":"HTTP\/2 protocol","description":"Networking protocol for low-latency transport of content over the web. Originally started out from the SPDY protocol, now standardized as HTTP version 2.","stats":"[IE:11!pa., FF:n\/a, GC:n\/a, S:10!pa.]"},{"name":"font-kerning","url":"http:\/\/caniuse.com\/#feat=font-kerning","keywords":"","title":"CSS3 font-kerning","description":"Controls the usage of the kerning information (spacing between letters) stored in the font. Note that this only affects OpenType fonts with kerning information, it has no effect on other fonts.","stats":"[IE:n\/a, FF:34+, GC:33+, S:9.1+]"},{"name":"jpeg2000","url":"http:\/\/caniuse.com\/#feat=jpeg2000","keywords":"jp2,jpeg2000,jpeg 2000","title":"JPEG 2000 image format","description":"JPEG 2000 (JP2) was created by the Joint Photographic Experts Group committee in 2000 with the intention of superseding their original discrete cosine transform-based JPEG standard (created in 1992) with a newly designed, wavelet-based method. It offers some advantages in image fidelity over standard JPEG.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:6+]"},{"name":"upgradeinsecurerequests","url":"http:\/\/caniuse.com\/#feat=upgradeinsecurerequests","keywords":"security,header,uir","title":"Upgrade Insecure Requests","description":"Declare that browsers should transparently upgrade HTTP resources on a website to HTTPS.","stats":"[IE:n\/a, FF:42+, GC:43+, S:n\/a]"},{"name":"publickeypinning","url":"http:\/\/caniuse.com\/#feat=publickeypinning","keywords":"pkp,hpkp,security,header","title":"Public Key Pinning","description":"Declare that a website's HTTPS certificate should only be treated as valid if the public key is contained in a specified list to prevent MITM attacks that use valid CA-issued certificates.","stats":"[IE:n\/a, FF:35+, GC:38+, S:n\/a]"},{"name":"input-email-tel-url","url":"http:\/\/caniuse.com\/#feat=input-email-tel-url","keywords":"input[type=email],input[type=tel],input[type=url]","title":"Email, telephone & URL input types","description":"Text input fields intended for email addresses, telephone numbers or URLs. Particularly useful in combination with [form validation](http:\/\/caniuse.com\/#feat=form-validation)","stats":"[IE:10+, FF:4+, GC:5+, S:5+]"},{"name":"fieldset-disabled","url":"http:\/\/caniuse.com\/#feat=fieldset-disabled","keywords":"HTMLFieldSetElement,fieldset,disabled","title":"disabled attribute of the fieldset element","description":"Allows disabling all of the form control descendants of a fieldset via a `disabled` attribute on the fieldset element itself.","stats":"[IE:11!pa., FF:4+, GC:20+, S:6+]"},{"name":"font-variant-alternates","url":"http:\/\/caniuse.com\/#feat=font-variant-alternates","keywords":"font-feature,font-feature-settings,font-variant","title":"CSS font-variant-alternates","description":"Controls the usage of alternate glyphs associated to alternative names defined in @font-feature-values for certain types of OpenType fonts.","stats":"[IE:n\/a, FF:34+, GC:n\/a, S:9.1+]"},{"name":"form-attribute","url":"http:\/\/caniuse.com\/#feat=form-attribute","keywords":"form,attribute","title":"Form attribute","description":"Attribute for associating input and submit buttons with a form.","stats":"[IE:n\/a, FF:4+, GC:10+, S:5.1+]"},{"name":"es5","url":"http:\/\/caniuse.com\/#feat=es5","keywords":"es5,function.bind,array.foreach,array.indexof,array.map,date.now,defineproperties,getprototypeof,keys,seal,freeze,preventextensions,issealed,isfrozen,isextensible,getownpropertydescriptorgetownpropertynames,toisostringc,isarray,lastindexof,every,some,reduce,reduceright,getter,setter","title":"ECMAScript 5","description":"Full support for the ECMAScript 5 specification. Features include `Function.prototype.bind`, Array methods like `indexOf`, `forEach`, `map` & `filter`, Object methods like `defineProperty`, `create` & `keys`, the `trim` method on Strings and many more.","stats":"[IE:10+, FF:21+, GC:23+, S:6+]"},{"name":"page-transition-events","url":"http:\/\/caniuse.com\/#feat=page-transition-events","keywords":"history,page,transition,hide,show,bfcache,event,persisted","title":"PageTransitionEvent","description":"Fired at the Window when the page's entry in the session history stops being the current entry. Includes the `pageshow` and `pagehide` events.","stats":"[IE:11+, FF:2+, GC:4+, S:5+]"},{"name":"ogg-vorbis","url":"http:\/\/caniuse.com\/#feat=ogg-vorbis","keywords":".ogg,.oga,application\/ogg,audio\/ogg","title":"Ogg Vorbis audio format","description":"Vorbis is a free and open source audio format, most commonly used with the Ogg container.","stats":"[IE:n\/a, FF:3.5+, GC:4+, S:n\/a]"},{"name":"meter","url":"http:\/\/caniuse.com\/#feat=meter","keywords":"<meter>","title":"meter element","description":"Method of indicating the current level of a gauge.","stats":"[IE:n\/a, FF:16+, GC:8+, S:6+]"},{"name":"progress","url":"http:\/\/caniuse.com\/#feat=progress","keywords":"#progressmeter,<progress>","title":"progress element","description":"Method of indicating a progress state.","stats":"[IE:10+, FF:6+, GC:8+, S:6+]"},{"name":"css-filter-function","url":"http:\/\/caniuse.com\/#feat=css-filter-function","keywords":"filter, function","title":"CSS filter() function","description":"This function filters a CSS input image with a set of filter functions (like blur, grayscale or hue)","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:9.1+]"},{"name":"css-element-function","url":"http:\/\/caniuse.com\/#feat=css-element-function","keywords":"element, function","title":"CSS element() function","description":"This function renders a live image generated from an arbitrary HTML element","stats":"[IE:n\/a, FF:52-px-, GC:n\/a, S:n\/a]"},{"name":"u2f","url":"http:\/\/caniuse.com\/#feat=u2f","keywords":"fido,u2f","title":"FIDO U2F API","description":"Javascript API to interact with Universal Second Factor (U2F) devices. This allows users to log into sites more securely using two-factor authentication with a USB dongle.","stats":"[IE:n\/a, FF:n\/a, GC:41+, S:n\/a]"},{"name":"aac","url":"http:\/\/caniuse.com\/#feat=aac","keywords":"audio\/aac","title":"AAC audio file format","description":"Advanced Audio Coding format, designed to be the successor format to MP3, with generally better sound quality.","stats":"[IE:9+, FF:52!pa., GC:12+, S:4+]"},{"name":"link-rel-prefetch","url":"http:\/\/caniuse.com\/#feat=link-rel-prefetch","keywords":"","title":"Resource Hints: prefetch","description":"Informs the browsers that a given resource should be prefetched so it can be loaded more quickly. This is indicated using ``","stats":"[IE:11+, FF:2+, GC:8+, S:n\/a]"},{"name":"ol-reversed","url":"http:\/\/caniuse.com\/#feat=ol-reversed","keywords":"reversed,list,ol,attribute","title":"Reversed attribute of ordered lists","description":"This attribute makes an ordered list number its items in descending order (large to small), instead of ascending order (small to large; the default). The order that the list items are displayed in is not affected.","stats":"[IE:n\/a, FF:18+, GC:20+, S:6.1+]"},{"name":"css-first-letter","url":"http:\/\/caniuse.com\/#feat=css-first-letter","keywords":"first,letter,pseudo,element,class,selector","title":"::first-letter CSS pseudo-element selector","description":"CSS pseudo-element that allows styling only the first \"letter\" of text within an element. Useful for implementing initial caps or drop caps styling.","stats":"[IE:9+, FF:3.5+, GC:9+, S:5.1+]"},{"name":"wbr-element","url":"http:\/\/caniuse.com\/#feat=wbr-element","keywords":"wbr,element,word,break,opportunity","title":"wbr (word break opportunity) element","description":"Represents an extra place where a line of text may optionally be broken.","stats":"[IE:5.5+, FF:2+, GC:4+, S:3.2+]"},{"name":"const","url":"http:\/\/caniuse.com\/#feat=const","keywords":"ES6,constant,block,scope","title":"const","description":"Declares a constant with block level scope","stats":"[IE:11+, FF:36+, GC:49+, S:10+]"},{"name":"css-all","url":"http:\/\/caniuse.com\/#feat=css-all","keywords":"CSS,all,property,shorthand,reset","title":"CSS all property","description":"A shorthand property for resetting all CSS properties except for `direction` and `unicode-bidi`.","stats":"[IE:n\/a, FF:27+, GC:37+, S:9.1+]"},{"name":"css-initial-value","url":"http:\/\/caniuse.com\/#feat=css-initial-value","keywords":"CSS,initial,value","title":"CSS initial value","description":"A CSS value that will apply a property's initial value as defined in the CSS specification that defines the property","stats":"[IE:n\/a, FF:19+, GC:4+, S:3.2+]"},{"name":"css-letter-spacing","url":"http:\/\/caniuse.com\/#feat=css-letter-spacing","keywords":"CSS,letter,spacing,tracking","title":"letter-spacing CSS property","description":"Controls spacing between characters of text (i.e. \"tracking\" in typographical terms). Not to be confused with kerning.","stats":"[IE:9+, FF:2+, GC:30+, S:6.1+]"},{"name":"css-unset-value","url":"http:\/\/caniuse.com\/#feat=css-unset-value","keywords":"CSS,unset,value","title":"CSS unset value","description":"A CSS value that's the same as \"inherit\" if a property is inherited or \"initial\" if a property is not inherited.","stats":"[IE:n\/a, FF:27+, GC:41+, S:9.1+]"},{"name":"insertadjacenthtml","url":"http:\/\/caniuse.com\/#feat=insertadjacenthtml","keywords":"element,insert,adjacent,HTML","title":"Element.insertAdjacentHTML()","description":"Inserts a string of HTML into a specified position in the DOM relative to the given element.","stats":"[IE:10+, FF:8+, GC:4+, S:4+]"},{"name":"let","url":"http:\/\/caniuse.com\/#feat=let","keywords":"ES6,variable,block,scope","title":"let","description":"Declares a variable with block level scope","stats":"[IE:11+, FF:44+, GC:49+, S:10+]"},{"name":"arrow-functions","url":"http:\/\/caniuse.com\/#feat=arrow-functions","keywords":"ES6,JavaScript,fat,arrow,function,lexical,this","title":"Arrow functions","description":"Function shorthand using `=>` syntax and lexical `this` binding.","stats":"[IE:n\/a, FF:22+, GC:45+, S:10+]"},{"name":"asmjs","url":"http:\/\/caniuse.com\/#feat=asmjs","keywords":"asm,asm.js,asmjs,WebAssembly","title":"asm.js","description":"an extraordinarily optimizable, low-level subset of JavaScript, indended to be a compile target from languages like C++.","stats":"[IE:n\/a, FF:22+, GC:56!pa., S:n\/a]"},{"name":"lazyload","url":"http:\/\/caniuse.com\/#feat=lazyload","keywords":"","title":"Resource Hints: Lazyload","description":"Gives a hint to the browser to lower the loading priority of a resource.","stats":"[IE:11+, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"link-rel-dns-prefetch","url":"http:\/\/caniuse.com\/#feat=link-rel-dns-prefetch","keywords":"","title":"Resource Hints: dns-prefetch","description":"Gives a hint to the browser to perform a DNS lookup in the background to improve performance. This is indicated using ``","stats":"[IE:10+, FF:3.5+, GC:4+, S:5+]"},{"name":"link-rel-prerender","url":"http:\/\/caniuse.com\/#feat=link-rel-prerender","keywords":"","title":"Resource Hints: prerender","description":"Gives a hint to the browser to render the specified page in the background, speeding up page load if the user navigates to it. This is indicated using ``","stats":"[IE:11+, FF:n\/a, GC:13+, S:n\/a]"},{"name":"rest-parameters","url":"http:\/\/caniuse.com\/#feat=rest-parameters","keywords":"ES6,JavaScript","title":"Rest parameters","description":"Allows representation of an indefinite number of arguments as an array.","stats":"[IE:n\/a, FF:15+, GC:47+, S:10+]"},{"name":"css-cross-fade","url":"http:\/\/caniuse.com\/#feat=css-cross-fade","keywords":"css,image,crossfade","title":"CSS Cross-Fade Function","description":"Image function to create a \"crossfade\" between images. This allows one image to transition (fade) into another based on a percentage value.","stats":"[IE:n\/a, FF:n\/a, GC:56-px-, S:10+]"},{"name":"css-writing-mode","url":"http:\/\/caniuse.com\/#feat=css-writing-mode","keywords":"css,writing,direction,i18n,vertical,ltr,rtl","title":"CSS writing-mode property","description":"Property to define whether lines of text are laid out horizontally or vertically and the direction in which blocks progress.","stats":"[IE:11!pa., FF:41+, GC:56-px-, S:10-px-]"},{"name":"customevent","url":"http:\/\/caniuse.com\/#feat=customevent","keywords":"custom events,custom,event","title":"CustomEvent","description":"A DOM event interface that can carry custom application-defined data.","stats":"[IE:11!pa., FF:11+, GC:15+, S:6.1+]"},{"name":"textcontent","url":"http:\/\/caniuse.com\/#feat=textcontent","keywords":"","title":"Node.textContent","description":"DOM Node property representing the text content of a node and its descendants","stats":"[IE:9+, FF:2+, GC:4+, S:3.2+]"},{"name":"addeventlistener","url":"http:\/\/caniuse.com\/#feat=addeventlistener","keywords":"event,target,add,remove,listener,capture,capturing,phase","title":"EventTarget.addEventListener()","description":"The modern standard API for adding DOM event handlers. Introduced in the DOM Level 2 Events spec. Also implies support for the [capture phase](https:\/\/dom.spec.whatwg.org\/#dom-event-capturing_phase) of DOM event dispatch and `preventDefault()`.","stats":"[IE:9+, FF:7+, GC:4+, S:3.1+]"},{"name":"dispatchevent","url":"http:\/\/caniuse.com\/#feat=dispatchevent","keywords":"dispatch,event,target,fire,trigger,dom","title":"EventTarget.dispatchEvent","description":"Method to programmatically trigger a DOM event.","stats":"[IE:11+, FF:2+, GC:4+, S:3.2+]"},{"name":"documenthead","url":"http:\/\/caniuse.com\/#feat=documenthead","keywords":"document,head","title":"document.head","description":"Convenience property for accessing the `` element","stats":"[IE:9+, FF:4+, GC:4+, S:5.1+]"},{"name":"innertext","url":"http:\/\/caniuse.com\/#feat=innertext","keywords":"inner,text,content","title":"Node.innerText","description":"A property representing the text within a DOM element and its descendants. As a getter, it approximates the text the user would get if they highlighted the contents of the element with the cursor and then copied to the clipboard.","stats":"[IE:6+, FF:45+, GC:4+, S:3.2+]"},{"name":"client-hints-dpr-width-viewport","url":"http:\/\/caniuse.com\/#feat=client-hints-dpr-width-viewport","keywords":"client hints, client-hints, dpr, viewport, content-dpr","title":"Client Hints: DPR, Width, Viewport-Width","description":"DPR, Width, and Viewport-Width hints enable proactive content negotiation between client and server, enabling automated delivery of optimized assets - e.g. auto-negotiating image DPR resolution.","stats":"[IE:n\/a, FF:n\/a, GC:46+, S:n\/a]"},{"name":"link-rel-preconnect","url":"http:\/\/caniuse.com\/#feat=link-rel-preconnect","keywords":"preconnect, resource hints","title":"Resource Hints: preconnect","description":"Gives a hint to the browser to begin the connection handshake (DNS, TCP, TLS) in the background to improve performance. This is indicated using ``","stats":"[IE:n\/a, FF:40+, GC:46+, S:n\/a]"},{"name":"netinfo","url":"http:\/\/caniuse.com\/#feat=netinfo","keywords":"performance,network,network information,netinfo","title":"Network Information API","description":"The Network Information API enables web applications to access information about the network connection in use by the device.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"setimmediate","url":"http:\/\/caniuse.com\/#feat=setimmediate","keywords":"setImmediate,clearImmediate,setTimeout,performance","title":"Efficient Script Yielding: setImmediate()","description":"Yields control flow without the minimum delays enforced by setTimeout","stats":"[IE:10+, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"es6-number","url":"http:\/\/caniuse.com\/#feat=es6-number","keywords":"ES6,JavaScript,number,built-in,EPSILON,MIN_SAFE_INTEGER,MAX_SAFE_INTEGER,isFinite,isInteger,isSafeInteger,isNaN","title":"ES6 Number","description":"Extensions to the `Number` built-in object in ES6, including constant properties `EPSILON`, `MIN_SAFE_INTEGER`, and `MAX_SAFE_INTEGER`, and methods ` isFinite`, `isInteger`, `isSafeInteger`, and `isNaN`.","stats":"[IE:n\/a, FF:32+, GC:34+, S:9+]"},{"name":"maxlength","url":"http:\/\/caniuse.com\/#feat=maxlength","keywords":"maximum,length,input,textarea,too,long,validity,state","title":"maxlength attribute for input and textarea elements","description":"Declares an upper bound on the number of characters the user can input. Normally the UI ignores attempts by the user to type in additional characters beyond this limit.","stats":"[IE:10+, FF:51+, GC:4+, S:5.1+]"},{"name":"proxy","url":"http:\/\/caniuse.com\/#feat=proxy","keywords":"proxies,es6,es2015,traps,meta,virtual,logging,host","title":"Proxy object","description":"The Proxy object allows custom behaviour to be defined for fundamental operations. Useful for logging, profiling, object virtualisation, etc.","stats":"[IE:n\/a, FF:18+, GC:49+, S:10+]"},{"name":"keyboardevent-which","url":"http:\/\/caniuse.com\/#feat=keyboardevent-which","keywords":"keyboard,event,which","title":"KeyboardEvent.which","description":"A legacy `KeyboardEvent` property that is equivalent to either `KeyboardEvent.keyCode` or `KeyboardEvent.charCode` depending on whether the key is alphanumeric.","stats":"[IE:9+, FF:2+, GC:4+, S:5.1+]"},{"name":"keyboardevent-charcode","url":"http:\/\/caniuse.com\/#feat=keyboardevent-charcode","keywords":"keyboard,event,key,char,character,code,charCode","title":"KeyboardEvent.charCode","description":"A legacy `KeyboardEvent` property that gives the Unicode codepoint number of a character key pressed during a `keypress` event.","stats":"[IE:9+, FF:3+, GC:4+, S:4+]"},{"name":"keyboardevent-code","url":"http:\/\/caniuse.com\/#feat=keyboardevent-code","keywords":"keyboard,event,code","title":"KeyboardEvent.code","description":"A `KeyboardEvent` property representing the physical key that was pressed, ignoring the keyboard layout and ignoring whether any modifier keys were active.","stats":"[IE:n\/a, FF:38+, GC:48+, S:n\/a]"},{"name":"keyboardevent-location","url":"http:\/\/caniuse.com\/#feat=keyboardevent-location","keywords":"keyboard,event,key,location,keyLocation,numpad","title":"KeyboardEvent.location","description":"A `KeyboardEvent` property that indicates the location of the key on the input device. Useful when there are more than one physical key for the same logical key (e.g. left or right \"Control\" key; main or numpad \"1\" key).","stats":"[IE:9+, FF:15+, GC:30+, S:6.1+]"},{"name":"keyboardevent-getmodifierstate","url":"http:\/\/caniuse.com\/#feat=keyboardevent-getmodifierstate","keywords":"keyboard,event,get,modifier,state","title":"KeyboardEvent.getModifierState()","description":"`KeyboardEvent` method that returns the state (whether the key is pressed\/locked or not) of the given modifier key.","stats":"[IE:9+, FF:15+, GC:30+, S:n\/a]"},{"name":"keyboardevent-key","url":"http:\/\/caniuse.com\/#feat=keyboardevent-key","keywords":"keyboard,event,key","title":"KeyboardEvent.key","description":"A `KeyboardEvent` property whose value is a string identifying the key that was pressed. Covers character keys, non-character keys (e.g. arrow keys), and dead keys.","stats":"[IE:9+, FF:29+, GC:51+, S:n\/a]"},{"name":"brotli","url":"http:\/\/caniuse.com\/#feat=brotli","keywords":"http,compression,accept,content,encoding","title":"Brotli Accept-Encoding\/Content-Encoding","description":"More effective lossless compression algorithm than gzip and deflate.","stats":"[IE:n\/a, FF:44+, GC:51+, S:n\/a]"},{"name":"element-closest","url":"http:\/\/caniuse.com\/#feat=element-closest","keywords":"element,closest,dom","title":"Element.closest()","description":"DOM method that returns the current element if it matches the given selector, or else the closest ancestor element that matches the given selector, or else null.","stats":"[IE:n\/a, FF:35+, GC:41+, S:9+]"},{"name":"input-event","url":"http:\/\/caniuse.com\/#feat=input-event","keywords":"input,event","title":"input event","description":"The `input` event is fired when the user changes the value of an `` element, `` element, or `` element. By contrast, the \"change\" event usually only fires after the form control has lost focus.","stats":"[IE:9!pa., FF:49+, GC:n\/a, S:n\/a]"},{"name":"input-search","url":"http:\/\/caniuse.com\/#feat=input-search","keywords":"input,type,search","title":"Search input type","description":"Search field form input type. Intended to look like the underlying platform's native search field widget (if there is one). Other than its appearance, it's the same as an ``.","stats":"[IE:n\/a, FF:n\/a, GC:26+, S:5.1+]"},{"name":"css-motion-paths","url":"http:\/\/caniuse.com\/#feat=css-motion-paths","keywords":"","title":"CSS Motion Path","description":"Allows elements to be animated along SVG paths or shapes","stats":"[IE:n\/a, FF:n\/a, GC:46+, S:n\/a]"},{"name":"css-scroll-behavior","url":"http:\/\/caniuse.com\/#feat=css-scroll-behavior","keywords":"smooth,scroll,cssom,scroll-behavior","title":"CSSOM Scroll-behavior","description":"Method of specifying the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.","stats":"[IE:n\/a, FF:36+, GC:n\/a, S:n\/a]"},{"name":"subresource-integrity","url":"http:\/\/caniuse.com\/#feat=subresource-integrity","keywords":"SRI, security, hash","title":"Subresource Integrity","description":"Subresource Integrity enables browsers to verify that file is delivered without unexpected manipulation.","stats":"[IE:n\/a, FF:43+, GC:45+, S:n\/a]"},{"name":"custom-elementsv1","url":"http:\/\/caniuse.com\/#feat=custom-elementsv1","keywords":"web components,custom elements","title":"Custom Elements v1","description":"Method of defining new HTML tags.","stats":"[IE:11w\/pl, FF:52w\/pl, GC:54+, S:10w\/pl]"},{"name":"css-in-out-of-range","url":"http:\/\/caniuse.com\/#feat=css-in-out-of-range","keywords":"in,out,of,range,:in-range,:out-of-range","title":":in-range and :out-of-range CSS pseudo-classes","description":"If a temporal or number `` has `max` and\/or `min` attributes, then `:in-range` matches when the value is within the specified range and `:out-of-range` matches when the value is outside the specified range. If there are no range constraints, then neither pseudo-class matches.","stats":"[IE:n\/a, FF:50+, GC:53+, S:10!pa.]"},{"name":"push-api","url":"http:\/\/caniuse.com\/#feat=push-api","keywords":"push notifications","title":"Push API","description":"API to allow messages to be pushed from a server to a browser, even when the site isn't focused or even open in the browser.","stats":"[IE:n\/a, FF:n\/a, GC:49!pa., S:n\/a]"},{"name":"background-position-x-y","url":"http:\/\/caniuse.com\/#feat=background-position-x-y","keywords":"","title":"background-position-x & background-position-y","description":"CSS longhand properties to define x or y positions separately.","stats":"[IE:5.5+, FF:49+, GC:4+, S:3.1+]"},{"name":"css-revert-value","url":"http:\/\/caniuse.com\/#feat=css-revert-value","keywords":"CSS,reset,value","title":"CSS revert value","description":"A CSS keyword value that resets a property's value to the default specified by the browser in its UA stylesheet, as if the webpage had not included any CSS. For example, `display:revert` on a `` would result in `display:block`. This is in contrast to the `initial` value, which is simply defined on a per-property basis, and for `display` would be `inline`.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:9.1+]"},{"name":"css-widows-orphans","url":"http:\/\/caniuse.com\/#feat=css-widows-orphans","keywords":"","title":"CSS widows & orphans","description":"CSS properties to control when lines break across pages or columns by defining the amount of lines that must be left before or after the break.","stats":"[IE:10+, FF:n\/a, GC:25+, S:7+]"},{"name":"web-bluetooth","url":"http:\/\/caniuse.com\/#feat=web-bluetooth","keywords":"bluetooth,ble,iot,physicalweb,webbluetooth","title":"Web Bluetooth","description":"Allows web sites to communicate over GATT with nearby user-selected Bluetooth devices in a secure and privacy-preserving way.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"scrollintoview","url":"http:\/\/caniuse.com\/#feat=scrollintoview","keywords":"","title":"scrollIntoView","description":"The `Element.scrollIntoView()` method scrolls the current element into the visible area of the browser window. Parameters can be provided to set the position inside the visible area as well as whether scrolling should be instant or smooth.","stats":"[IE:11!pa., FF:36+, GC:56!pa., S:10!pa.]"},{"name":"css-nth-child-of","url":"http:\/\/caniuse.com\/#feat=css-nth-child-of","keywords":"nth-child,nth-last-child,nth,child,an,b,of,s,sel,selector,list","title":"selector list argument of :nth-child and :nth-last-child CSS pseudo-classes","description":"The newest versions of `:nth-child()` and `:nth-last-child()` accept an optional `of S` clause which filters the children to only those which match the selector list `S`. For example, `:nth-child(1 of .foo)` selects the first child among the children that have the `foo` class (ignoring any non-`foo` children which precede that child). Similar to `:nth-of-type`, but for arbitrary selectors instead of only type selectors.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:9+]"},{"name":"focusin-focusout-events","url":"http:\/\/caniuse.com\/#feat=focusin-focusout-events","keywords":"focusin,focusout,focus,event","title":"focusin & focusout events","description":"The `focusin` and `focusout` events fire just before the element gains or loses focus, and they bubble. By contrast, the `focus` and `blur` events fire after the focus has shifted, and don't bubble.","stats":"[IE:6+, FF:n\/a, GC:15+, S:5.1+]"},{"name":"css-matches-pseudo","url":"http:\/\/caniuse.com\/#feat=css-matches-pseudo","keywords":":matches,matches,:any,any","title":":matches() CSS pseudo-class","description":"The `:matches()` (formerly `:any()`) pseudo-class checks whether the element at its position in the outer selector matches any of the selectors in its selector list. It's useful syntactic sugar that allows you to avoid writing out all the combinations manually as separate selectors. The effect is similar to nesting in Sass and most other CSS preprocessors.","stats":"[IE:n\/a, FF:52!pa., GC:56!pa., S:8!pa.]"},{"name":"rel-noopener","url":"http:\/\/caniuse.com\/#feat=rel-noopener","keywords":"rel,relation,link,security","title":"rel=noopener","description":"Ensure new browsing contexts are opened without a useful `window.opener`","stats":"[IE:n\/a, FF:n\/a, GC:49+, S:n\/a]"},{"name":"css-text-justify","url":"http:\/\/caniuse.com\/#feat=css-text-justify","keywords":"","title":"CSS text-justify","description":"CSS property to define how text should be justified when `text-align: justify` is set.","stats":"[IE:11!pa., FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"css-scrollbar","url":"http:\/\/caniuse.com\/#feat=css-scrollbar","keywords":"scrollbar-button,scrollbar-track,scrollbar-thumb,scrollbar-base-color,scrollbar-face-color","title":"CSS scrollbar styling","description":"Non-standard methods of styling scrollbars.","stats":"[IE:11!pa., FF:n\/a, GC:56-px-, S:10-px-]"},{"name":"link-rel-preload","url":"http:\/\/caniuse.com\/#feat=link-rel-preload","keywords":"","title":"Resource Hints: preload","description":"Using ``, browsers can be informed to prefetch resources without having to execute them, allowing fine-grained control over when and how resources are loaded.","stats":"[IE:n\/a, FF:n\/a, GC:50+, S:n\/a]"},{"name":"css-case-insensitive","url":"http:\/\/caniuse.com\/#feat=css-case-insensitive","keywords":"i,attribute,case,insensitive,sensitive,sensitivity,insensitivity","title":"Case-insensitive CSS attribute selectors","description":"Including an `i` before the `]` in a CSS attribute selector causes the attribute value to be matched in an ASCII-case-insensitive manner. For example, `[b=\"xyz\" i]` would match both `` and ``.","stats":"[IE:n\/a, FF:47+, GC:49+, S:9+]"},{"name":"css-default-pseudo","url":"http:\/\/caniuse.com\/#feat=css-default-pseudo","keywords":":default,default","title":":default CSS pseudo-class","description":"The `:default` pseudo-class matches checkboxes and radio buttons which are checked by default, ``s with the `selected` attribute, and the default submit button (if any) of a form.","stats":"[IE:n\/a, FF:4+, GC:51+, S:10!pa.]"},{"name":"css-optional-pseudo","url":"http:\/\/caniuse.com\/#feat=css-optional-pseudo","keywords":":optional,optional,:required,required","title":":optional CSS pseudo-class","description":"The `:optional` pseudo-class matches form inputs (``, ``, ``) which are not `:required`.","stats":"[IE:10+, FF:4+, GC:15+, S:5+]"},{"name":"css-indeterminate-pseudo","url":"http:\/\/caniuse.com\/#feat=css-indeterminate-pseudo","keywords":":indeterminate,indeterminate","title":":indeterminate CSS pseudo-class","description":"The `:indeterminate` pseudo-class matches indeterminate checkboxes, indeterminate `` bars, and radio buttons with no checked button in their radio button group.","stats":"[IE:11!pa., FF:51+, GC:39+, S:10!pa.]"},{"name":"webgl2","url":"http:\/\/caniuse.com\/#feat=webgl2","keywords":"web gl","title":"WebGL 2.0","description":"Next version of WebGL. Based on OpenGL ES 3.0.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"document-currentscript","url":"http:\/\/caniuse.com\/#feat=document-currentscript","keywords":"","title":"document.currentScript","description":"`document.currentScript` returns the `` element whose script is currently being processed.","stats":"[IE:n\/a, FF:4+, GC:29+, S:8+]"},{"name":"css-descendant-gtgt","url":"http:\/\/caniuse.com\/#feat=css-descendant-gtgt","keywords":"","title":"Explicit descendant combinator >>","description":"An explicit, non-whitespace spelling of the descendant combinator. `A >> B` is equivalent to `A B`.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:10+]"},{"name":"css-has","url":"http:\/\/caniuse.com\/#feat=css-has","keywords":"children,parent,selector","title":":has() CSS relational pseudo-class","description":"Only select elements containing specified content. For example, `a:has(>img)` selects all `` elements that contain an `` child.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"css-not-sel-list","url":"http:\/\/caniuse.com\/#feat=css-not-sel-list","keywords":"negation,not,pseudo,selector,selectors,list,multiple,argument,level,4","title":"selector list argument of :not()","description":"Selectors Level 4 allows the `:not()` pseudo-class to accept a list of selectors, which the element must not match any of. Selectors Level 3 only allowed `:not()` to accept a single simple selector. Thus, `:not(a):not(.b):not([c])` can instead be written as `:not(a, .b, [c])`","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:9+]"},{"name":"credential-management","url":"http:\/\/caniuse.com\/#feat=credential-management","keywords":"credential,navigator.credentials","title":"Credential Management API","description":"API that provides a programmatic interface to the browser's credential manager. In short, an origin can request a user's credentials to sign them in, or can ask the browser to save credentials on the user's behalf. Both of these requests are user-mediated.","stats":"[IE:n\/a, FF:n\/a, GC:51+, S:n\/a]"},{"name":"css-dir-pseudo","url":"http:\/\/caniuse.com\/#feat=css-dir-pseudo","keywords":":dir,dir,direction,ltr,rtl,left,right","title":":dir() CSS pseudo-class","description":"Matches elements based on their directionality. `:dir(ltr)` matches elements which are Left-to-Right. `:dir(rtl)` matches elements which are Right-to-Left.","stats":"[IE:n\/a, FF:49+, GC:n\/a, S:n\/a]"},{"name":"css-focus-within","url":"http:\/\/caniuse.com\/#feat=css-focus-within","keywords":"focus,within,focus-within,pseudo","title":":focus-within CSS pseudo-class","description":"The `:focus-within` pseudo-class matches elements that either themselves match `:focus` or that have descendants which match `:focus`.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"dom-manip-convenience","url":"http:\/\/caniuse.com\/#feat=dom-manip-convenience","keywords":"dom,manipulation,convenience,convenient,before,after,replaceWith,prepend,append","title":"DOM manipulation convenience methods","description":"jQuery-like methods on DOM nodes to insert nodes around or within a node, or to replace one node with another. These methods accept any number of DOM nodes or HTML strings as arguments. Includes: `ChildNode.before`, `ChildNode.after`, `ChildNode.replaceWith`, `ParentNode.prepend`, and `ParentNode.append`.","stats":"[IE:n\/a, FF:49+, GC:n\/a, S:10+]"},{"name":"requestidlecallback","url":"http:\/\/caniuse.com\/#feat=requestidlecallback","keywords":"requestIdleCallback,request,idle","title":"requestIdleCallback","description":"API allowing the execution of JavaScript to be queued to run in idle browser time, either at the end of a frame or when the user is inactive. Also covers support for `cancelIdleCallback`. The API has similarities with `requestAnimationFrame`.","stats":"[IE:n\/a, FF:n\/a, GC:47+, S:n\/a]"},{"name":"scrollintoviewifneeded","url":"http:\/\/caniuse.com\/#feat=scrollintoviewifneeded","keywords":"scrollIntoViewIfNeeded,scroll","title":"Element.scrollIntoViewIfNeeded()","description":"If the element is fully within the visible area of the viewport, it does nothing. Otherwise, the element is scrolled into view. A proprietary variant of the standard `Element.scrollIntoView()` method.","stats":"[IE:n\/a, FF:n\/a, GC:15+, S:5.1+]"},{"name":"css3-attr","url":"http:\/\/caniuse.com\/#feat=css3-attr","keywords":"attr,attribute,function","title":"CSS3 attr() function","description":"CSS Values and Units Level 3 adds the ability to use `attr()` on any CSS property, not just `content`, and to use it for non-string values (e.g. numbers, colors).","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"sdch","url":"http:\/\/caniuse.com\/#feat=sdch","keywords":"http,compression,accept,content,encoding,sdch","title":"SDCH Accept-Encoding\/Content-Encoding","description":"Shared Dictionary Compression over HTTP","stats":"[IE:n\/a, FF:n\/a, GC:4+, S:n\/a]"},{"name":"css-containment","url":"http:\/\/caniuse.com\/#feat=css-containment","keywords":"","title":"CSS Containment","description":"The CSS `contain` property lets developers limit the scope of the browser's styles, layout and paint work for faster and more efficient rendering.","stats":"[IE:n\/a, FF:n\/a, GC:52+, S:n\/a]"},{"name":"tls1-2","url":"http:\/\/caniuse.com\/#feat=tls1-2","keywords":"","title":"TLS 1.2","description":"The latest version of the Transport Layer Security (TLS) protocol. Allows for data\/message confidentiality, and message authentication codes for message integrity and as a by-product message authentication.","stats":"[IE:11+, FF:27+, GC:30+, S:7+]"},{"name":"tls1-1","url":"http:\/\/caniuse.com\/#feat=tls1-1","keywords":"","title":"TLS 1.1","description":"Version 1.1 of the Transport Layer Security (TLS) protocol.","stats":"[IE:11+, FF:24+, GC:22+, S:7+]"},{"name":"input-inputmode","url":"http:\/\/caniuse.com\/#feat=input-inputmode","keywords":"","title":"inputmode attribute","description":"The `inputmode` attribute specifies what kind of input mechanism would be most helpful for users entering content into the form control.","stats":"[IE:n\/a, FF:20!pa., GC:n\/a, S:n\/a]"},{"name":"ch-unit","url":"http:\/\/caniuse.com\/#feat=ch-unit","keywords":"ch unit,character unit","title":"ch (character) unit","description":"Unit representing the width of the character \"0\" in the current font, of particular use in combination with monospace fonts.","stats":"[IE:11!pa., FF:2+, GC:27+, S:7+]"},{"name":"img-naturalwidth-naturalheight","url":"http:\/\/caniuse.com\/#feat=img-naturalwidth-naturalheight","keywords":"","title":"naturalWidth & naturalHeight image properties","description":"Properties defining the intrinsic width and height of the image, rather than the displayed width & height.","stats":"[IE:9+, FF:2+, GC:4+, S:3.1+]"},{"name":"filereadersync","url":"http:\/\/caniuse.com\/#feat=filereadersync","keywords":"","title":"FileReaderSync","description":"Allows files to be read synchronously in Web Workers","stats":"[IE:10+, FF:8+, GC:15+, S:6+]"},{"name":"mediarecorder","url":"http:\/\/caniuse.com\/#feat=mediarecorder","keywords":"","title":"MediaRecorder API","description":"The MediaRecorder API (MediaStream Recording) aims to provide a really simple mechanism by which developers can record media streams from the user's input devices and instantly use them in web apps, rather than having to perform manual encoding operations on raw PCM data, etc.","stats":"[IE:n\/a, FF:29+, GC:49+, S:n\/a]"},{"name":"readonly-attr","url":"http:\/\/caniuse.com\/#feat=readonly-attr","keywords":"readonly,read,attribute,edit,editable","title":"readonly attribute of input and textarea elements","description":"Makes the form control non-editable. Unlike the `disabled` attribute, `readonly` form controls are still included in form submissions and the user can still select (but not edit) their value text.","stats":"[IE:6+, FF:4+, GC:26+, S:5.1+]"},{"name":"x-frame-options","url":"http:\/\/caniuse.com\/#feat=x-frame-options","keywords":"x-frame-options,frame,options,header,clickjacking","title":"X-Frame-Options HTTP header","description":"An HTTP header which indicates whether the browser should allow the webpage to be displayed in a frame within another webpage. Used as a defense against clickjacking attacks.","stats":"[IE:8+, FF:18+, GC:56!pa., S:10!pa.]"},{"name":"indeterminate-checkbox","url":"http:\/\/caniuse.com\/#feat=indeterminate-checkbox","keywords":"","title":"indeterminate checkbox","description":"Indeterminate checkboxes are displayed in a state which is distinct both from being checked or being unchecked. They are commonly used in hierarchical checkboxes to indicate that only some of the checkbox's descendants are checked.","stats":"[IE:6+, FF:3.6+, GC:28+, S:6+]"},{"name":"textencoder","url":"http:\/\/caniuse.com\/#feat=textencoder","keywords":"encoding,text,encoder,decoding,decoder,utf,8","title":"TextEncoder & TextDecoder","description":"`TextEncoder` encodes a JavaScript string into bytes using the UTF-8 encoding and returns the resulting `Uint8Array` of those bytes. `TextDecoder` does the reverse.","stats":"[IE:n\/a, FF:20+, GC:38+, S:n\/a]"},{"name":"element-from-point","url":"http:\/\/caniuse.com\/#feat=element-from-point","keywords":"document,elementFromPoint,element,from,point","title":"document.elementFromPoint()","description":"Given coordinates for a point relative to the viewport, returns the element that a click event would be dispatched at if the user were to click the point (in other words, the element that hit-testing would find).","stats":"[IE:6+, FF:3+, GC:15+, S:5+]"},{"name":"insert-adjacent","url":"http:\/\/caniuse.com\/#feat=insert-adjacent","keywords":"insertAdjacentElement,insertAdjacentText,insert,adjacent,element,text","title":"Element.insertAdjacentElement() & Element.insertAdjacentText()","description":"Methods for inserting an element or text before or after a given element, or appending or prepending an element or text to a given element's list of children.","stats":"[IE:6+, FF:48+, GC:4+, S:3.1+]"},{"name":"once-event-listener","url":"http:\/\/caniuse.com\/#feat=once-event-listener","keywords":"event,listener,options,once","title":"\"once\" event listener option","description":"Causes an event listener to be automatically removed after it gets invoked, so that it only gets invoked once. Similar to jQuery's `$.one()` feature.","stats":"[IE:n\/a, FF:50+, GC:55+, S:n\/a]"},{"name":"selection-api","url":"http:\/\/caniuse.com\/#feat=selection-api","keywords":"","title":"Selection API","description":"API for accessing selected content of a document, including the `window.getSelection()` method, as well as the `selectstart` & `selectionchanged` events on `document`.","stats":"[IE:9+, FF:52!pa., GC:15+, S:5.1+]"},{"name":"payment-request","url":"http:\/\/caniuse.com\/#feat=payment-request","keywords":"PaymentRequest,Web Payments","title":"Payment Request API","description":"Payment Request is a new API for the open web that makes checkout flows easier, faster and consistent on shopping sites.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"},{"name":"shadowdomv1","url":"http:\/\/caniuse.com\/#feat=shadowdomv1","keywords":"web components,shadow dom","title":"Shadow DOM v1","description":"Method of establishing and maintaining functional boundaries between DOM trees and how these trees interact with each other within a document, thus enabling better functional encapsulation within the DOM & CSS.","stats":"[IE:n\/a, FF:n\/a, GC:53+, S:10!pa.]"},{"name":"css-font-rendering-controls","url":"http:\/\/caniuse.com\/#feat=css-font-rendering-controls","keywords":"","title":"CSS font-rendering controls","description":"`@font-face` descriptor (currently defined as `font-display`) that allows control over how a downloadable font renders before it is fully loaded.","stats":"[IE:n\/a, FF:n\/a, GC:n\/a, S:n\/a]"}]

================================================
FILE: src/workflows.php
================================================
<?php


/**
* Name:         Workflows
* Description:  This PHP class object provides several useful functions for retrieving, parsing,
*               and formatting data to be used with Alfred 2 Workflows.
* Author:       David Ferguson (@jdfwarrior)
* Revised:      6/6/2013
* Version:      0.3.3
*/
class Workflows {

	private $cache;
	private $data;
	private $bundle;
	private $path;
	private $home;
	private $results;

	/**
	* Description:
	* Class constructor function. Initializes all class variables. Accepts one optional parameter
	* of the workflow bundle id in the case that you want to specify a different bundle id. This
	* would adjust the output directories for storing data.
	*
	* @param $bundleid - optional bundle id if not found automatically
	* @return none
	*/
	function __construct( $bundleid=null )
	{
		$this->path = exec('pwd');
		$this->home = exec('printf "$HOME"');

		if ( file_exists( 'info.plist' ) ):
			$this->bundle = $this->get( 'bundleid', 'info.plist' );
		endif;

		if ( !is_null( $bundleid ) ):
			$this->bundle = $bundleid;
		endif;

		$this->cache = getenv('alfred_workflow_cache');
		$this->data  = getenv('alfred_workflow_data');

		if ( !file_exists( $this->cache ) ):
			exec("mkdir '".$this->cache."'");
		endif;

		if ( !file_exists( $this->data ) ):
			exec("mkdir '".$this->data."'");
		endif;

		$this->results = array();
	}

	/**
	* Description:
	* Accepts no parameter and returns the value of the bundle id for the current workflow.
	* If no value is available, then false is returned.
	*
	* @param none
	* @return false if not available, bundle id value if available.
	*/
	public function bundle()
	{
		if ( is_null( $this->bundle ) ):
			return false;
		else:
			return $this->bundle;
		endif;
	}

	/**
	* Description:
	* Accepts no parameter and returns the value of the path to the cache directory for your
	* workflow if it is available. Returns false if the value isn't available.
	*
	* @param none
	* @return false if not available, path to the cache directory for your workflow if available.
	*/
	public function cache()
	{
		if ( is_null( $this->bundle ) ):
			return false;
		else:
			if ( is_null( $this->cache ) ):
				return false;
			else:
				return $this->cache;
			endif;
		endif;
	}

	/**
	* Description:
	* Accepts no parameter and returns the value of the path to the storage directory for your
	* workflow if it is available. Returns false if the value isn't available.
	*
	* @param none
	* @return false if not available, path to the storage directory for your workflow if available.
	*/
	public function data()
	{
		if ( is_null( $this->bundle ) ):
			return false;
		else:
			if ( is_null( $this->data ) ):
				return false;
			else:
				return $this->data;
			endif;
		endif;
	}

	/**
	* Description:
	* Accepts no parameter and returns the value of the path to the current directory for your
	* workflow if it is available. Returns false if the value isn't available.
	*
	* @param none
	* @return false if not available, path to the current directory for your workflow if available.
	*/
	public function path()
	{
		if ( is_null( $this->path ) ):
			return false;
		else:
			return $this->path;
		endif;
	}

	/**
	* Description:
	* Accepts no parameter and returns the value of the home path for the current user
	* Returns false if the value isn't available.
	*
	* @param none
	* @return false if not available, home path for the current user if available.
	*/
	public function home()
	{
		if ( is_null( $this->home ) ):
			return false;
		else:
			return $this->home;
		endif;
	}

	/**
	* Description:
	* Returns an array of available result items
	*
	* @param none
	* @return array - list of result items
	*/
	public function results()
	{
		return $this->results;
	}

	/**
	* Description:
	* Convert an associative array into XML format
	*
	* @param $a - An associative array to convert
	* @param $format - format of data being passed (json or array), defaults to array
	* @return - XML string representation of the array
	*/
	public function toxml( $a=null, $format='array' ) {

		if ( $format == 'json' ):
			$a = json_decode( $a, TRUE );
		endif;

		if ( is_null( $a ) && !empty( $this->results ) ):
			$a = $this->results;
		elseif ( is_null( $a ) && empty( $this->results ) ):
			return false;
		endif;

		$items = new SimpleXMLElement("<items></items>");   // Create new XML element

		foreach( $a as $b ):                                // Lop through each object in the array
			$c = $items->addChild( 'item' );                // Add a new 'item' element for each object
			$c_keys = array_keys( $b );                     // Grab all the keys for that item
			foreach( $c_keys as $key ):                     // For each of those keys
				if ( $key == 'uid' ):
					if ( $b[$key] === null || $b[$key] === '' ):
						continue;
					else:
						$c->addAttribute( 'uid', $b[$key] );
					endif;
				elseif ( $key == 'arg' ):
					$c->addAttribute( 'arg', $b[$key] );
					$c->$key = $b[$key];
				elseif ( $key == 'type' ):
					$c->addAttribute( 'type', $b[$key] );
				elseif ( $key == 'valid' ):
					if ( $b[$key] == 'yes' || $b[$key] == 'no' ):
						$c->addAttribute( 'valid', $b[$key] );
					endif;
				elseif ( $key == 'autocomplete' ):
					if ( $b[$key] === null || $b[$key] === '' ):
						continue;
					else:
						$c->addAttribute( 'autocomplete', $b[$key] );
					endif;
				elseif ( $key == 'icon' ):
					if ( substr( $b[$key], 0, 9 ) == 'fileicon:' ):
						$val = substr( $b[$key], 9 );
						$c->$key = $val;
						$c->$key->addAttribute( 'type', 'fileicon' );
					elseif ( substr( $b[$key], 0, 9 ) == 'filetype:' ):
						$val = substr( $b[$key], 9 );
						$c->$key = $val;
						$c->$key->addAttribute( 'type', 'filetype' );
					else:
						$c->$key = $b[$key];
					endif;
				else:
					$c->$key = $b[$key];
				endif;
			endforeach;
		endforeach;

		return $items->asXML();                             // Return XML string representation of the array

	}

	/**
	* Description:
	* Remove all items from an associative array that do not have a value
	*
	* @param $a - Associative array
	* @return bool
	*/
	private function empty_filter( $a ) {
		if ( $a == '' || $a == null ):                      // if $a is empty or null
			return false;                                   // return false, else, return true
		else:
			return true;
		endif;
	}

	/**
	* Description:
	* Save values to a specified plist. If the first parameter is an associative
	* array, then the second parameter becomes the plist file to save to. If the
	* first parameter is string, then it is assumed that the first parameter is
	* the label, the second parameter is the value, and the third parameter is
	* the plist file to save the data to.
	*
	* @param $a - associative array of values to save
	* @param $b - the value of the setting
	* @param $c - the plist to save the values into
	* @return string - execution output
	*/
	public function set( $a=null, $b=null, $c=null )
	{
		if ( is_array( $a ) ):
			if ( file_exists( $b ) ):
				if ( file_exists( $this->path.'/'.$b ) ):
					$b = $this->path.'/'.$b;
				endif;
			elseif ( file_exists( $this->data."/".$b ) ):
				$b = $this->data."/".$b;
			elseif ( file_exists( $this->cache."/".$b ) ):
				$b = $this->cache."/".$b;
			else:
				$b = $this->data."/".$b;
			endif;
		else:
			if ( file_exists( $c ) ):
				if ( file_exists( $this->path.'/'.$c ) ):
					$c = $this->path.'/'.$c;
				endif;
			elseif ( file_exists( $this->data."/".$c ) ):
				$c = $this->data."/".$c;
			elseif ( file_exists( $this->cache."/".$c ) ):
				$c = $this->cache."/".$c;
			else:
				$c = $this->data."/".$c;
			endif;
		endif;

		if ( is_array( $a ) ):
			foreach( $a as $k => $v ):
				exec( 'defaults write "'. $b .'" '. $k .' "'. $v .'"');
			endforeach;
		else:
			exec( 'defaults write "'. $c .'" '. $a .' "'. $b .'"');
		endif;
	}

	/**
	* Description:
	* Read a value from the specified plist
	*
	* @param $a - the value to read
	* @param $b - plist to read the values from
	* @return bool false if not found, string if found
	*/
	public function get( $a, $b ) {

		if ( file_exists( $b ) ):
			if ( file_exists( $this->path.'/'.$b ) ):
				$b = $this->path.'/'.$b;
			endif;
		elseif ( file_exists( $this->data."/".$b ) ):
			$b = $this->data."/".$b;
		elseif ( file_exists( $this->cache."/".$b ) ):
			$b = $this->cache."/".$b;
		else:
			return false;
		endif;

		exec( 'defaults read "'. $b .'" '.$a, $out );   // Execute system call to read plist value

		if ( $out == "" ):
			return false;
		endif;

		$out = $out[0];
		return $out;                                            // Return item value
	}

	/**
	* Description:
	* Read data from a remote file/url, essentially a shortcut for curl
	*
	* @param $url - URL to request
	* @param $options - Array of curl options
	* @return result from curl_exec
	*/
	public function request( $url=null, $options=null )
	{
		if ( is_null( $url ) ):
			return false;
		endif;

		$defaults = array(                                  // Create a list of default curl options
			CURLOPT_RETURNTRANSFER => true,                 // Returns the result as a string
			CURLOPT_URL => $url,                            // Sets the url to request
			CURLOPT_FRESH_CONNECT => true
		);

		if ( $options ):
			foreach( $options as $k => $v ):
				$defaults[$k] = $v;
			endforeach;
		endif;

		array_filter( $defaults,                            // Filter out empty options from the array
			array( $this, 'empty_filter' ) );

		$ch  = curl_init();                                 // Init new curl object
		curl_setopt_array( $ch, $defaults );                // Set curl options
		$out = curl_exec( $ch );                            // Request remote data
		$err = curl_error( $ch );
		curl_close( $ch );                                  // End curl request

		if ( $err ):
			return $err;
		else:
			return $out;
		endif;
	}

	/**
	* Description:
	* Allows searching the local hard drive using mdfind
	*
	* @param $query - search string
	* @return array - array of search results
	*/
	public function mdfind( $query )
	{
		exec('mdfind "'.$query.'"', $results);
		return $results;
	}

	/**
	 * Delete a cache file
	 *
	 * @author @willfarrell
	 * @param  string $a Path to the file to delete
	 * @return void
	 */
	public function delete( $a )
	{
		if ( file_exists( $a ) ):
			if ( file_exists( $this->path.'/'.$a ) ):
				unlink($this->path.'/'.$a);
			endif;
		elseif ( file_exists( $this->data."/".$a ) ):
			unlink($this->data."/".$a);
		elseif ( file_exists( $this->cache."/".$a ) ):
			unlink($this->cache."/".$a);
		endif;
	}

	/**
	* Description:
	* Accepts data and a string file name to store data to local file as cache
	*
	* @param array - data to save to file
	* @param file - filename to write the cache data to
	* @return none
	*/
	public function write( $a, $b )
	{
		if ( file_exists( $b ) ):
			if ( file_exists( $this->path.'/'.$b ) ):
				$b = $this->path.'/'.$b;
			endif;
		elseif ( file_exists( $this->data."/".$b ) ):
			$b = $this->data."/".$b;
		elseif ( file_exists( $this->cache."/".$b ) ):
			$b = $this->cache."/".$b;
		else:
			$b = $this->data."/".$b;
		endif;

		if ( is_array( $a ) ):
			$a = json_encode( $a );
			file_put_contents( $b, $a );
			return true;
		elseif ( is_string( $a ) ):
			file_put_contents( $b, $a );
			return true;
		else:
			return false;
		endif;
	}

	/**
	* Description:
	* Returns data from a local cache file
	*
	* @param file - filename to read the cache data from
	* @return false if the file cannot be found, the file data if found. If the file
	*           format is json encoded, then a json object is returned.
	*/
	public function read( $a, $array = false )
	{
		if ( file_exists( $a ) ):
			if ( file_exists( $this->path.'/'.$a ) ):
				$a = $this->path.'/'.$a;
			endif;
		elseif ( file_exists( $this->data."/".$a ) ):
			$a = $this->data."/".$a;
		elseif ( file_exists( $this->cache."/".$a ) ):
			$a = $this->cache."/".$a;
		else:
			return false;
		endif;

		$out = file_get_contents( $a );
		if ( !is_null( json_decode( $out ) ) && !$array ):
			$out = json_decode( $out );
		elseif ( !is_null( json_decode( $out ) ) && !$array ):
			$out = json_decode( $out, true );
		endif;

		return $out;
	}

	/**
	 * Check the file modification time
	 *
	 * @author @willfarrell
	 * @param  string  $a Path to a file
	 * @return integer    Returns the file modification time, or false
	 */
	public function filetime( $a )
	{
		if ( file_exists( $a ) ):
			if ( file_exists( $this->path.'/'.$a ) ):
				return filemtime($this->path.'/'.$a);
			endif;
		elseif ( file_exists( $this->data."/".$a ) ):
			return filemtime($this->data.'/'.$a);
		elseif ( file_exists( $this->cache."/".$a ) ):
			return filemtime($this->cache.'/'.$a);
		endif;

		return false;
	}

	/**
	* Description:
	* Helper function that just makes it easier to pass values into a function
	* and create an array result to be passed back to Alfred
	*
	* @param $uid - the uid of the result, should be unique
	* @param $arg - the argument that will be passed on
	* @param $title - The title of the result item
	* @param $sub - The subtitle text for the result item
	* @param $icon - the icon to use for the result item
	* @param $valid - sets whether the result item can be actioned
	* @param $auto - the autocomplete value for the result item
	* @return array - array item to be passed back to Alfred
	*/
	public function result( $uid, $arg, $title, $sub, $icon, $valid='yes', $auto=null, $type=null )
	{
		$temp = array(
			'uid' => $uid,
			'arg' => $arg,
			'title' => $title,
			'subtitle' => $sub,
			'icon' => $icon,
			'valid' => $valid,
			'autocomplete' => $auto,
			'type' => $type
		);

		if ( is_null( $type ) ):
			unset( $temp['type'] );
		endif;

		array_push( $this->results, $temp );

		return $temp;
	}

}
Download .txt
gitextract_buzijdyh/

├── .github/
│   └── FUNDING.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── caniuse.alfredworkflow
└── src/
    ├── caniuse.php
    ├── data.json
    └── workflows.php
Download .txt
SYMBOL INDEX (22 symbols across 2 files)

FILE: src/caniuse.php
  function getSSLPage (line 7) | function getSSLPage($url) {
  function browserVersion (line 19) | function browserVersion($stats) {
  function registerResult (line 75) | function registerResult($result) {

FILE: src/workflows.php
  class Workflows (line 12) | class Workflows {
    method __construct (line 30) | function __construct( $bundleid=null )
    method bundle (line 65) | public function bundle()
    method cache (line 82) | public function cache()
    method data (line 103) | public function data()
    method path (line 124) | public function path()
    method home (line 141) | public function home()
    method results (line 157) | public function results()
    method toxml (line 170) | public function toxml( $a=null, $format='array' ) {
    method empty_filter (line 238) | private function empty_filter( $a ) {
    method set (line 259) | public function set( $a=null, $b=null, $c=null )
    method get (line 304) | public function get( $a, $b ) {
    method request (line 336) | public function request( $url=null, $options=null )
    method mdfind (line 377) | public function mdfind( $query )
    method delete (line 390) | public function delete( $a )
    method write (line 411) | public function write( $a, $b )
    method read (line 445) | public function read( $a, $array = false )
    method filetime (line 476) | public function filetime( $a )
    method result (line 505) | public function result( $uid, $arg, $title, $sub, $icon, $valid='yes',...
Condensed preview — 8 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (162K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 725,
    "preview": "# These are supported funding model platforms\n\ngithub: [willfarrell] # Replace with up to 4 GitHub Sponsors-enabled user"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3671,
    "preview": "# How to contribute\nFirst off, thanks for you interest in contributing. Everyone who uses this repos really appreciates "
  },
  {
    "path": "LICENSE",
    "chars": 1079,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2013 will Farrell\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "README.md",
    "chars": 967,
    "preview": "caniuse ([Download v1.10](https://raw.github.com/willfarrell/alfred-caniuse-workflow/master/caniuse.alfredworkflow))\n==="
  },
  {
    "path": "src/caniuse.php",
    "chars": 3807,
    "preview": "<?php\n// ****************\n//error_reporting(0);\nrequire_once('workflows.php');\n$w = new Workflows();\n\nfunction getSSLPag"
  },
  {
    "path": "src/data.json",
    "chars": 124757,
    "preview": "[{\"name\":\"png-alpha\",\"url\":\"http:\\/\\/caniuse.com\\/#feat=png-alpha\",\"keywords\":\"\",\"title\":\"PNG alpha transparency\",\"descr"
  },
  {
    "path": "src/workflows.php",
    "chars": 13822,
    "preview": "<?php\n\n\n/**\n* Name:         Workflows\n* Description:  This PHP class object provides several useful functions for retrie"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the willfarrell/alfred-caniuse-workflow GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 8 files (145.3 KB), approximately 40.0k tokens, and a symbol index with 22 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!