import { type ViewStyle, type TextStyle } from "react-native"; import { type ColorTokens } from "../../style/index.js"; export type Intent = "primary" | "secondary" | "destructive" | "outline" | "ghost" | "link"; export type Size = "small" | "base" | "large"; export interface ButtonSkinOpts { icon: boolean; block: boolean; /** disabled or loading: dim the control. */ dim: boolean; } export interface ButtonSkin { container: (t: ColorTokens, intent: Intent, size: Size, opts: ButtonSkinOpts) => ViewStyle; label: (t: ColorTokens, intent: Intent, size: Size) => TextStyle; /** iOS/web dim the fill on press; Android uses a ripple instead (null). */ pressedOpacity: number | null; ripple: ((t: ColorTokens, intent: Intent) => { color: string; borderless: boolean; }) | null; /** * The rounded shape the shell's `` parent clips the bounded ripple to (the * same corner radii `container` draws). Only the Android skin sets it — a bounded ripple * is Android-only; iOS/web omit it so no clip wrapper is applied. See src/style/ripple-clip. */ rippleClipShape?: (size: Size, opts: ButtonSkinOpts) => ViewStyle; /** * Platform minimum touch target in pt/dp (iOS HIG 44pt, Android M3 48dp). When set, * the shell measures the rendered control and extends the TOUCH area with hitSlop on * whichever axis falls short (e.g. the 36pt iOS / 30dp Android `small` text button and * the sub-minimum icon squares). hitSlop never affects layout, so the visual size is * untouched. null (web) skips the measurement entirely: pointer targets stay visual. */ minTarget: number | null; } /** Foreground token per intent: the label color and the loading-spinner color. */ export declare const FG_TOKEN: Record; export declare const webSkin: ButtonSkin; export declare const iosSkin: ButtonSkin; export declare const androidSkin: ButtonSkin; //# sourceMappingURL=button.styles.d.ts.map