diff --git a/README.md b/README.md index 51f78e8..1b831cd 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,9 @@ export default defineConfig({ }); ``` -The built-in parent themes are `tensamin`, `methanium`, and `secret`. Without -the plugin or a provider override, the neutral base theme is used. +The built-in parent themes are `tensamin`, `og-tensamin`, `methanium`, and +`secret`. Without the plugin or a provider override, the neutral base theme is +used. Public Sans is bundled as the default typeface; users can switch to their platform's system font in the customizer. @@ -36,7 +37,11 @@ Pass a typed manifest to `ThemeProvider` to add themes. Presets are ordinary CSS and remain fully editable after selection. ```ts -import { BUILT_IN_THEMES, defineThemes } from "@methanium/ui"; +import { + BUILT_IN_THEMES, + DEFAULT_THEME_DESIGN, + defineThemes, +} from "@methanium/ui"; export const themes = defineThemes([ ...BUILT_IN_THEMES, @@ -44,6 +49,10 @@ export const themes = defineThemes([ id: "my-theme", title: "My Theme", logo: "/themes/my-logo.svg", + defaultValues: { + borderRadius: 0.5, + design: { ...DEFAULT_THEME_DESIGN, density: 0.95 }, + }, css: `:root[data-theme="my-theme"] { --primary: #ff4f91; }`, }, ]); diff --git a/apps/showcase/src/index.css b/apps/showcase/src/index.css index 6c557e6..f5ce7df 100644 --- a/apps/showcase/src/index.css +++ b/apps/showcase/src/index.css @@ -4,4 +4,5 @@ body { margin: 0; + background-image: none !important; } diff --git a/src/cmp/badge.tsx b/src/cmp/badge.tsx index 9ebbc11..a3d18e5 100644 --- a/src/cmp/badge.tsx +++ b/src/cmp/badge.tsx @@ -15,7 +15,7 @@ const badgeVariants = cva( destructive: "bg-destructive/10 text-destructive dark:bg-destructive/20 [a]:hover:bg-destructive/20", outline: - "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground", + "border-input bg-transparent text-foreground dark:bg-input/30 [a]:hover:border-ring/60 [a]:hover:bg-input/50 [a]:hover:text-foreground [a]:focus-visible:border-ring [a]:focus-visible:bg-input/50", ghost: "hover:bg-muted focus-visible:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50 dark:focus-visible:bg-muted/50", link: "text-primary underline-offset-4 hover:underline focus-visible:underline", diff --git a/src/cmp/button.tsx b/src/cmp/button.tsx index 72a4841..8c4d561 100644 --- a/src/cmp/button.tsx +++ b/src/cmp/button.tsx @@ -12,7 +12,7 @@ const buttonVariants = cva( subtleDefault: "bg-primary-foreground-alt/10 text-primary-foreground-alt hover:bg-primary-foreground-alt/20 focus-visible:bg-primary-foreground-alt/20 dark:bg-primary-foreground-alt/20 dark:hover:bg-primary-foreground-alt/30 dark:focus-visible:bg-primary-foreground-alt/30", outline: - "border-border bg-background hover:bg-muted focus-visible:bg-muted hover:text-foreground focus-visible:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 dark:focus-visible:bg-input/50", + "border-input bg-transparent text-foreground hover:border-ring/60 hover:bg-input/50 focus-visible:border-ring focus-visible:bg-input/50 aria-expanded:border-ring/60 aria-expanded:bg-input/50 dark:bg-input/30 dark:hover:bg-input/50 dark:focus-visible:bg-input/50", secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", ghost: diff --git a/src/cmp/input-group.tsx b/src/cmp/input-group.tsx index dddffb2..790cebb 100644 --- a/src/cmp/input-group.tsx +++ b/src/cmp/input-group.tsx @@ -14,7 +14,7 @@ function InputGroup({ className, ...props }: React.ComponentProps<"div">) { data-slot="input-group" role="group" className={cn( - "group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", + "group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none hover:border-ring/60 hover:bg-input/20 focus-within:border-ring focus-within:bg-input/20 in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:hover:bg-input/50 dark:focus-within:bg-input/50 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", className, )} {...props} diff --git a/src/cmp/input.tsx b/src/cmp/input.tsx index 6459ce7..dd86a24 100644 --- a/src/cmp/input.tsx +++ b/src/cmp/input.tsx @@ -9,7 +9,7 @@ function Input({ className, type, ...props }: React.ComponentProps<"input">) { type={type} data-slot="input" className={cn( - "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", + "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none hover:border-ring/60 hover:bg-input/20 focus-visible:border-ring focus-visible:bg-input/20 file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:hover:bg-input/50 dark:focus-visible:bg-input/50 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", className, )} {...props} diff --git a/src/cmp/item.tsx b/src/cmp/item.tsx index 0d3b649..3c59369 100644 --- a/src/cmp/item.tsx +++ b/src/cmp/item.tsx @@ -35,13 +35,15 @@ function ItemSeparator({ } const itemVariants = cva( - "group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none [a]:transition-colors [a]:hover:bg-muted focus-visible:bg-muted", + "group/item flex w-full flex-wrap items-center rounded-lg border text-sm transition-colors duration-100 outline-none [a]:transition-colors", { variants: { variant: { - default: "border-transparent", - outline: "border-border", - muted: "border-transparent bg-muted/50", + default: "border-transparent [a]:hover:bg-muted focus-visible:bg-muted", + outline: + "border-input bg-transparent hover:border-ring/60 hover:bg-input/50 focus-visible:border-ring focus-visible:bg-input/50 dark:bg-input/30", + muted: + "border-transparent bg-muted/50 [a]:hover:bg-muted focus-visible:bg-muted", }, size: { default: "gap-2.5 px-3 py-2.5", diff --git a/src/cmp/native-select.tsx b/src/cmp/native-select.tsx index e485f8c..08f60df 100644 --- a/src/cmp/native-select.tsx +++ b/src/cmp/native-select.tsx @@ -24,7 +24,7 @@ function NativeSelect({