| 159 | } |
| 160 | }, |
| 161 | matchVariant(name, fn, options) { |
| 162 | function resolveVariantValue<T extends Parameters<typeof fn>[0]>( |
| 163 | value: T, |
| 164 | modifier: CandidateModifier | null, |
| 165 | nodes: AstNode[], |
| 166 | ): AstNode[] { |
| 167 | let resolved = fn(value, { modifier: modifier?.value ?? null }) |
| 168 | return parseVariantValue(resolved, nodes) |
| 169 | } |
| 170 | |
| 171 | try { |
| 172 | class="cm">// Sample variant value and ignore variants emitting v3 `:merge` rules. In |
| 173 | class="cm">// v4, the `group-*` and `peer-*` variants compound automatically. |
| 174 | let sample = fn(class="st">'a', { modifier: null }) |
| 175 | if (typeof sample === class="st">'string' && sample.includes(class="st">':merge(')) { |
| 176 | return |
| 177 | } else if (Array.isArray(sample) && sample.some((r) => r.includes(class="st">':merge('))) { |
| 178 | return |
| 179 | } |
| 180 | } catch {} |
| 181 | |
| 182 | let defaultOptionKeys = Object.keys(options?.values ?? {}) |
| 183 | designSystem.variants.group( |
| 184 | () => { |
| 185 | designSystem.variants.functional(name, (ruleNodes, variant) => { |
| 186 | if (!variant.value) { |
| 187 | if (options?.values && class="st">'DEFAULT' in options.values) { |
| 188 | ruleNodes.nodes = resolveVariantValue( |
| 189 | options.values.DEFAULT, |
| 190 | variant.modifier, |
| 191 | ruleNodes.nodes, |
| 192 | ) |
| 193 | return |
| 194 | } |
| 195 | return null |
| 196 | } |
| 197 | |
| 198 | if (variant.value.kind === class="st">'arbitrary') { |
| 199 | ruleNodes.nodes = resolveVariantValue( |
| 200 | variant.value.value, |
| 201 | variant.modifier, |
| 202 | ruleNodes.nodes, |
| 203 | ) |
| 204 | } else if (variant.value.kind === class="st">'named' && options?.values) { |
| 205 | if (!Object.hasOwn(options.values, variant.value.value)) { |
| 206 | return null |
| 207 | } |
| 208 | let defaultValue = options.values[variant.value.value] |
| 209 | if (typeof defaultValue !== class="st">'string') { |
| 210 | return null |
| 211 | } |
| 212 | |
| 213 | ruleNodes.nodes = resolveVariantValue(defaultValue, variant.modifier, ruleNodes.nodes) |
| 214 | } else { |
| 215 | return null |
| 216 | } |
| 217 | }) |
| 218 | }, |