@@ -4706,6 +4706,7 @@ export function createCssUtility(node: AtRule) {
4706
4706
if ( IS_VALID_FUNCTIONAL_UTILITY_NAME . test ( name ) ) {
4707
4707
// API:
4708
4708
//
4709
+ // - `--value('literal')` resolves a literal named value
4709
4710
// - `--value(number)` resolves a bare value of type number
4710
4711
// - `--value([number])` resolves an arbitrary value of type number
4711
4712
// - `--value(--color)` resolves a theme value in the `color` namespace
@@ -4731,7 +4732,10 @@ export function createCssUtility(node: AtRule) {
4731
4732
4732
4733
return ( designSystem : DesignSystem ) => {
4733
4734
let valueThemeKeys = new Set < `--${string } `> ( )
4735
+ let valueLiterals = new Set < string > ( )
4736
+
4734
4737
let modifierThemeKeys = new Set < `--${string } `> ( )
4738
+ let modifierLiterals = new Set < string > ( )
4735
4739
4736
4740
// Pre-process the AST to make it easier to work with.
4737
4741
//
@@ -4747,12 +4751,12 @@ export function createCssUtility(node: AtRule) {
4747
4751
4748
4752
// Required manipulations:
4749
4753
//
4750
- // - `--value(--spacing)` -> `--value(--spacing-*)`
4751
- // - `--value(--spacing- *)` -> `--value(--spacing-*)`
4752
- // - `--value(--text- * --line-height)` -> `--value(--text-*--line-height)`
4753
- // - `--value(--text --line-height)` -> `--value(--text-*--line-height)`
4754
- // - `--value(--text-\\* --line-height)` -> `--value(--text-*--line-height)`
4755
- // - `--value([ *])` -> `--value([*])`
4754
+ // - `--value(--spacing)` -> `--value(--spacing-*)`
4755
+ // - `--value(--spacing- *)` -> `--value(--spacing-*)`
4756
+ // - `--value(--text- * --line-height)` -> `--value(--text-*--line-height)`
4757
+ // - `--value(--text --line-height)` -> `--value(--text-*--line-height)`
4758
+ // - `--value(--text-\\* --line-height)` -> `--value(--text-*--line-height)`
4759
+ // - `--value([ *])` -> `--value([*])`
4756
4760
//
4757
4761
// Once Prettier / Biome handle these better (e.g.: not crashing without
4758
4762
// `\\*` or not inserting whitespace) then most of these can go away.
@@ -4783,9 +4787,25 @@ export function createCssUtility(node: AtRule) {
4783
4787
}
4784
4788
fn . nodes = ValueParser . parse ( args . join ( ',' ) )
4785
4789
4786
- // Track the theme keys for suggestions
4790
+ // Track information for suggestions
4787
4791
for ( let node of fn . nodes ) {
4788
- if ( node . kind === 'word' && node . value [ 0 ] === '-' && node . value [ 1 ] === '-' ) {
4792
+ // Track literal values
4793
+ if (
4794
+ node . kind === 'word' &&
4795
+ ( node . value [ 0 ] === '"' || node . value [ 0 ] === "'" ) &&
4796
+ node . value [ 0 ] === node . value [ node . value . length - 1 ]
4797
+ ) {
4798
+ let value = node . value . slice ( 1 , - 1 )
4799
+
4800
+ if ( fn . value === '--value' ) {
4801
+ valueLiterals . add ( value )
4802
+ } else if ( fn . value === '--modifier' ) {
4803
+ modifierLiterals . add ( value )
4804
+ }
4805
+ }
4806
+
4807
+ // Track theme keys
4808
+ else if ( node . kind === 'word' && node . value [ 0 ] === '-' && node . value [ 1 ] === '-' ) {
4789
4809
let value = node . value . replace ( / - \* .* $ / g, '' ) as `--${string } `
4790
4810
4791
4811
if ( fn . value === '--value' ) {
@@ -4929,16 +4949,23 @@ export function createCssUtility(node: AtRule) {
4929
4949
} )
4930
4950
4931
4951
designSystem . utilities . suggest ( name . slice ( 0 , - 2 ) , ( ) => {
4932
- return [
4933
- {
4934
- values : designSystem . theme
4935
- . keysInNamespaces ( valueThemeKeys )
4936
- . map ( ( x ) => x . replaceAll ( '_' , '.' ) ) ,
4937
- modifiers : designSystem . theme
4938
- . keysInNamespaces ( modifierThemeKeys )
4939
- . map ( ( x ) => x . replaceAll ( '_' , '.' ) ) ,
4940
- } ,
4941
- ] satisfies SuggestionGroup [ ]
4952
+ let values = [ ]
4953
+ for ( let value of valueLiterals ) {
4954
+ values . push ( value )
4955
+ }
4956
+ for ( let value of designSystem . theme . keysInNamespaces ( valueThemeKeys ) ) {
4957
+ values . push ( value )
4958
+ }
4959
+
4960
+ let modifiers = [ ]
4961
+ for ( let modifier of modifierLiterals ) {
4962
+ modifiers . push ( modifier )
4963
+ }
4964
+ for ( let value of designSystem . theme . keysInNamespaces ( modifierThemeKeys ) ) {
4965
+ modifiers . push ( value )
4966
+ }
4967
+
4968
+ return [ { values, modifiers } ] satisfies SuggestionGroup [ ]
4942
4969
} )
4943
4970
}
4944
4971
}
@@ -4961,8 +4988,21 @@ function resolveValueFunction(
4961
4988
designSystem : DesignSystem ,
4962
4989
) : { nodes : ValueParser . ValueAstNode [ ] ; ratio ?: boolean } | undefined {
4963
4990
for ( let arg of fn . nodes ) {
4964
- // Resolving theme value, e.g.: `--value(--color )`
4991
+ // Resolve literal value, e.g.: `--modifier('closest-side' )`
4965
4992
if (
4993
+ value . kind === 'named' &&
4994
+ arg . kind === 'word' &&
4995
+ // Should be wreapped in quotes
4996
+ ( arg . value [ 0 ] === "'" || arg . value [ 0 ] === '"' ) &&
4997
+ arg . value [ arg . value . length - 1 ] === arg . value [ 0 ] &&
4998
+ // Values should match
4999
+ arg . value . slice ( 1 , - 1 ) === value . value
5000
+ ) {
5001
+ return { nodes : ValueParser . parse ( value . value ) }
5002
+ }
5003
+
5004
+ // Resolving theme value, e.g.: `--value(--color)`
5005
+ else if (
4966
5006
value . kind === 'named' &&
4967
5007
arg . kind === 'word' &&
4968
5008
arg . value [ 0 ] === '-' &&
0 commit comments