refactor: tailwind tier 1 — border-subtle/text-secondary/focus-ring utilities + Input config extraction

This commit is contained in:
Ilia Mashkov
2026-04-16 16:32:41 +03:00
parent aa1379c15b
commit 816d4b89ce
15 changed files with 78 additions and 55 deletions
+7 -28
View File
@@ -9,6 +9,10 @@ import type { Snippet } from 'svelte';
import { cubicOut } from 'svelte/easing';
import type { HTMLInputAttributes } from 'svelte/elements';
import { scale } from 'svelte/transition';
import {
inputSizeConfig,
inputVariantConfig,
} from './config';
import type {
InputSize,
InputVariant,
@@ -80,36 +84,11 @@ let {
...rest
}: Props = $props();
const sizeConfig: Record<InputSize, { input: string; text: string; height: string; clearIcon: number }> = {
sm: { input: 'px-3 py-1.5', text: 'text-sm', height: 'h-8', clearIcon: 12 },
md: { input: 'px-4 py-2', text: 'text-base', height: 'h-10', clearIcon: 14 },
lg: { input: 'px-4 py-3', text: 'text-lg md:text-xl', height: 'h-12', clearIcon: 16 },
xl: { input: 'px-4 py-3', text: 'text-xl md:text-2xl', height: 'h-14', clearIcon: 18 },
};
const variantConfig: Record<InputVariant, { base: string; focus: string; error: string }> = {
default: {
base: 'bg-paper dark:bg-paper border border-black/5 dark:border-white/10',
focus: 'focus:border-brand focus:ring-1 focus:ring-brand/20',
error: 'border-brand ring-1 ring-brand/20',
},
underline: {
base: 'bg-transparent border-0 border-b border-neutral-300 dark:border-neutral-700',
focus: 'focus:border-brand',
error: 'border-brand',
},
filled: {
base: 'bg-surface dark:bg-paper border border-transparent',
focus: 'focus:border-brand focus:ring-1 focus:ring-brand/20',
error: 'border-brand ring-1 ring-brand/20',
},
};
const hasValue = $derived(value !== undefined && value !== '');
const showClear = $derived(showClearButton && hasValue && !!onclear);
const hasRightSlot = $derived(!!rightIcon || showClearButton);
const cfg = $derived(sizeConfig[size]);
const styles = $derived(variantConfig[variant]);
const cfg = $derived(inputSizeConfig[size]);
const styles = $derived(inputVariantConfig[variant]);
const inputClasses = $derived(cn(
'font-primary rounded-none outline-none transition-all duration-200',
@@ -170,7 +149,7 @@ const inputClasses = $derived(cn(
<span
class={cn(
'text-[0.625rem] font-mono tracking-wide px-1',
error ? 'text-brand ' : 'text-neutral-500 dark:text-neutral-400',
error ? 'text-brand ' : 'text-secondary',
)}
>
{helperText}
+31
View File
@@ -0,0 +1,31 @@
import type {
InputSize,
InputVariant,
} from './types';
/** Size-specific layout classes: padding, text size, height, and clear-icon pixel size. */
export const inputSizeConfig: Record<InputSize, { input: string; text: string; height: string; clearIcon: number }> = {
sm: { input: 'px-3 py-1.5', text: 'text-sm', height: 'h-8', clearIcon: 12 },
md: { input: 'px-4 py-2', text: 'text-base', height: 'h-10', clearIcon: 14 },
lg: { input: 'px-4 py-3', text: 'text-lg md:text-xl', height: 'h-12', clearIcon: 16 },
xl: { input: 'px-4 py-3', text: 'text-xl md:text-2xl', height: 'h-14', clearIcon: 18 },
};
/** Variant-specific classes: base background/border, focus ring, and error state. */
export const inputVariantConfig: Record<InputVariant, { base: string; focus: string; error: string }> = {
default: {
base: 'bg-paper dark:bg-paper border border-subtle',
focus: 'focus:border-brand focus:ring-1 focus:ring-brand/20',
error: 'border-brand ring-1 ring-brand/20',
},
underline: {
base: 'bg-transparent border-0 border-b border-neutral-300 dark:border-neutral-700',
focus: 'focus:border-brand',
error: 'border-brand',
},
filled: {
base: 'bg-surface dark:bg-paper border border-transparent',
focus: 'focus:border-brand focus:ring-1 focus:ring-brand/20',
error: 'border-brand ring-1 ring-brand/20',
},
};