@@ -4706,6 +4706,7 @@ export function createCssUtility(node: AtRule) {
47064706 if ( IS_VALID_FUNCTIONAL_UTILITY_NAME . test ( name ) ) {
47074707 // API:
47084708 //
4709+ // - `--value('literal')` resolves a literal named value
47094710 // - `--value(number)` resolves a bare value of type number
47104711 // - `--value([number])` resolves an arbitrary value of type number
47114712 // - `--value(--color)` resolves a theme value in the `color` namespace
@@ -4731,7 +4732,10 @@ export function createCssUtility(node: AtRule) {
47314732
47324733 return ( designSystem : DesignSystem ) => {
47334734 let valueThemeKeys = new Set < `--${string } `> ( )
4735+ let valueLiterals = new Set < string > ( )
4736+
47344737 let modifierThemeKeys = new Set < `--${string } `> ( )
4738+ let modifierLiterals = new Set < string > ( )
47354739
47364740 // Pre-process the AST to make it easier to work with.
47374741 //
@@ -4747,12 +4751,12 @@ export function createCssUtility(node: AtRule) {
47474751
47484752 // Required manipulations:
47494753 //
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([*])`
47564760 //
47574761 // Once Prettier / Biome handle these better (e.g.: not crashing without
47584762 // `\\*` or not inserting whitespace) then most of these can go away.
@@ -4783,9 +4787,25 @@ export function createCssUtility(node: AtRule) {
47834787 }
47844788 fn . nodes = ValueParser . parse ( args . join ( ',' ) )
47854789
4786- // Track the theme keys for suggestions
4790+ // Track information for suggestions
47874791 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 ] === '-' ) {
47894809 let value = node . value . replace ( / - \* .* $ / g, '' ) as `--${string } `
47904810
47914811 if ( fn . value === '--value' ) {
@@ -4929,16 +4949,23 @@ export function createCssUtility(node: AtRule) {
49294949 } )
49304950
49314951 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 [ ]
49424969 } )
49434970 }
49444971 }
@@ -4961,8 +4988,21 @@ function resolveValueFunction(
49614988 designSystem : DesignSystem ,
49624989) : { nodes : ValueParser . ValueAstNode [ ] ; ratio ?: boolean } | undefined {
49634990 for ( let arg of fn . nodes ) {
4964- // Resolving theme value, e.g.: `--value(--color )`
4991+ // Resolve literal value, e.g.: `--modifier('closest-side' )`
49654992 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 (
49665006 value . kind === 'named' &&
49675007 arg . kind === 'word' &&
49685008 arg . value [ 0 ] === '-' &&
0 commit comments