@csstools/postcss-gradients-interpolation-method 4.0.10 → 4.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changes to PostCSS Gradients Interpolation Method
2
2
 
3
+ ### 4.0.11
4
+
5
+ _February 26, 2024_
6
+
7
+ - Improve the regex for gradient function detection
8
+
3
9
  ### 4.0.10
4
10
 
5
11
  _February 19, 2024_
@@ -17,14 +23,4 @@ _December 31, 2023_
17
23
  - Updated [`@csstools/css-parser-algorithms`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms) to [`2.5.0`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms/CHANGELOG.md#250) (minor)
18
24
  - Updated [`@csstools/css-color-parser`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser) to [`1.5.1`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser/CHANGELOG.md#151) (patch)
19
25
 
20
- ### 4.0.8
21
-
22
- _December 15, 2023_
23
-
24
- - Skip transforms when a color value contains experimental syntax
25
- - Updated [`@csstools/css-tokenizer`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer) to [`2.2.2`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer/CHANGELOG.md#222) (patch)
26
- - Updated [`@csstools/css-parser-algorithms`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms) to [`2.4.0`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms/CHANGELOG.md#240) (minor)
27
- - Updated [`@csstools/postcss-progressive-custom-properties`](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-progressive-custom-properties) to [`3.0.3`](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-progressive-custom-properties/CHANGELOG.md#303) (patch)
28
- - Updated [`@csstools/css-color-parser`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser) to [`1.5.0`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser/CHANGELOG.md#150) (minor)
29
-
30
26
  [Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-gradients-interpolation-method/CHANGELOG.md)
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("@csstools/postcss-progressive-custom-properties"),o=require("@csstools/utilities"),t=require("@csstools/css-parser-algorithms"),n=require("@csstools/css-tokenizer"),i=require("@csstools/css-color-parser");const s=/(repeating-)?(linear|radial|conic)-gradient\(.*?in/i,r=/^(repeating-)?(linear|radial|conic)-gradient$/i;function interpolateColorsInColorStopsList(e,o,s,r=!1){const a=[],l=[];for(let r=0;r<e.length-1;r++){const a=e[r],c=e[r+1];if(l.push(a),s||i.serializeP3(a.colorData,!1).toString()!==i.serializeP3(c.colorData,!1).toString()&&a.position.toString()!==c.position.toString())for(let e=1;e<=9;e++){const r=10*e;let p=[];s&&(p=[new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),s,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Ident,"hue",-1,-1,{value:"hue"}])]);const u=new t.FunctionNode([n.TokenType.Function,"color-mix(",-1,-1,{value:"color-mix"}],[n.TokenType.CloseParen,")",-1,-1,void 0],[new t.TokenNode([n.TokenType.Ident,"in",-1,-1,{value:"in"}]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),o,...p,new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),a.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Percentage,100-r+"%",-1,-1,{value:100-r}]),new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),c.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Percentage,`${r}%`,-1,-1,{value:r}])]),d=i.color(u);if(!d)return!1;l.push({colorData:d})}r===e.length-2&&l.push(c)}for(let e=0;e<l.length;e++)r&&!i.colorDataFitsRGB_Gamut(l[e].colorData)?l[e].color=i.serializeP3(l[e].colorData,!1):l[e].color=i.serializeRGB(l[e].colorData,!1);for(let e=0;e<l.length;e++){const o=l[e];o.position?a.push(o.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),o.position):a.push(o.color),e!==l.length-1&&a.push(new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]))}return a}function parseColorStops(e){const o=[];let s={};for(let r=0;r<e.length;r++){const a=e[r];if(t.isCommentNode(a)||t.isWhitespaceNode(a))continue;if(t.isTokenNode(a)&&a.value[0]===n.TokenType.Comma){if(s.color&&s.colorData&&s.positionA){o.push({color:s.color,colorData:s.colorData,position:s.positionA}),s.positionB&&o.push({color:s.color,colorData:s.colorData,position:s.positionB}),s={};continue}return!1}const l=i.color(a);if(l){if(s.color)return!1;if(l.syntaxFlags.has(i.SyntaxFlag.Experimental))return!1;s.color=a,s.colorData=l}else{if(!s.color)return!1;if(s.positionA){if(!s.positionA||s.positionB)return!1;s.positionB=a}else s.positionA=a}}return!(!s.color||!s.positionA)&&(s.color&&s.colorData&&s.positionA&&(o.push({color:s.color,colorData:s.colorData,position:s.positionA}),s.positionB&&o.push({color:s.color,colorData:s.colorData,position:s.positionB})),!(o.length<2)&&o)}const a=/^(srgb|srgb-linear|lab|oklab|xyz|xyz-d50|xyz-d65|hsl|hwb|lch|oklch)$/i,l=/^(hsl|hwb|lch|oklch)$/i,c=/^(shorter|longer|increasing|decreasing)$/i,p=/^in$/i,u=/^hue$/i;function modifyGradientFunctionComponentValues(e,o=!1){const i=e.getName();if(!r.test(i))return!1;let s="srgb",d=null,T=null,v=null,h=null,f=null,m=[];{let o=0,i=e.value[o];for(;i&&(!t.isTokenNode(i)||i.value[0]!==n.TokenType.Ident||!p.test(i.value[4].value));){if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Comma)return!1;o++,i=e.value[o]}for(d=i,o++,i=e.value[o];t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&a.test(i.value[4].value)){if(T)return!1;T=i,s=i.value[4].value,o++,i=e.value[o]}for(;t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&c.test(i.value[4].value)&&l.test(s)){if(v||!T)return!1;v=i,o++,i=e.value[o]}for(;t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&u.test(i.value[4].value)){if(h||!T||!v)return!1;h=i,o++,i=e.value[o]}for(;i&&(!t.isTokenNode(i)||i.value[0]!==n.TokenType.Comma);)o++,i=e.value[o];if(f=i,!f)return!1;m=e.value.slice(o+1)}if(!T)return!1;if(v&&!h)return!1;if(h&&!v)return!1;const k=parseColorStops(m);if(!k)return!1;const g=interpolateColorsInColorStopsList(k,T,v,o);if(!g)return!1;const N=trim([...e.value.slice(0,e.value.indexOf(d)),...e.value.slice(e.value.indexOf(h||T)+1,e.value.indexOf(f))]);return N.length>0&&N.some((e=>!t.isCommentNode(e)))&&N.push(new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]])),trim([...N,...trim(g)])}function trim(e){let o=0,n=e.length-1;for(let n=0;n<e.length;n++)if(!t.isWhitespaceNode(e[n])){o=n;break}for(let o=e.length-1;o>=0;o--)if(!t.isWhitespaceNode(e[o])){n=o;break}return e.slice(o,n+1)}const basePlugin=e=>({postcssPlugin:"postcss-gradients-interpolation-method",Declaration(i){if(!s.test(i.value))return;if(o.hasFallback(i))return;if(o.hasSupportsAtRuleAncestor(i,s))return;const r=n.tokenize({css:i.value}),a=t.stringify(t.replaceComponentValues(t.parseCommaSeparatedListOfComponentValues(r),(e=>{if(!t.isFunctionNode(e))return;const o=modifyGradientFunctionComponentValues(e);o&&(e.value=o)})));if(a===i.value)return;const l=t.stringify(t.replaceComponentValues(t.parseCommaSeparatedListOfComponentValues(r),(e=>{if(!t.isFunctionNode(e))return;const o=modifyGradientFunctionComponentValues(e,!0);o&&(e.value=o)})));i.cloneBefore({value:a}),a!==l&&i.cloneBefore({value:l}),e?.preserve||i.remove()}});basePlugin.postcss=!0;const postcssPlugin=o=>{const t=Object.assign({enableProgressiveCustomProperties:!0,preserve:!0},o);return t.enableProgressiveCustomProperties?{postcssPlugin:"postcss-gradients-interpolation-method",plugins:[e(),basePlugin(t)]}:basePlugin(t)};postcssPlugin.postcss=!0,module.exports=postcssPlugin;
1
+ "use strict";var e=require("@csstools/postcss-progressive-custom-properties"),o=require("@csstools/utilities"),t=require("@csstools/css-parser-algorithms"),n=require("@csstools/css-tokenizer"),i=require("@csstools/css-color-parser");const s=/(repeating-)?(linear|radial|conic)-gradient\(/i,r=/\bin\b/i,a={test:e=>s.test(e)&&r.test(e)},l=/^(repeating-)?(linear|radial|conic)-gradient$/i;function interpolateColorsInColorStopsList(e,o,s,r=!1){const a=[],l=[];for(let r=0;r<e.length-1;r++){const a=e[r],c=e[r+1];if(l.push(a),s||i.serializeP3(a.colorData,!1).toString()!==i.serializeP3(c.colorData,!1).toString()&&a.position.toString()!==c.position.toString())for(let e=1;e<=9;e++){const r=10*e;let p=[];s&&(p=[new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),s,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Ident,"hue",-1,-1,{value:"hue"}])]);const u=new t.FunctionNode([n.TokenType.Function,"color-mix(",-1,-1,{value:"color-mix"}],[n.TokenType.CloseParen,")",-1,-1,void 0],[new t.TokenNode([n.TokenType.Ident,"in",-1,-1,{value:"in"}]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),o,...p,new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),a.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Percentage,100-r+"%",-1,-1,{value:100-r}]),new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),c.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),new t.TokenNode([n.TokenType.Percentage,`${r}%`,-1,-1,{value:r}])]),d=i.color(u);if(!d)return!1;l.push({colorData:d})}r===e.length-2&&l.push(c)}for(let e=0;e<l.length;e++)r&&!i.colorDataFitsRGB_Gamut(l[e].colorData)?l[e].color=i.serializeP3(l[e].colorData,!1):l[e].color=i.serializeRGB(l[e].colorData,!1);for(let e=0;e<l.length;e++){const o=l[e];o.position?a.push(o.color,new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]),o.position):a.push(o.color),e!==l.length-1&&a.push(new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]]))}return a}function parseColorStops(e){const o=[];let s={};for(let r=0;r<e.length;r++){const a=e[r];if(t.isCommentNode(a)||t.isWhitespaceNode(a))continue;if(t.isTokenNode(a)&&a.value[0]===n.TokenType.Comma){if(s.color&&s.colorData&&s.positionA){o.push({color:s.color,colorData:s.colorData,position:s.positionA}),s.positionB&&o.push({color:s.color,colorData:s.colorData,position:s.positionB}),s={};continue}return!1}const l=i.color(a);if(l){if(s.color)return!1;if(l.syntaxFlags.has(i.SyntaxFlag.Experimental))return!1;s.color=a,s.colorData=l}else{if(!s.color)return!1;if(s.positionA){if(!s.positionA||s.positionB)return!1;s.positionB=a}else s.positionA=a}}return!(!s.color||!s.positionA)&&(s.color&&s.colorData&&s.positionA&&(o.push({color:s.color,colorData:s.colorData,position:s.positionA}),s.positionB&&o.push({color:s.color,colorData:s.colorData,position:s.positionB})),!(o.length<2)&&o)}const c=/^(srgb|srgb-linear|lab|oklab|xyz|xyz-d50|xyz-d65|hsl|hwb|lch|oklch)$/i,p=/^(hsl|hwb|lch|oklch)$/i,u=/^(shorter|longer|increasing|decreasing)$/i,d=/^in$/i,T=/^hue$/i;function modifyGradientFunctionComponentValues(e,o=!1){const i=e.getName();if(!l.test(i))return!1;let s="srgb",r=null,a=null,v=null,h=null,f=null,m=[];{let o=0,i=e.value[o];for(;i&&(!t.isTokenNode(i)||i.value[0]!==n.TokenType.Ident||!d.test(i.value[4].value));){if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Comma)return!1;o++,i=e.value[o]}for(r=i,o++,i=e.value[o];t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&c.test(i.value[4].value)){if(a)return!1;a=i,s=i.value[4].value,o++,i=e.value[o]}for(;t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&u.test(i.value[4].value)&&p.test(s)){if(v||!a)return!1;v=i,o++,i=e.value[o]}for(;t.isCommentNode(i)||t.isWhitespaceNode(i);)o++,i=e.value[o];if(t.isTokenNode(i)&&i.value[0]===n.TokenType.Ident&&T.test(i.value[4].value)){if(h||!a||!v)return!1;h=i,o++,i=e.value[o]}for(;i&&(!t.isTokenNode(i)||i.value[0]!==n.TokenType.Comma);)o++,i=e.value[o];if(f=i,!f)return!1;m=e.value.slice(o+1)}if(!a)return!1;if(v&&!h)return!1;if(h&&!v)return!1;const k=parseColorStops(m);if(!k)return!1;const g=interpolateColorsInColorStopsList(k,a,v,o);if(!g)return!1;const N=trim([...e.value.slice(0,e.value.indexOf(r)),...e.value.slice(e.value.indexOf(h||a)+1,e.value.indexOf(f))]);return N.length>0&&N.some((e=>!t.isCommentNode(e)))&&N.push(new t.TokenNode([n.TokenType.Comma,",",-1,-1,void 0]),new t.WhitespaceNode([[n.TokenType.Whitespace," ",-1,-1,void 0]])),trim([...N,...trim(g)])}function trim(e){let o=0,n=e.length-1;for(let n=0;n<e.length;n++)if(!t.isWhitespaceNode(e[n])){o=n;break}for(let o=e.length-1;o>=0;o--)if(!t.isWhitespaceNode(e[o])){n=o;break}return e.slice(o,n+1)}const basePlugin=e=>({postcssPlugin:"postcss-gradients-interpolation-method",Declaration(i){if(!a.test(i.value))return;if(o.hasFallback(i))return;if(o.hasSupportsAtRuleAncestor(i,a))return;const s=n.tokenize({css:i.value}),r=t.stringify(t.replaceComponentValues(t.parseCommaSeparatedListOfComponentValues(s),(e=>{if(!t.isFunctionNode(e))return;const o=modifyGradientFunctionComponentValues(e);o&&(e.value=o)})));if(r===i.value)return;const l=t.stringify(t.replaceComponentValues(t.parseCommaSeparatedListOfComponentValues(s),(e=>{if(!t.isFunctionNode(e))return;const o=modifyGradientFunctionComponentValues(e,!0);o&&(e.value=o)})));i.cloneBefore({value:r}),r!==l&&i.cloneBefore({value:l}),e?.preserve||i.remove()}});basePlugin.postcss=!0;const postcssPlugin=o=>{const t=Object.assign({enableProgressiveCustomProperties:!0,preserve:!0},o);return t.enableProgressiveCustomProperties?{postcssPlugin:"postcss-gradients-interpolation-method",plugins:[e(),basePlugin(t)]}:basePlugin(t)};postcssPlugin.postcss=!0,module.exports=postcssPlugin;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import o from"@csstools/postcss-progressive-custom-properties";import{hasFallback as e,hasSupportsAtRuleAncestor as t}from"@csstools/utilities";import{WhitespaceNode as r,TokenNode as i,FunctionNode as n,isCommentNode as s,isWhitespaceNode as l,isTokenNode as a,stringify as c,replaceComponentValues as u,parseCommaSeparatedListOfComponentValues as p,isFunctionNode as v}from"@csstools/css-parser-algorithms";import{TokenType as f,tokenize as h}from"@csstools/css-tokenizer";import{serializeP3 as m,color as d,colorDataFitsRGB_Gamut as g,serializeRGB as w,SyntaxFlag as C}from"@csstools/css-color-parser";const D=/(repeating-)?(linear|radial|conic)-gradient\(.*?in/i,b=/^(repeating-)?(linear|radial|conic)-gradient$/i;function interpolateColorsInColorStopsList(o,e,t,s=!1){const l=[],a=[];for(let s=0;s<o.length-1;s++){const l=o[s],c=o[s+1];if(a.push(l),t||m(l.colorData,!1).toString()!==m(c.colorData,!1).toString()&&l.position.toString()!==c.position.toString())for(let o=1;o<=9;o++){const s=10*o;let u=[];t&&(u=[new r([[f.Whitespace," ",-1,-1,void 0]]),t,new r([[f.Whitespace," ",-1,-1,void 0]]),new i([f.Ident,"hue",-1,-1,{value:"hue"}])]);const p=new n([f.Function,"color-mix(",-1,-1,{value:"color-mix"}],[f.CloseParen,")",-1,-1,void 0],[new i([f.Ident,"in",-1,-1,{value:"in"}]),new r([[f.Whitespace," ",-1,-1,void 0]]),e,...u,new i([f.Comma,",",-1,-1,void 0]),new r([[f.Whitespace," ",-1,-1,void 0]]),l.color,new r([[f.Whitespace," ",-1,-1,void 0]]),new i([f.Percentage,100-s+"%",-1,-1,{value:100-s}]),new i([f.Comma,",",-1,-1,void 0]),new r([[f.Whitespace," ",-1,-1,void 0]]),c.color,new r([[f.Whitespace," ",-1,-1,void 0]]),new i([f.Percentage,`${s}%`,-1,-1,{value:s}])]),v=d(p);if(!v)return!1;a.push({colorData:v})}s===o.length-2&&a.push(c)}for(let o=0;o<a.length;o++)s&&!g(a[o].colorData)?a[o].color=m(a[o].colorData,!1):a[o].color=w(a[o].colorData,!1);for(let o=0;o<a.length;o++){const e=a[o];e.position?l.push(e.color,new r([[f.Whitespace," ",-1,-1,void 0]]),e.position):l.push(e.color),o!==a.length-1&&l.push(new i([f.Comma,",",-1,-1,void 0]),new r([[f.Whitespace," ",-1,-1,void 0]]))}return l}function parseColorStops(o){const e=[];let t={};for(let r=0;r<o.length;r++){const i=o[r];if(s(i)||l(i))continue;if(a(i)&&i.value[0]===f.Comma){if(t.color&&t.colorData&&t.positionA){e.push({color:t.color,colorData:t.colorData,position:t.positionA}),t.positionB&&e.push({color:t.color,colorData:t.colorData,position:t.positionB}),t={};continue}return!1}const n=d(i);if(n){if(t.color)return!1;if(n.syntaxFlags.has(C.Experimental))return!1;t.color=i,t.colorData=n}else{if(!t.color)return!1;if(t.positionA){if(!t.positionA||t.positionB)return!1;t.positionB=i}else t.positionA=i}}return!(!t.color||!t.positionA)&&(t.color&&t.colorData&&t.positionA&&(e.push({color:t.color,colorData:t.colorData,position:t.positionA}),t.positionB&&e.push({color:t.color,colorData:t.colorData,position:t.positionB})),!(e.length<2)&&e)}const x=/^(srgb|srgb-linear|lab|oklab|xyz|xyz-d50|xyz-d65|hsl|hwb|lch|oklch)$/i,W=/^(hsl|hwb|lch|oklch)$/i,P=/^(shorter|longer|increasing|decreasing)$/i,A=/^in$/i,B=/^hue$/i;function modifyGradientFunctionComponentValues(o,e=!1){const t=o.getName();if(!b.test(t))return!1;let n="srgb",c=null,u=null,p=null,v=null,h=null,m=[];{let e=0,t=o.value[e];for(;t&&(!a(t)||t.value[0]!==f.Ident||!A.test(t.value[4].value));){if(a(t)&&t.value[0]===f.Comma)return!1;e++,t=o.value[e]}for(c=t,e++,t=o.value[e];s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&x.test(t.value[4].value)){if(u)return!1;u=t,n=t.value[4].value,e++,t=o.value[e]}for(;s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&P.test(t.value[4].value)&&W.test(n)){if(p||!u)return!1;p=t,e++,t=o.value[e]}for(;s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&B.test(t.value[4].value)){if(v||!u||!p)return!1;v=t,e++,t=o.value[e]}for(;t&&(!a(t)||t.value[0]!==f.Comma);)e++,t=o.value[e];if(h=t,!h)return!1;m=o.value.slice(e+1)}if(!u)return!1;if(p&&!v)return!1;if(v&&!p)return!1;const d=parseColorStops(m);if(!d)return!1;const g=interpolateColorsInColorStopsList(d,u,p,e);if(!g)return!1;const w=trim([...o.value.slice(0,o.value.indexOf(c)),...o.value.slice(o.value.indexOf(v||u)+1,o.value.indexOf(h))]);return w.length>0&&w.some((o=>!s(o)))&&w.push(new i([f.Comma,",",-1,-1,void 0]),new r([[f.Whitespace," ",-1,-1,void 0]])),trim([...w,...trim(g)])}function trim(o){let e=0,t=o.length-1;for(let t=0;t<o.length;t++)if(!l(o[t])){e=t;break}for(let e=o.length-1;e>=0;e--)if(!l(o[e])){t=e;break}return o.slice(e,t+1)}const basePlugin=o=>({postcssPlugin:"postcss-gradients-interpolation-method",Declaration(r){if(!D.test(r.value))return;if(e(r))return;if(t(r,D))return;const i=h({css:r.value}),n=c(u(p(i),(o=>{if(!v(o))return;const e=modifyGradientFunctionComponentValues(o);e&&(o.value=e)})));if(n===r.value)return;const s=c(u(p(i),(o=>{if(!v(o))return;const e=modifyGradientFunctionComponentValues(o,!0);e&&(o.value=e)})));r.cloneBefore({value:n}),n!==s&&r.cloneBefore({value:s}),o?.preserve||r.remove()}});basePlugin.postcss=!0;const postcssPlugin=e=>{const t=Object.assign({enableProgressiveCustomProperties:!0,preserve:!0},e);return t.enableProgressiveCustomProperties?{postcssPlugin:"postcss-gradients-interpolation-method",plugins:[o(),basePlugin(t)]}:basePlugin(t)};postcssPlugin.postcss=!0;export{postcssPlugin as default};
1
+ import o from"@csstools/postcss-progressive-custom-properties";import{hasFallback as e,hasSupportsAtRuleAncestor as t}from"@csstools/utilities";import{WhitespaceNode as i,TokenNode as r,FunctionNode as n,isCommentNode as s,isWhitespaceNode as l,isTokenNode as a,stringify as c,replaceComponentValues as u,parseCommaSeparatedListOfComponentValues as p,isFunctionNode as v}from"@csstools/css-parser-algorithms";import{TokenType as f,tokenize as h}from"@csstools/css-tokenizer";import{serializeP3 as m,color as d,colorDataFitsRGB_Gamut as g,serializeRGB as w,SyntaxFlag as C}from"@csstools/css-color-parser";const D=/(repeating-)?(linear|radial|conic)-gradient\(/i,b=/\bin\b/i,x={test:o=>D.test(o)&&b.test(o)},W=/^(repeating-)?(linear|radial|conic)-gradient$/i;function interpolateColorsInColorStopsList(o,e,t,s=!1){const l=[],a=[];for(let s=0;s<o.length-1;s++){const l=o[s],c=o[s+1];if(a.push(l),t||m(l.colorData,!1).toString()!==m(c.colorData,!1).toString()&&l.position.toString()!==c.position.toString())for(let o=1;o<=9;o++){const s=10*o;let u=[];t&&(u=[new i([[f.Whitespace," ",-1,-1,void 0]]),t,new i([[f.Whitespace," ",-1,-1,void 0]]),new r([f.Ident,"hue",-1,-1,{value:"hue"}])]);const p=new n([f.Function,"color-mix(",-1,-1,{value:"color-mix"}],[f.CloseParen,")",-1,-1,void 0],[new r([f.Ident,"in",-1,-1,{value:"in"}]),new i([[f.Whitespace," ",-1,-1,void 0]]),e,...u,new r([f.Comma,",",-1,-1,void 0]),new i([[f.Whitespace," ",-1,-1,void 0]]),l.color,new i([[f.Whitespace," ",-1,-1,void 0]]),new r([f.Percentage,100-s+"%",-1,-1,{value:100-s}]),new r([f.Comma,",",-1,-1,void 0]),new i([[f.Whitespace," ",-1,-1,void 0]]),c.color,new i([[f.Whitespace," ",-1,-1,void 0]]),new r([f.Percentage,`${s}%`,-1,-1,{value:s}])]),v=d(p);if(!v)return!1;a.push({colorData:v})}s===o.length-2&&a.push(c)}for(let o=0;o<a.length;o++)s&&!g(a[o].colorData)?a[o].color=m(a[o].colorData,!1):a[o].color=w(a[o].colorData,!1);for(let o=0;o<a.length;o++){const e=a[o];e.position?l.push(e.color,new i([[f.Whitespace," ",-1,-1,void 0]]),e.position):l.push(e.color),o!==a.length-1&&l.push(new r([f.Comma,",",-1,-1,void 0]),new i([[f.Whitespace," ",-1,-1,void 0]]))}return l}function parseColorStops(o){const e=[];let t={};for(let i=0;i<o.length;i++){const r=o[i];if(s(r)||l(r))continue;if(a(r)&&r.value[0]===f.Comma){if(t.color&&t.colorData&&t.positionA){e.push({color:t.color,colorData:t.colorData,position:t.positionA}),t.positionB&&e.push({color:t.color,colorData:t.colorData,position:t.positionB}),t={};continue}return!1}const n=d(r);if(n){if(t.color)return!1;if(n.syntaxFlags.has(C.Experimental))return!1;t.color=r,t.colorData=n}else{if(!t.color)return!1;if(t.positionA){if(!t.positionA||t.positionB)return!1;t.positionB=r}else t.positionA=r}}return!(!t.color||!t.positionA)&&(t.color&&t.colorData&&t.positionA&&(e.push({color:t.color,colorData:t.colorData,position:t.positionA}),t.positionB&&e.push({color:t.color,colorData:t.colorData,position:t.positionB})),!(e.length<2)&&e)}const P=/^(srgb|srgb-linear|lab|oklab|xyz|xyz-d50|xyz-d65|hsl|hwb|lch|oklch)$/i,A=/^(hsl|hwb|lch|oklch)$/i,B=/^(shorter|longer|increasing|decreasing)$/i,I=/^in$/i,S=/^hue$/i;function modifyGradientFunctionComponentValues(o,e=!1){const t=o.getName();if(!W.test(t))return!1;let n="srgb",c=null,u=null,p=null,v=null,h=null,m=[];{let e=0,t=o.value[e];for(;t&&(!a(t)||t.value[0]!==f.Ident||!I.test(t.value[4].value));){if(a(t)&&t.value[0]===f.Comma)return!1;e++,t=o.value[e]}for(c=t,e++,t=o.value[e];s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&P.test(t.value[4].value)){if(u)return!1;u=t,n=t.value[4].value,e++,t=o.value[e]}for(;s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&B.test(t.value[4].value)&&A.test(n)){if(p||!u)return!1;p=t,e++,t=o.value[e]}for(;s(t)||l(t);)e++,t=o.value[e];if(a(t)&&t.value[0]===f.Ident&&S.test(t.value[4].value)){if(v||!u||!p)return!1;v=t,e++,t=o.value[e]}for(;t&&(!a(t)||t.value[0]!==f.Comma);)e++,t=o.value[e];if(h=t,!h)return!1;m=o.value.slice(e+1)}if(!u)return!1;if(p&&!v)return!1;if(v&&!p)return!1;const d=parseColorStops(m);if(!d)return!1;const g=interpolateColorsInColorStopsList(d,u,p,e);if(!g)return!1;const w=trim([...o.value.slice(0,o.value.indexOf(c)),...o.value.slice(o.value.indexOf(v||u)+1,o.value.indexOf(h))]);return w.length>0&&w.some((o=>!s(o)))&&w.push(new r([f.Comma,",",-1,-1,void 0]),new i([[f.Whitespace," ",-1,-1,void 0]])),trim([...w,...trim(g)])}function trim(o){let e=0,t=o.length-1;for(let t=0;t<o.length;t++)if(!l(o[t])){e=t;break}for(let e=o.length-1;e>=0;e--)if(!l(o[e])){t=e;break}return o.slice(e,t+1)}const basePlugin=o=>({postcssPlugin:"postcss-gradients-interpolation-method",Declaration(i){if(!x.test(i.value))return;if(e(i))return;if(t(i,x))return;const r=h({css:i.value}),n=c(u(p(r),(o=>{if(!v(o))return;const e=modifyGradientFunctionComponentValues(o);e&&(o.value=e)})));if(n===i.value)return;const s=c(u(p(r),(o=>{if(!v(o))return;const e=modifyGradientFunctionComponentValues(o,!0);e&&(o.value=e)})));i.cloneBefore({value:n}),n!==s&&i.cloneBefore({value:s}),o?.preserve||i.remove()}});basePlugin.postcss=!0;const postcssPlugin=e=>{const t=Object.assign({enableProgressiveCustomProperties:!0,preserve:!0},e);return t.enableProgressiveCustomProperties?{postcssPlugin:"postcss-gradients-interpolation-method",plugins:[o(),basePlugin(t)]}:basePlugin(t)};postcssPlugin.postcss=!0;export{postcssPlugin as default};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@csstools/postcss-gradients-interpolation-method",
3
3
  "description": "Use interpolation methods in CSS gradient functions",
4
- "version": "4.0.10",
4
+ "version": "4.0.11",
5
5
  "author": "Jonathan Neal <jonathantneal@hotmail.com>",
6
6
  "license": "MIT-0",
7
7
  "funding": [
@@ -50,7 +50,7 @@
50
50
  "homepage": "https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-gradients-interpolation-method#readme",
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "https://github.com/csstools/postcss-plugins.git",
53
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
54
54
  "directory": "plugins/postcss-gradients-interpolation-method"
55
55
  },
56
56
  "bugs": "https://github.com/csstools/postcss-plugins/issues",