(design: DesignSystem)
| 22 | const IS_FRACTION = /^\d+\/\d+$/ |
| 23 | |
| 24 | export function getClassList(design: DesignSystem): ClassEntry[] { |
| 25 | let items = new DefaultMap<string, ClassItem>((utility) => ({ |
| 26 | name: utility, |
| 27 | utility, |
| 28 | fraction: false, |
| 29 | modifiers: [], |
| 30 | })) |
| 31 | |
| 32 | // Static utilities only work as-is |
| 33 | for (let utility of design.utilities.keys('static')) { |
| 34 | let completions = design.utilities.getCompletions(utility) |
| 35 | if (completions.length === 0) continue |
| 36 | |
| 37 | let item = items.get(utility) |
| 38 | item.fraction = false |
| 39 | item.modifiers = [] |
| 40 | } |
| 41 | |
| 42 | // Functional utilities have their own list of completions |
| 43 | for (let utility of design.utilities.keys('functional')) { |
| 44 | let completions = design.utilities.getCompletions(utility) |
| 45 | |
| 46 | for (let group of completions) { |
| 47 | for (let value of group.values) { |
| 48 | let fraction = value !== null && IS_FRACTION.test(value) |
| 49 | |
| 50 | let name = value === null ? utility : `${utility}-${value}` |
| 51 | |
| 52 | let item = items.get(name) |
| 53 | item.utility = utility |
| 54 | item.fraction ||= fraction |
| 55 | item.modifiers.push(...group.modifiers) |
| 56 | |
| 57 | if (group.supportsNegative) { |
| 58 | let item = items.get(`-${name}`) |
| 59 | item.utility = `-${utility}` |
| 60 | item.fraction ||= fraction |
| 61 | item.modifiers.push(...group.modifiers) |
| 62 | } |
| 63 | |
| 64 | // Deduplicate modifiers |
| 65 | item.modifiers = Array.from(new Set(item.modifiers)) |
| 66 | } |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | if (items.size === 0) return [] |
| 71 | |
| 72 | // Sort utilities by their class name |
| 73 | let list = Array.from(items.values()) |
| 74 | list.sort((a, b) => compare(a.name, b.name)) |
| 75 | |
| 76 | let entries = sortFractionsLast(list) |
| 77 | |
| 78 | return entries |
| 79 | } |
| 80 | |
| 81 | function sortFractionsLast(list: ClassItem[]) { |
no test coverage detected