feat(ui): if a component receives conflicting props, the explicit precedence list decides which prop wins
This commit is contained in:
parent
220a589715
commit
e450303f83
|
@ -1,5 +1,6 @@
|
||||||
import type { KeysOfUnion } from "type-fest"
|
import type { KeysOfUnion } from "type-fest"
|
||||||
import type { HTMLAttributes } from "vue"
|
import type { HTMLAttributes } from "vue"
|
||||||
|
import { key } from "~/store"
|
||||||
|
|
||||||
export type DefaultProps =
|
export type DefaultProps =
|
||||||
| { default?: true }
|
| { default?: true }
|
||||||
|
@ -57,13 +58,16 @@ const classes = {
|
||||||
purple: "purple",
|
purple: "purple",
|
||||||
green: "green",
|
green: "green",
|
||||||
yellow: "yellow",
|
yellow: "yellow",
|
||||||
solid: "solid",
|
|
||||||
outline: "outline",
|
outline: "outline",
|
||||||
ghost: "ghost",
|
ghost: "ghost",
|
||||||
|
solid: "solid",
|
||||||
raised: "raised",
|
raised: "raised",
|
||||||
interactive: "interactive"
|
interactive: "interactive"
|
||||||
} satisfies Record<Key, string>
|
} satisfies Record<Key, string>
|
||||||
|
|
||||||
|
const getPrecedence = (searchKey:Key | string) =>
|
||||||
|
Object.entries(classes).findIndex(([key, _])=>key===searchKey)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param props A superset of `{ Key? : true }`
|
* @param props A superset of `{ Key? : true }`
|
||||||
* @returns the number of actually applied classes (if there are no defaults)
|
* @returns the number of actually applied classes (if there are no defaults)
|
||||||
|
@ -92,7 +96,9 @@ const merge = (classes: string[]) => (attributes: HTMLAttributes = {}) =>
|
||||||
*/
|
*/
|
||||||
export const color = (props: Partial<Props>, defaults?: Key[]) =>
|
export const color = (props: Partial<Props>, defaults?: Key[]) =>
|
||||||
merge(
|
merge(
|
||||||
Object.entries(props).reduce(
|
Object.entries(props)
|
||||||
|
.sort(([a, _], [b, __]) => getPrecedence(a) - getPrecedence(b))
|
||||||
|
.reduce(
|
||||||
((acc, [key, value]) =>
|
((acc, [key, value]) =>
|
||||||
value && key in classes ?
|
value && key in classes ?
|
||||||
acc.filter(accKey => !conflicts.find(set => set.has(accKey) && set.has(key as Key)))
|
acc.filter(accKey => !conflicts.find(set => set.has(accKey) && set.has(key as Key)))
|
||||||
|
|
Loading…
Reference in New Issue