prefixes.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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', {
  265. browsers: browsers,
  266. feature: 'font-feature'
  267. });
  268. });
  269. feature(require('caniuse-db/features-json/font-kerning.json'), function(browsers) {
  270. return prefix('font-kerning', {
  271. browsers: browsers,
  272. feature: 'font-kerning'
  273. });
  274. });
  275. feature(require('caniuse-db/features-json/border-image.json'), function(browsers) {
  276. return prefix('border-image', {
  277. browsers: browsers,
  278. feature: 'border-image'
  279. });
  280. });
  281. feature(require('caniuse-db/features-json/css-selection.json'), function(browsers) {
  282. return prefix('::selection', {
  283. selector: true,
  284. browsers: browsers,
  285. feature: 'css-selection'
  286. });
  287. });
  288. feature(require('caniuse-db/features-json/css-placeholder.json'), function(browsers) {
  289. browsers = browsers.map(function(i) {
  290. var name, ref, version;
  291. ref = i.split(' '), name = ref[0], version = ref[1];
  292. if (name === 'firefox' && parseFloat(version) <= 18) {
  293. return i + ' old';
  294. } else {
  295. return i;
  296. }
  297. });
  298. return prefix('::placeholder', {
  299. selector: true,
  300. browsers: browsers,
  301. feature: 'css-placeholder'
  302. });
  303. });
  304. feature(require('caniuse-db/features-json/css-hyphens.json'), function(browsers) {
  305. return prefix('hyphens', {
  306. browsers: browsers,
  307. feature: 'css-hyphens'
  308. });
  309. });
  310. fullscreen = require('caniuse-db/features-json/fullscreen.json');
  311. feature(fullscreen, function(browsers) {
  312. return prefix(':fullscreen', {
  313. selector: true,
  314. browsers: browsers,
  315. feature: 'fullscreen'
  316. });
  317. });
  318. feature(fullscreen, {
  319. match: /x(\s#2|$)/
  320. }, function(browsers) {
  321. return prefix('::backdrop', {
  322. selector: true,
  323. browsers: browsers,
  324. feature: 'fullscreen'
  325. });
  326. });
  327. feature(require('caniuse-db/features-json/css3-tabsize.json'), function(browsers) {
  328. return prefix('tab-size', {
  329. browsers: browsers,
  330. feature: 'css3-tabsize'
  331. });
  332. });
  333. feature(require('caniuse-db/features-json/intrinsic-width.json'), function(browsers) {
  334. return prefix('max-content', 'min-content', 'fit-content', 'fill', 'fill-available', 'stretch', {
  335. 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'],
  336. browsers: browsers,
  337. feature: 'intrinsic-width'
  338. });
  339. });
  340. cursorsNewer = require('caniuse-db/features-json/css3-cursors-newer.json');
  341. feature(cursorsNewer, function(browsers) {
  342. return prefix('zoom-in', 'zoom-out', {
  343. props: ['cursor'],
  344. browsers: browsers,
  345. feature: 'css3-cursors-newer'
  346. });
  347. });
  348. cursorsGrab = require('caniuse-db/features-json/css3-cursors-grab.json');
  349. feature(cursorsGrab, function(browsers) {
  350. return prefix('grab', 'grabbing', {
  351. props: ['cursor'],
  352. browsers: browsers,
  353. feature: 'css3-cursors-grab'
  354. });
  355. });
  356. feature(require('caniuse-db/features-json/css-sticky.json'), function(browsers) {
  357. return prefix('sticky', {
  358. props: ['position'],
  359. browsers: browsers,
  360. feature: 'css-sticky'
  361. });
  362. });
  363. feature(require('caniuse-db/features-json/pointer.json'), function(browsers) {
  364. return prefix('touch-action', {
  365. browsers: browsers,
  366. feature: 'pointer'
  367. });
  368. });
  369. decoration = require('caniuse-db/features-json/text-decoration.json');
  370. feature(decoration, function(browsers) {
  371. return prefix('text-decoration-style', 'text-decoration-color', 'text-decoration-line', {
  372. browsers: browsers,
  373. feature: 'text-decoration'
  374. });
  375. });
  376. feature(decoration, {
  377. match: /x.*#[23]/
  378. }, function(browsers) {
  379. return prefix('text-decoration-skip', {
  380. browsers: browsers,
  381. feature: 'text-decoration'
  382. });
  383. });
  384. textSizeAdjust = require('caniuse-db/features-json/text-size-adjust.json');
  385. feature(textSizeAdjust, function(browsers) {
  386. return prefix('text-size-adjust', {
  387. browsers: browsers,
  388. feature: 'text-size-adjust'
  389. });
  390. });
  391. feature(require('caniuse-db/features-json/css-masks.json'), function(browsers) {
  392. prefix('mask-clip', 'mask-composite', 'mask-image', 'mask-origin', 'mask-repeat', 'mask-border-repeat', 'mask-border-source', {
  393. browsers: browsers,
  394. feature: 'css-masks'
  395. });
  396. return prefix('mask', 'mask-position', 'mask-size', 'mask-border', 'mask-border-outset', 'mask-border-width', 'mask-border-slice', {
  397. browsers: browsers,
  398. feature: 'css-masks'
  399. });
  400. });
  401. feature(require('caniuse-db/features-json/css-clip-path.json'), function(browsers) {
  402. return prefix('clip-path', {
  403. browsers: browsers,
  404. feature: 'css-clip-path'
  405. });
  406. });
  407. boxdecorbreak = require('caniuse-db/features-json/css-boxdecorationbreak.json');
  408. feature(boxdecorbreak, function(browsers) {
  409. return prefix('box-decoration-break', {
  410. browsers: browsers,
  411. feature: 'css-boxdecorationbreak'
  412. });
  413. });
  414. feature(require('caniuse-db/features-json/object-fit.json'), function(browsers) {
  415. return prefix('object-fit', 'object-position', {
  416. browsers: browsers,
  417. feature: 'object-fit'
  418. });
  419. });
  420. feature(require('caniuse-db/features-json/css-shapes.json'), function(browsers) {
  421. return prefix('shape-margin', 'shape-outside', 'shape-image-threshold', {
  422. browsers: browsers,
  423. feature: 'css-shapes'
  424. });
  425. });
  426. feature(require('caniuse-db/features-json/text-overflow.json'), function(browsers) {
  427. return prefix('text-overflow', {
  428. browsers: browsers,
  429. feature: 'text-overflow'
  430. });
  431. });
  432. devdaptation = require('caniuse-db/features-json/css-deviceadaptation.json');
  433. feature(devdaptation, function(browsers) {
  434. return prefix('@viewport', {
  435. browsers: browsers,
  436. feature: 'css-deviceadaptation'
  437. });
  438. });
  439. resolution = require('caniuse-db/features-json/css-media-resolution.json');
  440. feature(resolution, {
  441. match: /( x($| )|a #3)/
  442. }, function(browsers) {
  443. return prefix('@resolution', {
  444. browsers: browsers,
  445. feature: 'css-media-resolution'
  446. });
  447. });
  448. textAlignLast = require('caniuse-db/features-json/css-text-align-last.json');
  449. feature(textAlignLast, function(browsers) {
  450. return prefix('text-align-last', {
  451. browsers: browsers,
  452. feature: 'css-text-align-last'
  453. });
  454. });
  455. crispedges = require('caniuse-db/features-json/css-crisp-edges.json');
  456. feature(crispedges, {
  457. match: /y x|a x #1/
  458. }, function(browsers) {
  459. return prefix('pixelated', {
  460. props: ['image-rendering'],
  461. browsers: browsers,
  462. feature: 'css-crisp-edges'
  463. });
  464. });
  465. feature(crispedges, {
  466. match: /a x #2/
  467. }, function(browsers) {
  468. return prefix('image-rendering', {
  469. browsers: browsers,
  470. feature: 'css-crisp-edges'
  471. });
  472. });
  473. logicalProps = require('caniuse-db/features-json/css-logical-props.json');
  474. feature(logicalProps, function(browsers) {
  475. return prefix('border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end', {
  476. browsers: browsers,
  477. feature: 'css-logical-props'
  478. });
  479. });
  480. feature(logicalProps, {
  481. match: /x\s#2/
  482. }, function(browsers) {
  483. return prefix('border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end', {
  484. browsers: browsers,
  485. feature: 'css-logical-props'
  486. });
  487. });
  488. feature(require('caniuse-db/features-json/css-appearance.json'), function(browsers) {
  489. return prefix('appearance', {
  490. browsers: browsers,
  491. feature: 'css-appearance'
  492. });
  493. });
  494. feature(require('caniuse-db/features-json/css-snappoints.json'), function(browsers) {
  495. return prefix('scroll-snap-type', 'scroll-snap-coordinate', 'scroll-snap-destination', 'scroll-snap-points-x', 'scroll-snap-points-y', {
  496. browsers: browsers,
  497. feature: 'css-snappoints'
  498. });
  499. });
  500. feature(require('caniuse-db/features-json/css-regions.json'), function(browsers) {
  501. return prefix('flow-into', 'flow-from', 'region-fragment', {
  502. browsers: browsers,
  503. feature: 'css-regions'
  504. });
  505. });
  506. feature(require('caniuse-db/features-json/css-image-set.json'), function(browsers) {
  507. return prefix('image-set', {
  508. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  509. browsers: browsers,
  510. feature: 'css-image-set'
  511. });
  512. });
  513. writingMode = require('caniuse-db/features-json/css-writing-mode.json');
  514. feature(writingMode, {
  515. match: /a|x/
  516. }, function(browsers) {
  517. return prefix('writing-mode', {
  518. browsers: browsers,
  519. feature: 'css-writing-mode'
  520. });
  521. });
  522. feature(require('caniuse-db/features-json/css-cross-fade.json'), function(browsers) {
  523. return prefix('cross-fade', {
  524. props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'],
  525. browsers: browsers,
  526. feature: 'css-cross-fade'
  527. });
  528. });
  529. readOnly = require('caniuse-db/features-json/css-read-only-write.json');
  530. feature(readOnly, function(browsers) {
  531. return prefix(':read-only', ':read-write', {
  532. selector: true,
  533. browsers: browsers,
  534. feature: 'css-read-only-write'
  535. });
  536. });
  537. feature(require('caniuse-db/features-json/text-emphasis.json'), function(browsers) {
  538. return prefix('text-emphasis', 'text-emphasis-position', 'text-emphasis-style', 'text-emphasis-color', {
  539. browsers: browsers,
  540. feature: 'text-emphasis'
  541. });
  542. });
  543. grid = require('caniuse-db/features-json/css-grid.json');
  544. feature(grid, function(browsers) {
  545. prefix('display-grid', 'inline-grid', {
  546. props: ['display'],
  547. browsers: browsers,
  548. feature: 'css-grid'
  549. });
  550. return prefix('grid-template-columns', 'grid-template-rows', 'grid-row-start', 'grid-column-start', 'grid-row-end', 'grid-column-end', 'grid-row', 'grid-column', {
  551. browsers: browsers,
  552. feature: 'css-grid'
  553. });
  554. });
  555. feature(grid, {
  556. match: /a x/
  557. }, function(browsers) {
  558. return prefix('justify-items', 'grid-row-align', {
  559. browsers: browsers,
  560. feature: 'css-grid'
  561. });
  562. });
  563. textSpacing = require('caniuse-db/features-json/css-text-spacing.json');
  564. feature(textSpacing, function(browsers) {
  565. return prefix('text-spacing', {
  566. browsers: browsers,
  567. feature: 'css-text-spacing'
  568. });
  569. });
  570. feature(require('caniuse-db/features-json/css-any-link.json'), function(browsers) {
  571. return prefix(':any-link', {
  572. selector: true,
  573. browsers: browsers,
  574. feature: 'css-any-link'
  575. });
  576. });
  577. }).call(this);