prefixes.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. (function() {
  2. var add, backdropFilter, bckgrndImgOpts, boxdecorbreak, crispedges, cursorsGrab, cursorsNewer, decoration, devdaptation, elementFunction, feature, filterFunction, flexbox, fullscreen, gradients, grid, logicalProps, prefix, readOnly, resolution, result, sort, textAlignLast, textSizeAdjust, textSpacing, transforms3d, userSelectNone, writingMode,
  3. slice = [].slice;
  4. sort = function(array) {
  5. return array.sort(function(a, b) {
  6. var d;
  7. a = a.split(' ');
  8. b = b.split(' ');
  9. if (a[0] > b[0]) {
  10. return 1;
  11. } else if (a[0] < b[0]) {
  12. return -1;
  13. } else {
  14. d = parseFloat(a[1]) - parseFloat(b[1]);
  15. if (d > 0) {
  16. return 1;
  17. } else if (d < 0) {
  18. return -1;
  19. } else {
  20. return 0;
  21. }
  22. }
  23. });
  24. };
  25. feature = function(data, opts, callback) {
  26. var browser, match, need, ref, ref1, support, version, versions;
  27. if (!callback) {
  28. ref = [opts, {}], callback = ref[0], opts = ref[1];
  29. }
  30. match = opts.match || /\sx($|\s)/;
  31. need = [];
  32. ref1 = data.stats;
  33. for (browser in ref1) {
  34. versions = ref1[browser];
  35. for (version in versions) {
  36. support = versions[version];
  37. if (support.match(match)) {
  38. need.push(browser + ' ' + version);
  39. }
  40. }
  41. }
  42. return callback(sort(need));
  43. };
  44. result = {};
  45. prefix = function() {
  46. var data, i, j, k, len, name, names, results;
  47. names = 2 <= arguments.length ? slice.call(arguments, 0, j = arguments.length - 1) : (j = 0, []), data = arguments[j++];
  48. results = [];
  49. for (k = 0, len = names.length; k < len; k++) {
  50. name = names[k];
  51. result[name] = {};
  52. results.push((function() {
  53. var results1;
  54. results1 = [];
  55. for (i in data) {
  56. results1.push(result[name][i] = data[i]);
  57. }
  58. return results1;
  59. })());
  60. }
  61. return results;
  62. };
  63. add = function() {
  64. var data, j, k, len, name, names, results;
  65. names = 2 <= arguments.length ? slice.call(arguments, 0, j = arguments.length - 1) : (j = 0, []), data = arguments[j++];
  66. results = [];
  67. for (k = 0, len = names.length; k < len; k++) {
  68. name = names[k];
  69. results.push(result[name].browsers = sort(result[name].browsers.concat(data.browsers)));
  70. }
  71. return results;
  72. };
  73. module.exports = result;
  74. feature(require('caniuse-db/features-json/border-radius.json'), function(browsers) {
  75. return prefix('border-radius', 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius', {
  76. mistakes: ['-khtml-', '-ms-', '-o-'],
  77. browsers: browsers,
  78. feature: 'border-radius'
  79. });
  80. });
  81. feature(require('caniuse-db/features-json/css-boxshadow.json'), function(browsers) {
  82. return prefix('box-shadow', {
  83. mistakes: ['-khtml-'],
  84. browsers: browsers,
  85. feature: 'css-boxshadow'
  86. });
  87. });
  88. feature(require('caniuse-db/features-json/css-animation.json'), function(browsers) {
  89. return prefix('animation', 'animation-name', 'animation-duration', 'animation-delay', 'animation-direction', 'animation-fill-mode', 'animation-iteration-count', 'animation-play-state', 'animation-timing-function', '@keyframes', {
  90. mistakes: ['-khtml-', '-ms-'],
  91. browsers: browsers,
  92. feature: 'css-animation'
  93. });
  94. });
  95. feature(require('caniuse-db/features-json/css-transitions.json'), function(browsers) {
  96. return prefix('transition', 'transition-property', 'transition-duration', 'transition-delay', 'transition-timing-function', {
  97. mistakes: ['-khtml-', '-ms-'],
  98. browsers: browsers,
  99. feature: 'css-transitions'
  100. });
  101. });
  102. feature(require('caniuse-db/features-json/transforms2d.json'), function(browsers) {
  103. return prefix('transform', 'transform-origin', {
  104. browsers: browsers,
  105. feature: 'transforms2d'
  106. });
  107. });
  108. transforms3d = require('caniuse-db/features-json/transforms3d.json');
  109. feature(transforms3d, function(browsers) {
  110. prefix('perspective', 'perspective-origin', {
  111. browsers: browsers,
  112. feature: 'transforms3d'
  113. });
  114. return prefix('transform-style', {
  115. mistakes: ['-ms-', '-o-'],
  116. browsers: browsers,
  117. feature: 'transforms3d'
  118. });
  119. });
  120. feature(transforms3d, {
  121. match: /y\sx|y\s#2/
  122. }, function(browsers) {
  123. return prefix('backface-visibility', {
  124. mistakes: ['-ms-', '-o-'],
  125. browsers: browsers,
  126. feature: 'transforms3d'
  127. });
  128. });
  129. gradients = require('caniuse-db/features-json/css-gradients.json');
  130. feature(gradients, {
  131. match: /y\sx/
  132. }, function(browsers) {
  133. return prefix('linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient', {
  134. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  135. mistakes: ['-ms-'],
  136. browsers: browsers,
  137. feature: 'css-gradients'
  138. });
  139. });
  140. feature(gradients, {
  141. match: /a\sx/
  142. }, function(browsers) {
  143. browsers = browsers.map(function(i) {
  144. if (/op/.test(i)) {
  145. return i;
  146. } else {
  147. return i + " old";
  148. }
  149. });
  150. return add('linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient', {
  151. browsers: browsers,
  152. feature: 'css-gradients'
  153. });
  154. });
  155. feature(require('caniuse-db/features-json/css3-boxsizing.json'), function(browsers) {
  156. return prefix('box-sizing', {
  157. browsers: browsers,
  158. feature: 'css3-boxsizing'
  159. });
  160. });
  161. feature(require('caniuse-db/features-json/css-filters.json'), function(browsers) {
  162. return prefix('filter', {
  163. browsers: browsers,
  164. feature: 'css-filters'
  165. });
  166. });
  167. filterFunction = require('caniuse-db/features-json/css-filter-function.json');
  168. feature(filterFunction, function(browsers) {
  169. return prefix('filter-function', {
  170. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  171. browsers: browsers,
  172. feature: 'css-filter-function'
  173. });
  174. });
  175. backdropFilter = require('caniuse-db/features-json/css-backdrop-filter.json');
  176. feature(backdropFilter, function(browsers) {
  177. return prefix('backdrop-filter', {
  178. browsers: browsers,
  179. feature: 'css-backdrop-filter'
  180. });
  181. });
  182. elementFunction = require('caniuse-db/features-json/css-element-function.json');
  183. feature(elementFunction, function(browsers) {
  184. return prefix('element', {
  185. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  186. browsers: browsers,
  187. feature: 'css-element-function'
  188. });
  189. });
  190. feature(require('caniuse-db/features-json/multicolumn.json'), function(browsers) {
  191. prefix('columns', 'column-width', 'column-gap', 'column-rule', 'column-rule-color', 'column-rule-width', {
  192. browsers: browsers,
  193. feature: 'multicolumn'
  194. });
  195. return prefix('column-count', 'column-rule-style', 'column-span', 'column-fill', 'break-before', 'break-after', 'break-inside', {
  196. browsers: browsers,
  197. feature: 'multicolumn'
  198. });
  199. });
  200. userSelectNone = require('caniuse-db/features-json/user-select-none.json');
  201. feature(userSelectNone, function(browsers) {
  202. return prefix('user-select', {
  203. mistakes: ['-khtml-'],
  204. browsers: browsers,
  205. feature: 'user-select-none'
  206. });
  207. });
  208. flexbox = require('caniuse-db/features-json/flexbox.json');
  209. feature(flexbox, {
  210. match: /a\sx/
  211. }, function(browsers) {
  212. browsers = browsers.map(function(i) {
  213. if (/ie|firefox/.test(i)) {
  214. return i;
  215. } else {
  216. return i + " 2009";
  217. }
  218. });
  219. prefix('display-flex', 'inline-flex', {
  220. props: ['display'],
  221. browsers: browsers,
  222. feature: 'flexbox'
  223. });
  224. prefix('flex', 'flex-grow', 'flex-shrink', 'flex-basis', {
  225. browsers: browsers,
  226. feature: 'flexbox'
  227. });
  228. return prefix('flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content', {
  229. browsers: browsers,
  230. feature: 'flexbox'
  231. });
  232. });
  233. feature(flexbox, {
  234. match: /y\sx/
  235. }, function(browsers) {
  236. add('display-flex', 'inline-flex', {
  237. browsers: browsers,
  238. feature: 'flexbox'
  239. });
  240. add('flex', 'flex-grow', 'flex-shrink', 'flex-basis', {
  241. browsers: browsers,
  242. feature: 'flexbox'
  243. });
  244. return add('flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content', {
  245. browsers: browsers,
  246. feature: 'flexbox'
  247. });
  248. });
  249. feature(require('caniuse-db/features-json/calc.json'), function(browsers) {
  250. return prefix('calc', {
  251. props: ['*'],
  252. browsers: browsers,
  253. feature: 'calc'
  254. });
  255. });
  256. bckgrndImgOpts = require('caniuse-db/features-json/background-img-opts.json');
  257. feature(bckgrndImgOpts, function(browsers) {
  258. return prefix('background-clip', 'background-origin', 'background-size', {
  259. browsers: browsers,
  260. feature: 'background-img-opts'
  261. });
  262. });
  263. feature(require('caniuse-db/features-json/font-feature.json'), function(browsers) {
  264. return prefix('font-feature-settings', 'font-variant-ligatures', 'font-language-override', 'font-kerning', {
  265. browsers: browsers,
  266. feature: 'font-feature'
  267. });
  268. });
  269. feature(require('caniuse-db/features-json/border-image.json'), function(browsers) {
  270. return prefix('border-image', {
  271. browsers: browsers,
  272. feature: 'border-image'
  273. });
  274. });
  275. feature(require('caniuse-db/features-json/css-selection.json'), function(browsers) {
  276. return prefix('::selection', {
  277. selector: true,
  278. browsers: browsers,
  279. feature: 'css-selection'
  280. });
  281. });
  282. feature(require('caniuse-db/features-json/css-placeholder.json'), function(browsers) {
  283. browsers = browsers.map(function(i) {
  284. var name, ref, version;
  285. ref = i.split(' '), name = ref[0], version = ref[1];
  286. if (name === 'firefox' && parseFloat(version) <= 18) {
  287. return i + ' old';
  288. } else {
  289. return i;
  290. }
  291. });
  292. return prefix('::placeholder', {
  293. selector: true,
  294. browsers: browsers,
  295. feature: 'css-placeholder'
  296. });
  297. });
  298. feature(require('caniuse-db/features-json/css-hyphens.json'), function(browsers) {
  299. return prefix('hyphens', {
  300. browsers: browsers,
  301. feature: 'css-hyphens'
  302. });
  303. });
  304. fullscreen = require('caniuse-db/features-json/fullscreen.json');
  305. feature(fullscreen, function(browsers) {
  306. return prefix(':fullscreen', {
  307. selector: true,
  308. browsers: browsers,
  309. feature: 'fullscreen'
  310. });
  311. });
  312. feature(fullscreen, {
  313. match: /x(\s#2|$)/
  314. }, function(browsers) {
  315. return prefix('::backdrop', {
  316. selector: true,
  317. browsers: browsers,
  318. feature: 'fullscreen'
  319. });
  320. });
  321. feature(require('caniuse-db/features-json/css3-tabsize.json'), function(browsers) {
  322. return prefix('tab-size', {
  323. browsers: browsers,
  324. feature: 'css3-tabsize'
  325. });
  326. });
  327. feature(require('caniuse-db/features-json/intrinsic-width.json'), function(browsers) {
  328. return prefix('max-content', 'min-content', 'fit-content', 'fill', 'fill-available', {
  329. props: ['width', 'min-width', 'max-width', 'height', 'min-height', 'max-height', 'inline-size', 'min-inline-size', 'max-inline-size', 'block-size', 'min-block-size', 'max-block-size'],
  330. browsers: browsers,
  331. feature: 'intrinsic-width'
  332. });
  333. });
  334. cursorsNewer = require('caniuse-db/features-json/css3-cursors-newer.json');
  335. feature(cursorsNewer, function(browsers) {
  336. return prefix('zoom-in', 'zoom-out', {
  337. props: ['cursor'],
  338. browsers: browsers,
  339. feature: 'css3-cursors-newer'
  340. });
  341. });
  342. cursorsGrab = require('caniuse-db/features-json/css3-cursors-grab.json');
  343. feature(cursorsGrab, function(browsers) {
  344. return prefix('grab', 'grabbing', {
  345. props: ['cursor'],
  346. browsers: browsers,
  347. feature: 'css3-cursors-grab'
  348. });
  349. });
  350. feature(require('caniuse-db/features-json/css-sticky.json'), function(browsers) {
  351. return prefix('sticky', {
  352. props: ['position'],
  353. browsers: browsers,
  354. feature: 'css-sticky'
  355. });
  356. });
  357. feature(require('caniuse-db/features-json/pointer.json'), function(browsers) {
  358. return prefix('touch-action', {
  359. browsers: browsers,
  360. feature: 'pointer'
  361. });
  362. });
  363. decoration = require('caniuse-db/features-json/text-decoration.json');
  364. feature(decoration, function(browsers) {
  365. return prefix('text-decoration-style', 'text-decoration-color', 'text-decoration-line', {
  366. browsers: browsers,
  367. feature: 'text-decoration'
  368. });
  369. });
  370. feature(decoration, {
  371. match: /x.*#3/
  372. }, function(browsers) {
  373. return prefix('text-decoration-skip', {
  374. browsers: browsers,
  375. feature: 'text-decoration'
  376. });
  377. });
  378. textSizeAdjust = require('caniuse-db/features-json/text-size-adjust.json');
  379. feature(textSizeAdjust, function(browsers) {
  380. return prefix('text-size-adjust', {
  381. browsers: browsers,
  382. feature: 'text-size-adjust'
  383. });
  384. });
  385. feature(require('caniuse-db/features-json/css-masks.json'), function(browsers) {
  386. prefix('mask-clip', 'mask-composite', 'mask-image', 'mask-origin', 'mask-repeat', 'mask-border-repeat', 'mask-border-source', {
  387. browsers: browsers,
  388. feature: 'css-masks'
  389. });
  390. return prefix('clip-path', 'mask', 'mask-position', 'mask-size', 'mask-border', 'mask-border-outset', 'mask-border-width', 'mask-border-slice', {
  391. browsers: browsers,
  392. feature: 'css-masks'
  393. });
  394. });
  395. boxdecorbreak = require('caniuse-db/features-json/css-boxdecorationbreak.json');
  396. feature(boxdecorbreak, function(browsers) {
  397. return prefix('box-decoration-break', {
  398. browsers: browsers,
  399. feature: 'css-boxdecorationbreak'
  400. });
  401. });
  402. feature(require('caniuse-db/features-json/object-fit.json'), function(browsers) {
  403. return prefix('object-fit', 'object-position', {
  404. browsers: browsers,
  405. feature: 'object-fit'
  406. });
  407. });
  408. feature(require('caniuse-db/features-json/css-shapes.json'), function(browsers) {
  409. return prefix('shape-margin', 'shape-outside', 'shape-image-threshold', {
  410. browsers: browsers,
  411. feature: 'css-shapes'
  412. });
  413. });
  414. feature(require('caniuse-db/features-json/text-overflow.json'), function(browsers) {
  415. return prefix('text-overflow', {
  416. browsers: browsers,
  417. feature: 'text-overflow'
  418. });
  419. });
  420. devdaptation = require('caniuse-db/features-json/css-deviceadaptation.json');
  421. feature(devdaptation, function(browsers) {
  422. return prefix('@viewport', {
  423. browsers: browsers,
  424. feature: 'css-deviceadaptation'
  425. });
  426. });
  427. resolution = require('caniuse-db/features-json/css-media-resolution.json');
  428. feature(resolution, {
  429. match: /( x($| )|a #3)/
  430. }, function(browsers) {
  431. return prefix('@resolution', {
  432. browsers: browsers,
  433. feature: 'css-media-resolution'
  434. });
  435. });
  436. textAlignLast = require('caniuse-db/features-json/css-text-align-last.json');
  437. feature(textAlignLast, function(browsers) {
  438. return prefix('text-align-last', {
  439. browsers: browsers,
  440. feature: 'css-text-align-last'
  441. });
  442. });
  443. crispedges = require('caniuse-db/features-json/css-crisp-edges.json');
  444. feature(crispedges, {
  445. match: /y x|a x #1/
  446. }, function(browsers) {
  447. return prefix('pixelated', {
  448. props: ['image-rendering'],
  449. browsers: browsers,
  450. feature: 'css-crisp-edges'
  451. });
  452. });
  453. feature(crispedges, {
  454. match: /a x #2/
  455. }, function(browsers) {
  456. return prefix('image-rendering', {
  457. browsers: browsers,
  458. feature: 'css-crisp-edges'
  459. });
  460. });
  461. logicalProps = require('caniuse-db/features-json/css-logical-props.json');
  462. feature(logicalProps, function(browsers) {
  463. return prefix('border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end', {
  464. browsers: browsers,
  465. feature: 'css-logical-props'
  466. });
  467. });
  468. feature(logicalProps, {
  469. match: /x\s#2/
  470. }, function(browsers) {
  471. return prefix('border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end', {
  472. browsers: browsers,
  473. feature: 'css-logical-props'
  474. });
  475. });
  476. feature(require('caniuse-db/features-json/css-appearance.json'), function(browsers) {
  477. return prefix('appearance', {
  478. browsers: browsers,
  479. feature: 'css-appearance'
  480. });
  481. });
  482. feature(require('caniuse-db/features-json/css-snappoints.json'), function(browsers) {
  483. return prefix('scroll-snap-type', 'scroll-snap-coordinate', 'scroll-snap-destination', 'scroll-snap-points-x', 'scroll-snap-points-y', {
  484. browsers: browsers,
  485. feature: 'css-snappoints'
  486. });
  487. });
  488. feature(require('caniuse-db/features-json/css-regions.json'), function(browsers) {
  489. return prefix('flow-into', 'flow-from', 'region-fragment', {
  490. browsers: browsers,
  491. feature: 'css-regions'
  492. });
  493. });
  494. feature(require('caniuse-db/features-json/css-image-set.json'), function(browsers) {
  495. return prefix('image-set', {
  496. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  497. browsers: browsers,
  498. feature: 'css-image-set'
  499. });
  500. });
  501. writingMode = require('caniuse-db/features-json/css-writing-mode.json');
  502. feature(writingMode, {
  503. match: /a|x/
  504. }, function(browsers) {
  505. return prefix('writing-mode', {
  506. browsers: browsers,
  507. feature: 'css-writing-mode'
  508. });
  509. });
  510. feature(require('caniuse-db/features-json/css-cross-fade.json'), function(browsers) {
  511. return prefix('cross-fade', {
  512. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  513. browsers: browsers,
  514. feature: 'css-cross-fade'
  515. });
  516. });
  517. readOnly = require('caniuse-db/features-json/css-read-only-write.json');
  518. feature(readOnly, function(browsers) {
  519. return prefix(':read-only', ':read-write', {
  520. selector: true,
  521. browsers: browsers,
  522. feature: 'css-read-only-write'
  523. });
  524. });
  525. feature(require('caniuse-db/features-json/text-emphasis.json'), function(browsers) {
  526. return prefix('text-emphasis', 'text-emphasis-position', 'text-emphasis-style', 'text-emphasis-color', {
  527. browsers: browsers,
  528. feature: 'text-emphasis'
  529. });
  530. });
  531. grid = require('caniuse-db/features-json/css-grid.json');
  532. feature(grid, function(browsers) {
  533. prefix('display-grid', 'inline-grid', {
  534. props: ['display'],
  535. browsers: browsers,
  536. feature: 'css-grid'
  537. });
  538. return prefix('grid-template-columns', 'grid-template-rows', 'grid-row-start', 'grid-column-start', 'grid-row-end', 'grid-column-end', 'grid-row', 'grid-column', {
  539. browsers: browsers,
  540. feature: 'css-grid'
  541. });
  542. });
  543. feature(grid, {
  544. match: /a x/
  545. }, function(browsers) {
  546. return prefix('justify-items', 'grid-row-align', {
  547. browsers: browsers,
  548. feature: 'css-grid'
  549. });
  550. });
  551. textSpacing = require('caniuse-db/features-json/css-text-spacing.json');
  552. feature(textSpacing, function(browsers) {
  553. return prefix('text-spacing', {
  554. browsers: browsers,
  555. feature: 'css-text-spacing'
  556. });
  557. });
  558. feature(require('caniuse-db/features-json/css-any-link.json'), function(browsers) {
  559. return prefix(':any-link', {
  560. selector: true,
  561. browsers: browsers,
  562. feature: 'css-any-link'
  563. });
  564. });
  565. }).call(this);