prefixes.js 20 KB

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