summaryrefslogtreecommitdiff
path: root/node_modules/autoprefixer/lib/resolution.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/autoprefixer/lib/resolution.js')
-rw-r--r--node_modules/autoprefixer/lib/resolution.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/autoprefixer/lib/resolution.js b/node_modules/autoprefixer/lib/resolution.js
new file mode 100644
index 0000000..4b71564
--- /dev/null
+++ b/node_modules/autoprefixer/lib/resolution.js
@@ -0,0 +1,97 @@
+let FractionJs = require('fraction.js')
+
+let Prefixer = require('./prefixer')
+let utils = require('./utils')
+
+const REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/gi
+const SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i
+
+class Resolution extends Prefixer {
+ /**
+ * Remove prefixed queries
+ */
+ clean(rule) {
+ if (!this.bad) {
+ this.bad = []
+ for (let prefix of this.prefixes) {
+ this.bad.push(this.prefixName(prefix, 'min'))
+ this.bad.push(this.prefixName(prefix, 'max'))
+ }
+ }
+
+ rule.params = utils.editList(rule.params, queries => {
+ return queries.filter(query => this.bad.every(i => !query.includes(i)))
+ })
+ }
+
+ /**
+ * Return prefixed query name
+ */
+ prefixName(prefix, name) {
+ if (prefix === '-moz-') {
+ return name + '--moz-device-pixel-ratio'
+ } else {
+ return prefix + name + '-device-pixel-ratio'
+ }
+ }
+
+ /**
+ * Return prefixed query
+ */
+ prefixQuery(prefix, name, colon, value, units) {
+ value = new FractionJs(value)
+
+ // 1dpcm = 2.54dpi
+ // 1dppx = 96dpi
+ if (units === 'dpi') {
+ value = value.div(96)
+ } else if (units === 'dpcm') {
+ value = value.mul(2.54).div(96)
+ }
+ value = value.simplify()
+
+ if (prefix === '-o-') {
+ value = value.n + '/' + value.d
+ }
+ return this.prefixName(prefix, name) + colon + value
+ }
+
+ /**
+ * Add prefixed queries
+ */
+ process(rule) {
+ let parent = this.parentPrefix(rule)
+ let prefixes = parent ? [parent] : this.prefixes
+
+ rule.params = utils.editList(rule.params, (origin, prefixed) => {
+ for (let query of origin) {
+ if (
+ !query.includes('min-resolution') &&
+ !query.includes('max-resolution')
+ ) {
+ prefixed.push(query)
+ continue
+ }
+
+ for (let prefix of prefixes) {
+ let processed = query.replace(REGEXP, str => {
+ let parts = str.match(SPLIT)
+ return this.prefixQuery(
+ prefix,
+ parts[1],
+ parts[2],
+ parts[3],
+ parts[4]
+ )
+ })
+ prefixed.push(processed)
+ }
+ prefixed.push(query)
+ }
+
+ return utils.uniq(prefixed)
+ })
+ }
+}
+
+module.exports = Resolution