summaryrefslogtreecommitdiff
path: root/node_modules/postcss-unnth/index.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-30 16:45:38 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-30 16:45:38 +0800
commita0579f91bbdf0de62b59df381d97a008bb98df57 (patch)
tree69c21333750c7bc7358f9383560438048d9adebf /node_modules/postcss-unnth/index.js
parent2d8aeba452672bcda2096e5d76bf37131c34075e (diff)
update/upgrade
Diffstat (limited to 'node_modules/postcss-unnth/index.js')
-rw-r--r--node_modules/postcss-unnth/index.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/node_modules/postcss-unnth/index.js b/node_modules/postcss-unnth/index.js
new file mode 100644
index 00000000..a85788c7
--- /dev/null
+++ b/node_modules/postcss-unnth/index.js
@@ -0,0 +1,72 @@
+var postcss = require('postcss');
+var parser = require('postcss-selector-parser');
+
+module.exports = postcss.plugin('postcss-unnth', function () {
+ return function (css) {
+ css.walkRules(function (rule) {
+ if (rule.selector.indexOf(':nth-child') > -1) {
+ rule.selector = parser(function (selectors) {
+ selectors.each(function (selector) {
+ selector.eachPseudo(function (pseudo) {
+ if (pseudo.value === ':nth-child') {
+ var siblings = [];
+ var firstChild = parser.pseudo({ value: ':first-child' });
+
+ // get sibling selectors
+ pseudo.parent.nodes.some(function (sibling) {
+ if (sibling === pseudo) return true;
+
+ siblings.push(sibling);
+
+ if (sibling.type === 'combinator') {
+ siblings = [];
+ }
+ });
+
+ // add sibling fallbacks
+ String(pseudo.nodes).replace('even', '2n').replace('odd', '2n+1').replace(/^([-+]?\d*)(n?)([-+]?\d+)?$/, function ($0, $1, $2, $3) {
+ if ($1 && !$2 && !$3) {
+ $3 = $1;
+ $2 = 'n';
+ $1 = '0';
+ }
+
+ $1 = parseFloat($1) || 0;
+ $3 = parseFloat($3) || 0;
+
+ if ($3 > 1) {
+ // move sibling selectors after :nth-child
+ siblings.forEach(function (sibling) {
+ sibling.removeSelf();
+
+ pseudo.parent.insertAfter(pseudo, sibling);
+ });
+
+ // add immediate fallback
+ pseudo.parent.insertBefore(pseudo, firstChild);
+ pseudo.parent.insertBefore(pseudo, parser.combinator({ value: ' + ' }));
+
+ while (--$3 > 1) {
+ pseudo.parent.insertBefore(pseudo, parser.tag({ value: '*' }));
+ pseudo.parent.insertBefore(pseudo, parser.combinator({ value: ' + ' }));
+ }
+
+ // add selector fallback
+ if (!siblings.length) {
+ pseudo.parent.insertBefore(pseudo, parser.tag({ value: '*' }));
+ }
+ } else {
+ pseudo.parent.insertAfter(pseudo, firstChild);
+ }
+ });
+
+ // remove original
+ pseudo.removeSelf();
+ }
+ });
+ });
+ }).process(rule.selector).result.toString();
+ }
+ });
+ };
+});