11import type { CSSValueInput , CSSValues , Rule , RuleContext } from '@unocss/core'
22import type { Theme } from '../theme'
3- import { colorableShadows , colorResolver , defineProperty , globalKeywords , h } from '../utils'
3+ import {
4+ colorableShadows ,
5+ colorResolver ,
6+ defineProperty ,
7+ getStringComponents ,
8+ globalKeywords ,
9+ h ,
10+ hasParseableColor ,
11+ } from '../utils'
412
513const filterBaseKeys = [
614 'blur' ,
@@ -67,19 +75,34 @@ function toFilter(varName: string, resolver: (str: string, theme: Theme) => stri
6775 }
6876}
6977
70- function dropShadowResolver ( [ , s ] : string [ ] , { theme } : RuleContext < Theme > ) {
71- let v = theme . dropShadow ?. [ s || 'DEFAULT' ]
72- if ( v != null ) {
73- const shadows = colorableShadows ( v , '--un-drop-shadow-color' )
78+ function dropShadowResolver ( match : string [ ] , ctx : RuleContext < Theme > ) {
79+ const [ , s ] = match
80+ const { theme } = ctx
81+ let res : string [ ] = [ ]
82+ if ( s ) {
83+ res = getStringComponents ( s , '/' , 2 ) ?? [ ]
84+ if ( s . startsWith ( '/' ) )
85+ res = [ '' , s . slice ( 1 ) ]
86+ }
87+ let v = theme . dropShadow ?. [ res [ 0 ] || 'DEFAULT' ]
88+ const c = s ? h . bracket . cssvar ( s ) : undefined
89+
90+ if ( ( v != null || c != null ) && ! hasParseableColor ( c , theme ) ) {
91+ const alpha = res [ 1 ] ? h . bracket . percent . cssvar ( res [ 1 ] ) : undefined
7492 return [
7593 {
76- '--un-drop-shadow' : `drop-shadow(${ shadows . join ( ') drop-shadow(' ) } )` ,
94+ '--un-drop-shadow-opacity' : alpha ,
95+ '--un-drop-shadow' : `drop-shadow(${ colorableShadows ( ( v || c ) ! , '--un-drop-shadow-color' , alpha ) . join ( ') drop-shadow(' ) } )` ,
7796 'filter' : filterCSS ,
7897 } ,
7998 ...filterProperties ,
8099 ]
81100 }
82101
102+ if ( hasParseableColor ( s , theme ) ) {
103+ return colorResolver ( '--un-drop-shadow-color' , 'drop-shadow' ) ( match , ctx )
104+ }
105+
83106 v = h . bracket . cssvar ( s ) ?? ( s === 'none' ? '' : undefined )
84107 if ( v != null ) {
85108 return [
@@ -98,7 +121,7 @@ export const filters: Rule<Theme>[] = [
98121 [ / ^ (?: ( b a c k d r o p - ) | f i l t e r - ) ? b r i g h t n e s s - ( .+ ) $ / , toFilter ( 'brightness' , s => h . bracket . cssvar . percent ( s ) ) , { autocomplete : [ '(backdrop|filter)-brightness-<percent>' , 'brightness-<percent>' ] } ] ,
99122 [ / ^ (?: ( b a c k d r o p - ) | f i l t e r - ) ? c o n t r a s t - ( .+ ) $ / , toFilter ( 'contrast' , s => h . bracket . cssvar . percent ( s ) ) , { autocomplete : [ '(backdrop|filter)-contrast-<percent>' , 'contrast-<percent>' ] } ] ,
100123 // drop-shadow only on filter
101- [ / ^ (?: f i l t e r - ) ? d r o p - s h a d o w (?: - ( .+ ) ) ? $ / , dropShadowResolver , {
124+ [ / ^ (?: f i l t e r - ) ? d r o p - s h a d o w (?: - ? ( .+ ) ) ? $ / , dropShadowResolver , {
102125 autocomplete : [
103126 'filter-drop' ,
104127 'filter-drop-shadow' ,
@@ -107,16 +130,18 @@ export const filters: Rule<Theme>[] = [
107130 'drop-shadow-color' ,
108131 'filter-drop-shadow-$dropShadow' ,
109132 'drop-shadow-$dropShadow' ,
133+ 'filter-drop-shadow-$colors' ,
134+ 'drop-shadow-$colors' ,
110135 'filter-drop-shadow-color-$colors' ,
111136 'drop-shadow-color-$colors' ,
112137 'filter-drop-shadow-color-(op|opacity)' ,
113138 'drop-shadow-color-(op|opacity)' ,
114139 'filter-drop-shadow-color-(op|opacity)-<percent>' ,
115- 'drop-shadow-color-(op|opacity)-<percent>' ,
140+ 'drop-shadow( -color)? -(op|opacity)-<percent>' ,
116141 ] ,
117142 } ] ,
118143 [ / ^ (?: f i l t e r - ) ? d r o p - s h a d o w - c o l o r - ( .+ ) $ / , colorResolver ( '--un-drop-shadow-color' , 'drop-shadow' ) ] ,
119- [ / ^ (?: f i l t e r - ) ? d r o p - s h a d o w - c o l o r - o p (?: a c i t y ) ? - ? ( .+ ) $ / , ( [ , opacity ] ) => ( { '--un-drop-shadow-opacity' : h . bracket . percent ( opacity ) } ) ] ,
144+ [ / ^ (?: f i l t e r - ) ? d r o p - s h a d o w (?: - c o l o r ) ? - o p (?: a c i t y ) ? - ? ( .+ ) $ / , ( [ , opacity ] ) => ( { '--un-drop-shadow-opacity' : h . bracket . percent ( opacity ) } ) ] ,
120145 [ / ^ (?: ( b a c k d r o p - ) | f i l t e r - ) ? g r a y s c a l e (?: - ( .+ ) ) ? $ / , toFilter ( 'grayscale' , percentWithDefault ) , { autocomplete : [ '(backdrop|filter)-grayscale' , '(backdrop|filter)-grayscale-<percent>' , 'grayscale-<percent>' ] } ] ,
121146 [ / ^ (?: ( b a c k d r o p - ) | f i l t e r - ) ? h u e - r o t a t e - ( .+ ) $ / , toFilter ( 'hue-rotate' , s => h . bracket . cssvar . degree ( s ) ) ] ,
122147 [ / ^ (?: ( b a c k d r o p - ) | f i l t e r - ) ? i n v e r t (?: - ( .+ ) ) ? $ / , toFilter ( 'invert' , percentWithDefault ) , { autocomplete : [ '(backdrop|filter)-invert' , '(backdrop|filter)-invert-<percent>' , 'invert-<percent>' ] } ] ,
0 commit comments