prefixes.js 20 KB

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