From e450303f83329a7b0dc1a238d0939596b52eab47 Mon Sep 17 00:00:00 2001 From: upsiflu Date: Fri, 3 Jan 2025 16:24:56 +0100 Subject: [PATCH] feat(ui): if a component receives conflicting props, the explicit precedence list decides which prop wins --- front/src/composables/color.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/front/src/composables/color.ts b/front/src/composables/color.ts index c7abf2a9f..a3cf878cb 100644 --- a/front/src/composables/color.ts +++ b/front/src/composables/color.ts @@ -1,5 +1,6 @@ import type { KeysOfUnion } from "type-fest" import type { HTMLAttributes } from "vue" +import { key } from "~/store" export type DefaultProps = | { default?: true } @@ -57,13 +58,16 @@ const classes = { purple: "purple", green: "green", yellow: "yellow", - solid: "solid", outline: "outline", ghost: "ghost", + solid: "solid", raised: "raised", interactive: "interactive" } satisfies Record +const getPrecedence = (searchKey:Key | string) => + Object.entries(classes).findIndex(([key, _])=>key===searchKey) + /** * @param props A superset of `{ Key? : true }` * @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, defaults?: Key[]) => merge( - Object.entries(props).reduce( + Object.entries(props) + .sort(([a, _], [b, __]) => getPrecedence(a) - getPrecedence(b)) + .reduce( ((acc, [key, value]) => value && key in classes ? acc.filter(accKey => !conflicts.find(set => set.has(accKey) && set.has(key as Key)))