UI for Zipcoin Blue

prefixes.js 21KB

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