clava 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +18 -7
- package/src/test.ts +46 -0
- package/src/types.ts +7 -3
package/CHANGELOG.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -64,10 +64,13 @@ interface ModalComponent<V$1, R extends ComponentResult> {
|
|
|
64
64
|
/** @internal Base class without variants */
|
|
65
65
|
_baseClass: string;
|
|
66
66
|
/**
|
|
67
|
-
* @internal Returns
|
|
68
|
-
* Used by child components to get parent's
|
|
67
|
+
* @internal Returns only the variants set via setDefaultVariants in the
|
|
68
|
+
* computed function. Used by child components to get parent's computed
|
|
69
|
+
* defaults.
|
|
70
|
+
* @param childDefaults - Child's static defaults (merged into variants)
|
|
71
|
+
* @param userProps - Actual user props (for setDefaultVariants check)
|
|
69
72
|
*/
|
|
70
|
-
_resolveDefaults: (
|
|
73
|
+
_resolveDefaults: (childDefaults: Record<string, unknown>, userProps?: Record<string, unknown>) => Record<string, unknown>;
|
|
71
74
|
}
|
|
72
75
|
interface CVComponent<V$1 extends Variants = {}, CV$1 extends ComputedVariants = {}, E$1 extends AnyComponent[] = [], R extends ComponentResult = ComponentResult> extends ModalComponent<MergeVariants<V$1, CV$1, E$1>, R> {
|
|
73
76
|
jsx: ModalComponent<MergeVariants<V$1, CV$1, E$1>, JSXProps>;
|
package/dist/index.js
CHANGED
|
@@ -248,7 +248,8 @@ function collectDefaultVariants(config, propsVariants = {}) {
|
|
|
248
248
|
let defaults = collectStaticDefaults(config);
|
|
249
249
|
if (config.extend) {
|
|
250
250
|
for (const ext of config.extend) if (ext._resolveDefaults) {
|
|
251
|
-
const
|
|
251
|
+
const childStaticDefaults = config.defaultVariants || {};
|
|
252
|
+
const extComputedDefaults = ext._resolveDefaults(childStaticDefaults, propsVariants);
|
|
252
253
|
defaults = {
|
|
253
254
|
...defaults,
|
|
254
255
|
...extComputedDefaults
|
|
@@ -558,10 +559,11 @@ function create({ defaultMode = "jsx", transformClass = (className) => className
|
|
|
558
559
|
const extendedBaseClasses = [];
|
|
559
560
|
if (config.extend) for (const ext of config.extend) extendedBaseClasses.push(ext._baseClass);
|
|
560
561
|
component$1._baseClass = cx$1(...extendedBaseClasses, config.class);
|
|
561
|
-
component$1._resolveDefaults = (
|
|
562
|
+
component$1._resolveDefaults = (childDefaults, userProps = {}) => {
|
|
562
563
|
const resolvedVariants = {
|
|
563
564
|
...collectStaticDefaults(config),
|
|
564
|
-
...filterUndefined(
|
|
565
|
+
...filterUndefined(childDefaults),
|
|
566
|
+
...filterUndefined(userProps)
|
|
565
567
|
};
|
|
566
568
|
const computedDefaults = {};
|
|
567
569
|
if (config.computed) {
|
|
@@ -569,7 +571,7 @@ function create({ defaultMode = "jsx", transformClass = (className) => className
|
|
|
569
571
|
variants: resolvedVariants,
|
|
570
572
|
setVariants: () => {},
|
|
571
573
|
setDefaultVariants: (newDefaults) => {
|
|
572
|
-
for (const [key, value] of Object.entries(newDefaults)) if (
|
|
574
|
+
for (const [key, value] of Object.entries(newDefaults)) if (userProps[key] === void 0) computedDefaults[key] = value;
|
|
573
575
|
}
|
|
574
576
|
};
|
|
575
577
|
config.computed(context);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["cx","clsx","cv","component"],"sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/utils.ts","../src/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import type * as CSS from \"csstype\";\nimport type {\n HTMLCSSProperties,\n JSXCSSProperties,\n StyleValue,\n} from \"./types.ts\";\n\nexport const MODES = [\"jsx\", \"html\", \"htmlObj\"] as const;\nexport type Mode = (typeof MODES)[number];\n\n/**\n * Returns the appropriate class property name based on the mode.\n * @example\n * getClassPropertyName(\"jsx\") // \"className\"\n * getClassPropertyName(\"html\") // \"class\"\n */\nexport function getClassPropertyName(mode: Mode) {\n return mode === \"jsx\" ? \"className\" : \"class\";\n}\n\n/**\n * Converts a hyphenated CSS property name to camelCase.\n * @example\n * hyphenToCamel(\"background-color\") // \"backgroundColor\"\n * hyphenToCamel(\"--custom-var\") // \"--custom-var\" (CSS variables are preserved)\n */\nexport function hyphenToCamel(str: string) {\n // CSS custom properties (variables) should not be converted\n if (str.startsWith(\"--\")) {\n return str;\n }\n return str.replace(/-([a-z])/gi, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Converts a camelCase CSS property name to hyphenated form.\n * @example\n * camelToHyphen(\"backgroundColor\") // \"background-color\"\n * camelToHyphen(\"--customVar\") // \"--customVar\" (CSS variables are preserved)\n */\nexport function camelToHyphen(str: string) {\n // CSS custom properties (variables) should not be converted\n if (str.startsWith(\"--\")) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\n/**\n * Parses a length value, adding \"px\" if it's a number.\n * @example\n * parseLengthValue(16); // \"16px\"\n * parseLengthValue(\"2em\"); // \"2em\"\n */\nexport function parseLengthValue(value: string | number) {\n if (typeof value === \"string\") return value;\n return `${value}px`;\n}\n\n/**\n * Parses a CSS style string into a StyleValue object.\n * @example\n * htmlStyleToStyleValue(\"background-color: red; font-size: 16px;\");\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function htmlStyleToStyleValue(styleString: string) {\n if (!styleString) return {};\n\n const result: StyleValue = {};\n const declarations = styleString.split(\";\");\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim();\n if (!trimmed) continue;\n\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) continue;\n\n const property = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n if (!property) continue;\n if (!value) continue;\n\n const camelProperty = hyphenToCamel(property) as any;\n result[camelProperty] = value;\n }\n\n return result;\n}\n\n/**\n * Converts a hyphenated style object to a camelCase StyleValue object.\n * @example\n * htmlObjStyleToStyleValue({ \"background-color\": \"red\", \"font-size\": \"16px\" });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function htmlObjStyleToStyleValue(style: HTMLCSSProperties) {\n const result: StyleValue = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n const property = hyphenToCamel(key) as any;\n result[property] = parseLengthValue(value);\n }\n return result;\n}\n\n/**\n * Converts a camelCase style object to a StyleValue object.\n * @example\n * jsxStyleToStyleValue({ backgroundColor: \"red\", fontSize: 16 });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function jsxStyleToStyleValue(style: JSXCSSProperties) {\n const result: StyleValue = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n result[key as any] = parseLengthValue(value);\n }\n return result;\n}\n\n/**\n * Converts a StyleValue object to a CSS style string.\n * @example\n * styleValueToHTMLStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // \"background-color: red; font-size: 16px;\"\n */\nexport function styleValueToHTMLStyle(style: StyleValue): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n parts.push(`${camelToHyphen(key)}: ${value}`);\n }\n if (!parts.length) return \"\";\n return `${parts.join(\"; \")};`;\n}\n\n/**\n * Converts a StyleValue object to a hyphenated style object.\n * @example\n * styleValueToHTMLObjStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // { \"background-color\": \"red\", \"font-size\": \"16px\" }\n */\nexport function styleValueToHTMLObjStyle(style: StyleValue) {\n const result: CSS.PropertiesHyphen = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n const property = camelToHyphen(key) as keyof HTMLCSSProperties;\n result[property] = value;\n }\n return result;\n}\n\n/**\n * Converts a StyleValue object to a camelCase style object.\n * @example\n * styleValueToJSXStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function styleValueToJSXStyle(style: StyleValue) {\n return style as JSXCSSProperties;\n}\n\n/**\n * Type guard to check if a style object has hyphenated keys.\n * @example\n * isHTMLObjStyle({ \"background-color\": \"red\" }); // true\n * isHTMLObjStyle({ backgroundColor: \"red\" }); // false\n */\nexport function isHTMLObjStyle(\n style: CSS.Properties<any> | CSS.PropertiesHyphen<any>,\n): style is CSS.PropertiesHyphen {\n return Object.keys(style).some(\n (key) => key.includes(\"-\") && !key.startsWith(\"--\"),\n );\n}\n","import clsx, { type ClassValue as ClsxClassValue } from \"clsx\";\nimport type {\n AnyComponent,\n CVComponent,\n ClassValue,\n ComponentProps,\n ComponentResult,\n Computed,\n ComputedContext,\n ComputedVariants,\n ExtendableVariants,\n HTMLObjProps,\n HTMLProps,\n JSXProps,\n MergeVariants,\n ModalComponent,\n SplitPropsFunction,\n StyleClassValue,\n StyleProps,\n StyleValue,\n VariantValues,\n Variants,\n} from \"./types.ts\";\nimport {\n type Mode,\n getClassPropertyName,\n htmlObjStyleToStyleValue,\n htmlStyleToStyleValue,\n isHTMLObjStyle,\n jsxStyleToStyleValue,\n styleValueToHTMLObjStyle,\n styleValueToHTMLStyle,\n styleValueToJSXStyle,\n} from \"./utils.ts\";\n\nexport type {\n ClassValue,\n StyleValue,\n StyleClassValue,\n JSXProps,\n HTMLProps,\n HTMLObjProps,\n CVComponent,\n};\n\nexport type VariantProps<T extends Pick<AnyComponent, \"getVariants\">> =\n ReturnType<T[\"getVariants\"]>;\n\nexport interface CVConfig<\n V extends Variants = {},\n CV extends ComputedVariants = {},\n E extends AnyComponent[] = [],\n> {\n extend?: E;\n class?: ClassValue;\n style?: StyleValue;\n variants?: ExtendableVariants<V, E>;\n computedVariants?: CV;\n defaultVariants?: VariantValues<MergeVariants<V, CV, E>>;\n computed?: Computed<MergeVariants<V, CV, E>>;\n}\n\ninterface CreateParams<M extends Mode> {\n defaultMode?: M;\n transformClass?: (className: string) => string;\n}\n\n/**\n * Checks if a value is a style-class object (has style properties, not just a\n * class value).\n */\nfunction isStyleClassValue(value: unknown): value is StyleClassValue {\n if (typeof value !== \"object\") return false;\n if (value == null) return false;\n if (Array.isArray(value)) return false;\n return true;\n}\n\n/**\n * Converts any style input (string, JSX object, or HTML object) to a\n * normalized StyleValue.\n */\nfunction normalizeStyle(style: unknown): StyleValue {\n if (typeof style === \"string\") {\n return htmlStyleToStyleValue(style);\n }\n if (typeof style === \"object\" && style != null) {\n if (isHTMLObjStyle(style as Record<string, unknown>)) {\n return htmlObjStyleToStyleValue(style as Record<string, string | number>);\n }\n return jsxStyleToStyleValue(style as Record<string, string | number>);\n }\n return {};\n}\n\n/**\n * Extracts class and style from a style-class value object.\n */\nfunction extractStyleClass(value: StyleClassValue): {\n class: ClassValue;\n style: StyleValue;\n} {\n const { class: cls, ...style } = value;\n return { class: cls, style };\n}\n\n/**\n * Processes a variant value to extract class and style.\n */\nfunction processVariantValue(value: unknown): {\n class: ClassValue;\n style: StyleValue;\n} {\n if (isStyleClassValue(value)) {\n return extractStyleClass(value);\n }\n return { class: value as ClassValue, style: {} };\n}\n\n/**\n * Gets all variant keys from a component's config, including extended\n * components.\n */\nfunction collectVariantKeys(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n): string[] {\n const keys = new Set<string>();\n\n // Collect from extended components\n if (config.extend) {\n for (const ext of config.extend) {\n for (const key of ext.variantKeys) {\n keys.add(key as string);\n }\n }\n }\n\n // Collect from variants\n if (config.variants) {\n for (const key of Object.keys(config.variants)) {\n keys.add(key);\n }\n }\n\n // Collect from computedVariants\n if (config.computedVariants) {\n for (const key of Object.keys(config.computedVariants)) {\n keys.add(key);\n }\n }\n\n return Array.from(keys);\n}\n\n/**\n * Collects static default variants from extended components and the current\n * config. Also handles implicit boolean defaults (when only `false` key\n * exists).\n */\nfunction collectStaticDefaults(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n): Record<string, unknown> {\n let defaults: Record<string, unknown> = {};\n\n // Collect static defaults from extended components\n if (config.extend) {\n for (const ext of config.extend) {\n const extDefaults = ext.getVariants();\n defaults = { ...defaults, ...extDefaults };\n }\n }\n\n // Handle implicit boolean defaults from variants\n // If a variant only has a `false` key and no `true` key, default to false\n if (config.variants) {\n for (const [variantName, variantDef] of Object.entries(config.variants)) {\n if (isStyleClassValue(variantDef)) {\n const keys = Object.keys(variantDef);\n const hasFalseOnly = keys.includes(\"false\") && !keys.includes(\"true\");\n if (hasFalseOnly && defaults[variantName] === undefined) {\n defaults[variantName] = false;\n }\n }\n }\n }\n\n // Override with current config's static defaults\n if (config.defaultVariants) {\n defaults = { ...defaults, ...config.defaultVariants };\n }\n\n return defaults;\n}\n\n/**\n * Collects default variants from extended components and the current config.\n * This includes both static defaults and computed defaults (from\n * setDefaultVariants in extended components' computed functions).\n * Priority: parent static < child static < parent computed < child computed.\n */\nfunction collectDefaultVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n propsVariants: Record<string, unknown> = {},\n): Record<string, unknown> {\n // Start with static defaults (parent static < child static)\n let defaults = collectStaticDefaults(config);\n\n // Apply computed defaults from extended components\n // Parent's setDefaultVariants should override child's static defaults\n // Pass propsVariants so parent's computed can access user-provided props\n if (config.extend) {\n for (const ext of config.extend) {\n // _resolveDefaults returns the computed defaults after running the\n // parent's computed function, including setDefaultVariants effects\n if (ext._resolveDefaults) {\n const extComputedDefaults = ext._resolveDefaults(propsVariants);\n defaults = { ...defaults, ...extComputedDefaults };\n }\n }\n }\n\n return defaults;\n}\n\n/**\n * Filters out keys with undefined values from an object.\n */\nfunction filterUndefined(\n obj: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolves variant values by merging defaults with provided props.\n * Props with undefined values are filtered out so they don't override defaults.\n */\nfunction resolveVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n props: Record<string, unknown> = {},\n): Record<string, unknown> {\n const defaults = collectDefaultVariants(config, props);\n return { ...defaults, ...filterUndefined(props) };\n}\n\n/**\n * Gets the value for a single variant based on the variant definition and the\n * selected value.\n */\nfunction getVariantResult(\n variantDef: unknown,\n selectedValue: unknown,\n): { class: ClassValue; style: StyleValue } {\n // Shorthand variant: `disabled: \"disabled-class\"` means { true: \"...\" }\n if (!isStyleClassValue(variantDef)) {\n if (selectedValue === true) {\n return processVariantValue(variantDef);\n }\n return { class: null, style: {} };\n }\n\n // Object variant: { sm: \"...\", lg: \"...\" }\n const key = String(selectedValue);\n const value = (variantDef as Record<string, unknown>)[key];\n if (value === undefined) return { class: null, style: {} };\n\n return processVariantValue(value);\n}\n\n/**\n * Processes extended components and returns base classes and variant classes separately.\n * Base classes should come before current component's base, variant classes come after.\n * When overrideVariantKeys is provided, those variant keys are excluded from the extended\n * component's result (used when current component's computedVariants overrides them).\n */\nfunction processExtended(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n overrideVariantKeys: Set<string> = new Set(),\n): {\n baseClasses: ClassValue[];\n variantClasses: ClassValue[];\n style: StyleValue;\n} {\n const baseClasses: ClassValue[] = [];\n const variantClasses: ClassValue[] = [];\n let style: StyleValue = {};\n\n if (config.extend) {\n for (const ext of config.extend) {\n // Filter out variant keys that are being overridden by current component's computedVariants\n const filteredVariants = { ...resolvedVariants };\n for (const key of overrideVariantKeys) {\n delete filteredVariants[key];\n }\n\n // Get the result with filtered variants (excluding overridden keys)\n const extResult = ext({ ...filteredVariants });\n\n // Only merge style for non-overridden keys\n const extStyle = normalizeStyle(extResult.style);\n style = { ...style, ...extStyle };\n\n // Get base class from internal property (no variants)\n const baseClass = ext._baseClass;\n baseClasses.push(baseClass);\n\n // Get full class with variants\n const fullClass =\n \"className\" in extResult ? extResult.className : extResult.class;\n\n // Extract variant portion (full class minus base class)\n if (fullClass && baseClass) {\n const baseClassSet = new Set(baseClass.split(\" \").filter(Boolean));\n const variantPortion = fullClass\n .split(\" \")\n .filter((c: string) => c && !baseClassSet.has(c))\n .join(\" \");\n if (variantPortion) {\n variantClasses.push(variantPortion);\n }\n } else if (fullClass && !baseClass) {\n variantClasses.push(fullClass);\n }\n }\n }\n\n return { baseClasses, variantClasses, style };\n}\n\n/**\n * Processes all variants (not extended) and returns accumulated class and\n * style.\n */\nfunction processVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n): { classes: ClassValue[]; style: StyleValue } {\n const classes: ClassValue[] = [];\n let style: StyleValue = {};\n\n // Process current component's variants\n if (config.variants) {\n for (const [variantName, variantDef] of Object.entries(config.variants)) {\n const selectedValue = resolvedVariants[variantName];\n if (selectedValue === undefined) continue;\n\n const result = getVariantResult(variantDef, selectedValue);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n // Process computedVariants\n if (config.computedVariants) {\n for (const [variantName, computeFn] of Object.entries(\n config.computedVariants,\n )) {\n const selectedValue = resolvedVariants[variantName];\n if (selectedValue === undefined) continue;\n\n const computedResult = computeFn(selectedValue);\n const result = processVariantValue(computedResult);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n return { classes, style };\n}\n\n/**\n * Processes the computed function if present.\n */\nfunction processComputed(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n propsVariants: Record<string, unknown>,\n): {\n classes: ClassValue[];\n style: StyleValue;\n updatedVariants: Record<string, unknown>;\n} {\n const classes: ClassValue[] = [];\n let style: StyleValue = {};\n let updatedVariants = { ...resolvedVariants };\n\n if (config.computed) {\n const context = {\n variants: resolvedVariants,\n setVariants: (newVariants: VariantValues<Record<string, unknown>>) => {\n updatedVariants = { ...updatedVariants, ...newVariants };\n },\n setDefaultVariants: (\n newDefaults: VariantValues<Record<string, unknown>>,\n ) => {\n // Only apply defaults for variants not explicitly set in props\n for (const [key, value] of Object.entries(newDefaults)) {\n if (propsVariants[key] === undefined) {\n updatedVariants[key] = value;\n }\n }\n },\n };\n\n const computedResult = config.computed(context);\n if (computedResult != null) {\n const result = processVariantValue(computedResult);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n return { classes, style, updatedVariants };\n}\n\ninterface NormalizedSource {\n keys: string[];\n variantKeys: string[];\n defaults: Record<string, unknown>;\n isComponent: boolean;\n}\n\n/**\n * Normalizes a key source (array or component) to an object with keys, variantKeys, defaults, and isComponent flag.\n */\nfunction normalizeKeySource(source: unknown): NormalizedSource {\n if (Array.isArray(source)) {\n return {\n keys: source as string[],\n variantKeys: source as string[],\n defaults: {},\n isComponent: false,\n };\n }\n // Components are functions with keys and variantKeys properties\n if (\n source &&\n (typeof source === \"object\" || typeof source === \"function\") &&\n \"keys\" in source &&\n \"variantKeys\" in source\n ) {\n const keys = [...(source as { keys: string[] }).keys] as string[];\n const variantKeys = [\n ...(source as { variantKeys: string[] }).variantKeys,\n ] as string[];\n const defaults =\n \"getVariants\" in source\n ? (\n source as { getVariants: () => Record<string, unknown> }\n ).getVariants()\n : {};\n return { keys, variantKeys, defaults, isComponent: true };\n }\n return { keys: [], variantKeys: [], defaults: {}, isComponent: false };\n}\n\n/**\n * Splits props into multiple groups based on key sources.\n * Only the first component claims styling props (class/className/style).\n * Subsequent components only receive variant props.\n * Arrays always receive their listed keys but don't claim styling props.\n */\nfunction splitPropsImpl(\n selfKeys: string[],\n selfVariantKeys: string[],\n selfDefaults: Record<string, unknown>,\n selfIsComponent: boolean,\n props: Record<string, unknown>,\n sources: NormalizedSource[],\n): Record<string, unknown>[] {\n const allUsedKeys = new Set<string>(selfKeys);\n const results: Record<string, unknown>[] = [];\n\n // Track if styling has been claimed by a component\n let stylingClaimed = selfIsComponent;\n\n // Self result\n const selfResult: Record<string, unknown> = {};\n for (const key of selfKeys) {\n if (key in props) {\n selfResult[key] = props[key];\n }\n }\n results.push(selfResult);\n\n // Process each source\n for (const source of sources) {\n const sourceResult: Record<string, unknown> = {};\n\n // Determine which keys this source should use\n // Components use variantKeys if styling has already been claimed\n // Arrays always use their listed keys\n const effectiveKeys =\n source.isComponent && stylingClaimed ? source.variantKeys : source.keys;\n\n for (const key of effectiveKeys) {\n allUsedKeys.add(key);\n if (key in props) {\n sourceResult[key] = props[key];\n }\n }\n results.push(sourceResult);\n\n // If this is a component that hasn't claimed styling yet, mark styling as claimed\n if (source.isComponent && !stylingClaimed) {\n stylingClaimed = true;\n }\n }\n\n // Rest - keys not used by anyone\n const rest: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!allUsedKeys.has(key)) {\n rest[key] = value;\n }\n }\n results.push(rest);\n\n return results;\n}\n\n/**\n * Splits props into multiple groups based on key sources.\n * Each source gets its own result object containing all its matching keys.\n * The first component source claims styling props (class/className/style).\n * Subsequent components only receive variant props.\n * Arrays receive their listed keys but don't claim styling props.\n * The last element is always the \"rest\" containing keys not claimed by any source.\n *\n * @example\n * ```ts\n * const [buttonProps, inputProps, rest] = splitProps(\n * props,\n * buttonComponent,\n * inputComponent,\n * );\n * // buttonProps has class/style + button variants\n * // inputProps has only input variants (no class/style)\n * ```\n */\nexport const splitProps: SplitPropsFunction = ((\n props: Record<string, unknown>,\n source1: unknown,\n ...sources: unknown[]\n) => {\n const normalizedSource1 = normalizeKeySource(source1);\n const normalizedSources = sources.map(normalizeKeySource);\n return splitPropsImpl(\n normalizedSource1.keys,\n normalizedSource1.variantKeys,\n normalizedSource1.defaults,\n normalizedSource1.isComponent,\n props,\n normalizedSources,\n );\n}) as SplitPropsFunction;\n\nexport function create<M extends Mode = \"jsx\">({\n defaultMode = \"jsx\" as M,\n transformClass = (className) => className,\n}: CreateParams<M> = {}) {\n const cx = (...classes: ClsxClassValue[]) => transformClass(clsx(...classes));\n\n const cv = <\n V extends Variants = {},\n CV extends ComputedVariants = {},\n const E extends AnyComponent[] = [],\n >(\n config: CVConfig<V, CV, E> = {},\n ): CVComponent<V, CV, E, StyleProps[M]> => {\n type MergedVariants = MergeVariants<V, CV, E>;\n\n const variantKeys = collectVariantKeys(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n );\n\n const getPropsKeys = (mode: Mode) => [\n getClassPropertyName(mode),\n \"style\",\n ...variantKeys,\n ];\n\n const computeResult = (\n props: ComponentProps<MergedVariants> = {},\n ): { className: string; style: StyleValue } => {\n const allClasses: ClassValue[] = [];\n let allStyle: StyleValue = {};\n\n // Extract variant props from input\n const variantProps: Record<string, unknown> = {};\n for (const key of variantKeys) {\n if (key in props) {\n variantProps[key] = (props as Record<string, unknown>)[key];\n }\n }\n\n // Resolve variants with defaults\n let resolvedVariants = resolveVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n variantProps,\n );\n\n // Process computed first to potentially update variants\n const computedResult = processComputed(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n variantProps,\n );\n resolvedVariants = computedResult.updatedVariants;\n\n // Collect computedVariants keys that will override extended variants\n const computedVariantKeys = new Set<string>(\n config.computedVariants ? Object.keys(config.computedVariants) : [],\n );\n\n // Process extended components (separates base and variant classes)\n const extendedResult = processExtended(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n computedVariantKeys,\n );\n\n // 1. Extended base classes first\n allClasses.push(...extendedResult.baseClasses);\n allStyle = { ...allStyle, ...extendedResult.style };\n\n // 2. Current component's base class\n allClasses.push(config.class);\n\n // 3. Add base style\n if (config.style) {\n allStyle = { ...allStyle, ...config.style };\n }\n\n // 4. Extended variant classes\n allClasses.push(...extendedResult.variantClasses);\n\n // 5. Current component's variants\n const variantsResult = processVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n );\n allClasses.push(...variantsResult.classes);\n allStyle = { ...allStyle, ...variantsResult.style };\n\n // Add computed results\n allClasses.push(...computedResult.classes);\n allStyle = { ...allStyle, ...computedResult.style };\n\n // Merge class from props\n if (\"class\" in props) {\n allClasses.push(props.class);\n }\n if (\"className\" in props) {\n allClasses.push(props.className);\n }\n\n // Merge style from props\n if (props.style != null) {\n allStyle = { ...allStyle, ...normalizeStyle(props.style) };\n }\n\n return {\n className: cx(...(allClasses as ClsxClassValue[])),\n style: allStyle,\n };\n };\n\n const createModalComponent = <R extends ComponentResult>(\n mode: Mode,\n ): ModalComponent<MergedVariants, R> => {\n const propsKeys = getPropsKeys(mode);\n\n const component = ((props: ComponentProps<MergedVariants> = {}) => {\n const { className, style } = computeResult(props);\n\n if (mode === \"jsx\") {\n return { className, style: styleValueToJSXStyle(style) } as R;\n }\n if (mode === \"html\") {\n return {\n class: className,\n style: styleValueToHTMLStyle(style),\n } as R;\n }\n // htmlObj\n return {\n class: className,\n style: styleValueToHTMLObjStyle(style),\n } as R;\n }) as ModalComponent<MergedVariants, R>;\n\n component.class = (props: ComponentProps<MergedVariants> = {}) => {\n return computeResult(props).className;\n };\n\n component.style = ((props: ComponentProps<MergedVariants> = {}) => {\n const { style } = computeResult(props);\n if (mode === \"jsx\") return styleValueToJSXStyle(style);\n if (mode === \"html\") return styleValueToHTMLStyle(style);\n return styleValueToHTMLObjStyle(style);\n }) as ModalComponent<MergedVariants, R>[\"style\"];\n\n component.getVariants = (\n variants?: VariantValues<MergedVariants>,\n ): VariantValues<MergedVariants> => {\n return resolveVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n variants as VariantValues<Record<string, unknown>>,\n ) as VariantValues<MergedVariants>;\n };\n\n component.keys = propsKeys as (keyof MergedVariants | keyof R)[];\n\n component.variantKeys = variantKeys as (keyof MergedVariants)[];\n\n component.propKeys = propsKeys as (keyof MergedVariants | keyof R)[];\n\n // Compute base class (without variants) - includes extended base classes\n const extendedBaseClasses: ClassValue[] = [];\n if (config.extend) {\n for (const ext of config.extend) {\n extendedBaseClasses.push(ext._baseClass);\n }\n }\n component._baseClass = cx(\n ...(extendedBaseClasses as ClsxClassValue[]),\n config.class as ClsxClassValue,\n );\n\n // Returns only the variants set via setDefaultVariants in the computed\n // function. Used by child components to get parent's computed defaults.\n component._resolveDefaults = (\n propsVariants: Record<string, unknown>,\n ): Record<string, unknown> => {\n // Get static defaults (including from extended components)\n const staticDefaults = collectStaticDefaults(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n );\n\n // Merge with provided props\n const resolvedVariants = {\n ...staticDefaults,\n ...filterUndefined(propsVariants),\n };\n\n // Track which keys are set via setDefaultVariants\n const computedDefaults: Record<string, unknown> = {};\n\n if (config.computed) {\n const context: ComputedContext<MergedVariants> = {\n variants: resolvedVariants as VariantValues<MergedVariants>,\n setVariants: () => {\n // Not relevant for collecting defaults\n },\n setDefaultVariants: (newDefaults) => {\n // Only apply defaults for variants not explicitly set in props\n for (const [key, value] of Object.entries(newDefaults)) {\n if (propsVariants[key] === undefined) {\n computedDefaults[key] = value;\n }\n }\n },\n };\n config.computed(context);\n }\n\n return computedDefaults;\n };\n\n return component;\n };\n\n // Create the default modal component\n const defaultComponent = createModalComponent<StyleProps[M]>(defaultMode);\n\n // Create all modal variants\n const jsxComponent = createModalComponent<JSXProps>(\"jsx\");\n const htmlComponent = createModalComponent<HTMLProps>(\"html\");\n const htmlObjComponent = createModalComponent<HTMLObjProps>(\"htmlObj\");\n\n // Build the final component\n const component = defaultComponent as CVComponent<V, CV, E, StyleProps[M]>;\n component.jsx = jsxComponent;\n component.html = htmlComponent;\n component.htmlObj = htmlObjComponent;\n\n return component;\n };\n\n return { cv, cx };\n}\n\nexport const { cv, cx } = create();\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["cx","clsx","cv","component"],"sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/utils.ts","../src/index.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import type * as CSS from \"csstype\";\nimport type {\n HTMLCSSProperties,\n JSXCSSProperties,\n StyleValue,\n} from \"./types.ts\";\n\nexport const MODES = [\"jsx\", \"html\", \"htmlObj\"] as const;\nexport type Mode = (typeof MODES)[number];\n\n/**\n * Returns the appropriate class property name based on the mode.\n * @example\n * getClassPropertyName(\"jsx\") // \"className\"\n * getClassPropertyName(\"html\") // \"class\"\n */\nexport function getClassPropertyName(mode: Mode) {\n return mode === \"jsx\" ? \"className\" : \"class\";\n}\n\n/**\n * Converts a hyphenated CSS property name to camelCase.\n * @example\n * hyphenToCamel(\"background-color\") // \"backgroundColor\"\n * hyphenToCamel(\"--custom-var\") // \"--custom-var\" (CSS variables are preserved)\n */\nexport function hyphenToCamel(str: string) {\n // CSS custom properties (variables) should not be converted\n if (str.startsWith(\"--\")) {\n return str;\n }\n return str.replace(/-([a-z])/gi, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Converts a camelCase CSS property name to hyphenated form.\n * @example\n * camelToHyphen(\"backgroundColor\") // \"background-color\"\n * camelToHyphen(\"--customVar\") // \"--customVar\" (CSS variables are preserved)\n */\nexport function camelToHyphen(str: string) {\n // CSS custom properties (variables) should not be converted\n if (str.startsWith(\"--\")) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\n/**\n * Parses a length value, adding \"px\" if it's a number.\n * @example\n * parseLengthValue(16); // \"16px\"\n * parseLengthValue(\"2em\"); // \"2em\"\n */\nexport function parseLengthValue(value: string | number) {\n if (typeof value === \"string\") return value;\n return `${value}px`;\n}\n\n/**\n * Parses a CSS style string into a StyleValue object.\n * @example\n * htmlStyleToStyleValue(\"background-color: red; font-size: 16px;\");\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function htmlStyleToStyleValue(styleString: string) {\n if (!styleString) return {};\n\n const result: StyleValue = {};\n const declarations = styleString.split(\";\");\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim();\n if (!trimmed) continue;\n\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex === -1) continue;\n\n const property = trimmed.slice(0, colonIndex).trim();\n const value = trimmed.slice(colonIndex + 1).trim();\n if (!property) continue;\n if (!value) continue;\n\n const camelProperty = hyphenToCamel(property) as any;\n result[camelProperty] = value;\n }\n\n return result;\n}\n\n/**\n * Converts a hyphenated style object to a camelCase StyleValue object.\n * @example\n * htmlObjStyleToStyleValue({ \"background-color\": \"red\", \"font-size\": \"16px\" });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function htmlObjStyleToStyleValue(style: HTMLCSSProperties) {\n const result: StyleValue = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n const property = hyphenToCamel(key) as any;\n result[property] = parseLengthValue(value);\n }\n return result;\n}\n\n/**\n * Converts a camelCase style object to a StyleValue object.\n * @example\n * jsxStyleToStyleValue({ backgroundColor: \"red\", fontSize: 16 });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function jsxStyleToStyleValue(style: JSXCSSProperties) {\n const result: StyleValue = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n result[key as any] = parseLengthValue(value);\n }\n return result;\n}\n\n/**\n * Converts a StyleValue object to a CSS style string.\n * @example\n * styleValueToHTMLStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // \"background-color: red; font-size: 16px;\"\n */\nexport function styleValueToHTMLStyle(style: StyleValue): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n parts.push(`${camelToHyphen(key)}: ${value}`);\n }\n if (!parts.length) return \"\";\n return `${parts.join(\"; \")};`;\n}\n\n/**\n * Converts a StyleValue object to a hyphenated style object.\n * @example\n * styleValueToHTMLObjStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // { \"background-color\": \"red\", \"font-size\": \"16px\" }\n */\nexport function styleValueToHTMLObjStyle(style: StyleValue) {\n const result: CSS.PropertiesHyphen = {};\n for (const [key, value] of Object.entries(style)) {\n if (value == null) continue;\n const property = camelToHyphen(key) as keyof HTMLCSSProperties;\n result[property] = value;\n }\n return result;\n}\n\n/**\n * Converts a StyleValue object to a camelCase style object.\n * @example\n * styleValueToJSXStyle({ backgroundColor: \"red\", fontSize: \"16px\" });\n * // { backgroundColor: \"red\", fontSize: \"16px\" }\n */\nexport function styleValueToJSXStyle(style: StyleValue) {\n return style as JSXCSSProperties;\n}\n\n/**\n * Type guard to check if a style object has hyphenated keys.\n * @example\n * isHTMLObjStyle({ \"background-color\": \"red\" }); // true\n * isHTMLObjStyle({ backgroundColor: \"red\" }); // false\n */\nexport function isHTMLObjStyle(\n style: CSS.Properties<any> | CSS.PropertiesHyphen<any>,\n): style is CSS.PropertiesHyphen {\n return Object.keys(style).some(\n (key) => key.includes(\"-\") && !key.startsWith(\"--\"),\n );\n}\n","import clsx, { type ClassValue as ClsxClassValue } from \"clsx\";\nimport type {\n AnyComponent,\n CVComponent,\n ClassValue,\n ComponentProps,\n ComponentResult,\n Computed,\n ComputedContext,\n ComputedVariants,\n ExtendableVariants,\n HTMLObjProps,\n HTMLProps,\n JSXProps,\n MergeVariants,\n ModalComponent,\n SplitPropsFunction,\n StyleClassValue,\n StyleProps,\n StyleValue,\n VariantValues,\n Variants,\n} from \"./types.ts\";\nimport {\n type Mode,\n getClassPropertyName,\n htmlObjStyleToStyleValue,\n htmlStyleToStyleValue,\n isHTMLObjStyle,\n jsxStyleToStyleValue,\n styleValueToHTMLObjStyle,\n styleValueToHTMLStyle,\n styleValueToJSXStyle,\n} from \"./utils.ts\";\n\nexport type {\n ClassValue,\n StyleValue,\n StyleClassValue,\n JSXProps,\n HTMLProps,\n HTMLObjProps,\n CVComponent,\n};\n\nexport type VariantProps<T extends Pick<AnyComponent, \"getVariants\">> =\n ReturnType<T[\"getVariants\"]>;\n\nexport interface CVConfig<\n V extends Variants = {},\n CV extends ComputedVariants = {},\n E extends AnyComponent[] = [],\n> {\n extend?: E;\n class?: ClassValue;\n style?: StyleValue;\n variants?: ExtendableVariants<V, E>;\n computedVariants?: CV;\n defaultVariants?: VariantValues<MergeVariants<V, CV, E>>;\n computed?: Computed<MergeVariants<V, CV, E>>;\n}\n\ninterface CreateParams<M extends Mode> {\n defaultMode?: M;\n transformClass?: (className: string) => string;\n}\n\n/**\n * Checks if a value is a style-class object (has style properties, not just a\n * class value).\n */\nfunction isStyleClassValue(value: unknown): value is StyleClassValue {\n if (typeof value !== \"object\") return false;\n if (value == null) return false;\n if (Array.isArray(value)) return false;\n return true;\n}\n\n/**\n * Converts any style input (string, JSX object, or HTML object) to a\n * normalized StyleValue.\n */\nfunction normalizeStyle(style: unknown): StyleValue {\n if (typeof style === \"string\") {\n return htmlStyleToStyleValue(style);\n }\n if (typeof style === \"object\" && style != null) {\n if (isHTMLObjStyle(style as Record<string, unknown>)) {\n return htmlObjStyleToStyleValue(style as Record<string, string | number>);\n }\n return jsxStyleToStyleValue(style as Record<string, string | number>);\n }\n return {};\n}\n\n/**\n * Extracts class and style from a style-class value object.\n */\nfunction extractStyleClass(value: StyleClassValue): {\n class: ClassValue;\n style: StyleValue;\n} {\n const { class: cls, ...style } = value;\n return { class: cls, style };\n}\n\n/**\n * Processes a variant value to extract class and style.\n */\nfunction processVariantValue(value: unknown): {\n class: ClassValue;\n style: StyleValue;\n} {\n if (isStyleClassValue(value)) {\n return extractStyleClass(value);\n }\n return { class: value as ClassValue, style: {} };\n}\n\n/**\n * Gets all variant keys from a component's config, including extended\n * components.\n */\nfunction collectVariantKeys(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n): string[] {\n const keys = new Set<string>();\n\n // Collect from extended components\n if (config.extend) {\n for (const ext of config.extend) {\n for (const key of ext.variantKeys) {\n keys.add(key as string);\n }\n }\n }\n\n // Collect from variants\n if (config.variants) {\n for (const key of Object.keys(config.variants)) {\n keys.add(key);\n }\n }\n\n // Collect from computedVariants\n if (config.computedVariants) {\n for (const key of Object.keys(config.computedVariants)) {\n keys.add(key);\n }\n }\n\n return Array.from(keys);\n}\n\n/**\n * Collects static default variants from extended components and the current\n * config. Also handles implicit boolean defaults (when only `false` key\n * exists).\n */\nfunction collectStaticDefaults(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n): Record<string, unknown> {\n let defaults: Record<string, unknown> = {};\n\n // Collect static defaults from extended components\n if (config.extend) {\n for (const ext of config.extend) {\n const extDefaults = ext.getVariants();\n defaults = { ...defaults, ...extDefaults };\n }\n }\n\n // Handle implicit boolean defaults from variants\n // If a variant only has a `false` key and no `true` key, default to false\n if (config.variants) {\n for (const [variantName, variantDef] of Object.entries(config.variants)) {\n if (isStyleClassValue(variantDef)) {\n const keys = Object.keys(variantDef);\n const hasFalseOnly = keys.includes(\"false\") && !keys.includes(\"true\");\n if (hasFalseOnly && defaults[variantName] === undefined) {\n defaults[variantName] = false;\n }\n }\n }\n }\n\n // Override with current config's static defaults\n if (config.defaultVariants) {\n defaults = { ...defaults, ...config.defaultVariants };\n }\n\n return defaults;\n}\n\n/**\n * Collects default variants from extended components and the current config.\n * This includes both static defaults and computed defaults (from\n * setDefaultVariants in extended components' computed functions).\n * Priority: parent static < child static < parent computed < child computed.\n */\nfunction collectDefaultVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n propsVariants: Record<string, unknown> = {},\n): Record<string, unknown> {\n // Start with static defaults (parent static < child static)\n let defaults = collectStaticDefaults(config);\n\n // Apply computed defaults from extended components\n // Parent's setDefaultVariants should override child's static defaults\n // Pass child's static defaults so parent's computed can see them in `variants`\n // Pass user props separately so setDefaultVariants only checks against user props\n if (config.extend) {\n for (const ext of config.extend) {\n // _resolveDefaults returns the computed defaults after running the\n // parent's computed function, including setDefaultVariants effects\n if (ext._resolveDefaults) {\n const childStaticDefaults = config.defaultVariants || {};\n const extComputedDefaults = ext._resolveDefaults(\n childStaticDefaults,\n propsVariants,\n );\n defaults = { ...defaults, ...extComputedDefaults };\n }\n }\n }\n\n return defaults;\n}\n\n/**\n * Filters out keys with undefined values from an object.\n */\nfunction filterUndefined(\n obj: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolves variant values by merging defaults with provided props.\n * Props with undefined values are filtered out so they don't override defaults.\n */\nfunction resolveVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n props: Record<string, unknown> = {},\n): Record<string, unknown> {\n const defaults = collectDefaultVariants(config, props);\n return { ...defaults, ...filterUndefined(props) };\n}\n\n/**\n * Gets the value for a single variant based on the variant definition and the\n * selected value.\n */\nfunction getVariantResult(\n variantDef: unknown,\n selectedValue: unknown,\n): { class: ClassValue; style: StyleValue } {\n // Shorthand variant: `disabled: \"disabled-class\"` means { true: \"...\" }\n if (!isStyleClassValue(variantDef)) {\n if (selectedValue === true) {\n return processVariantValue(variantDef);\n }\n return { class: null, style: {} };\n }\n\n // Object variant: { sm: \"...\", lg: \"...\" }\n const key = String(selectedValue);\n const value = (variantDef as Record<string, unknown>)[key];\n if (value === undefined) return { class: null, style: {} };\n\n return processVariantValue(value);\n}\n\n/**\n * Processes extended components and returns base classes and variant classes separately.\n * Base classes should come before current component's base, variant classes come after.\n * When overrideVariantKeys is provided, those variant keys are excluded from the extended\n * component's result (used when current component's computedVariants overrides them).\n */\nfunction processExtended(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n overrideVariantKeys: Set<string> = new Set(),\n): {\n baseClasses: ClassValue[];\n variantClasses: ClassValue[];\n style: StyleValue;\n} {\n const baseClasses: ClassValue[] = [];\n const variantClasses: ClassValue[] = [];\n let style: StyleValue = {};\n\n if (config.extend) {\n for (const ext of config.extend) {\n // Filter out variant keys that are being overridden by current component's computedVariants\n const filteredVariants = { ...resolvedVariants };\n for (const key of overrideVariantKeys) {\n delete filteredVariants[key];\n }\n\n // Get the result with filtered variants (excluding overridden keys)\n const extResult = ext({ ...filteredVariants });\n\n // Only merge style for non-overridden keys\n const extStyle = normalizeStyle(extResult.style);\n style = { ...style, ...extStyle };\n\n // Get base class from internal property (no variants)\n const baseClass = ext._baseClass;\n baseClasses.push(baseClass);\n\n // Get full class with variants\n const fullClass =\n \"className\" in extResult ? extResult.className : extResult.class;\n\n // Extract variant portion (full class minus base class)\n if (fullClass && baseClass) {\n const baseClassSet = new Set(baseClass.split(\" \").filter(Boolean));\n const variantPortion = fullClass\n .split(\" \")\n .filter((c: string) => c && !baseClassSet.has(c))\n .join(\" \");\n if (variantPortion) {\n variantClasses.push(variantPortion);\n }\n } else if (fullClass && !baseClass) {\n variantClasses.push(fullClass);\n }\n }\n }\n\n return { baseClasses, variantClasses, style };\n}\n\n/**\n * Processes all variants (not extended) and returns accumulated class and\n * style.\n */\nfunction processVariants(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n): { classes: ClassValue[]; style: StyleValue } {\n const classes: ClassValue[] = [];\n let style: StyleValue = {};\n\n // Process current component's variants\n if (config.variants) {\n for (const [variantName, variantDef] of Object.entries(config.variants)) {\n const selectedValue = resolvedVariants[variantName];\n if (selectedValue === undefined) continue;\n\n const result = getVariantResult(variantDef, selectedValue);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n // Process computedVariants\n if (config.computedVariants) {\n for (const [variantName, computeFn] of Object.entries(\n config.computedVariants,\n )) {\n const selectedValue = resolvedVariants[variantName];\n if (selectedValue === undefined) continue;\n\n const computedResult = computeFn(selectedValue);\n const result = processVariantValue(computedResult);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n return { classes, style };\n}\n\n/**\n * Processes the computed function if present.\n */\nfunction processComputed(\n config: CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants: Record<string, unknown>,\n propsVariants: Record<string, unknown>,\n): {\n classes: ClassValue[];\n style: StyleValue;\n updatedVariants: Record<string, unknown>;\n} {\n const classes: ClassValue[] = [];\n let style: StyleValue = {};\n let updatedVariants = { ...resolvedVariants };\n\n if (config.computed) {\n const context = {\n variants: resolvedVariants,\n setVariants: (newVariants: VariantValues<Record<string, unknown>>) => {\n updatedVariants = { ...updatedVariants, ...newVariants };\n },\n setDefaultVariants: (\n newDefaults: VariantValues<Record<string, unknown>>,\n ) => {\n // Only apply defaults for variants not explicitly set in props\n for (const [key, value] of Object.entries(newDefaults)) {\n if (propsVariants[key] === undefined) {\n updatedVariants[key] = value;\n }\n }\n },\n };\n\n const computedResult = config.computed(context);\n if (computedResult != null) {\n const result = processVariantValue(computedResult);\n classes.push(result.class);\n style = { ...style, ...result.style };\n }\n }\n\n return { classes, style, updatedVariants };\n}\n\ninterface NormalizedSource {\n keys: string[];\n variantKeys: string[];\n defaults: Record<string, unknown>;\n isComponent: boolean;\n}\n\n/**\n * Normalizes a key source (array or component) to an object with keys, variantKeys, defaults, and isComponent flag.\n */\nfunction normalizeKeySource(source: unknown): NormalizedSource {\n if (Array.isArray(source)) {\n return {\n keys: source as string[],\n variantKeys: source as string[],\n defaults: {},\n isComponent: false,\n };\n }\n // Components are functions with keys and variantKeys properties\n if (\n source &&\n (typeof source === \"object\" || typeof source === \"function\") &&\n \"keys\" in source &&\n \"variantKeys\" in source\n ) {\n const keys = [...(source as { keys: string[] }).keys] as string[];\n const variantKeys = [\n ...(source as { variantKeys: string[] }).variantKeys,\n ] as string[];\n const defaults =\n \"getVariants\" in source\n ? (\n source as { getVariants: () => Record<string, unknown> }\n ).getVariants()\n : {};\n return { keys, variantKeys, defaults, isComponent: true };\n }\n return { keys: [], variantKeys: [], defaults: {}, isComponent: false };\n}\n\n/**\n * Splits props into multiple groups based on key sources.\n * Only the first component claims styling props (class/className/style).\n * Subsequent components only receive variant props.\n * Arrays always receive their listed keys but don't claim styling props.\n */\nfunction splitPropsImpl(\n selfKeys: string[],\n selfVariantKeys: string[],\n selfDefaults: Record<string, unknown>,\n selfIsComponent: boolean,\n props: Record<string, unknown>,\n sources: NormalizedSource[],\n): Record<string, unknown>[] {\n const allUsedKeys = new Set<string>(selfKeys);\n const results: Record<string, unknown>[] = [];\n\n // Track if styling has been claimed by a component\n let stylingClaimed = selfIsComponent;\n\n // Self result\n const selfResult: Record<string, unknown> = {};\n for (const key of selfKeys) {\n if (key in props) {\n selfResult[key] = props[key];\n }\n }\n results.push(selfResult);\n\n // Process each source\n for (const source of sources) {\n const sourceResult: Record<string, unknown> = {};\n\n // Determine which keys this source should use\n // Components use variantKeys if styling has already been claimed\n // Arrays always use their listed keys\n const effectiveKeys =\n source.isComponent && stylingClaimed ? source.variantKeys : source.keys;\n\n for (const key of effectiveKeys) {\n allUsedKeys.add(key);\n if (key in props) {\n sourceResult[key] = props[key];\n }\n }\n results.push(sourceResult);\n\n // If this is a component that hasn't claimed styling yet, mark styling as claimed\n if (source.isComponent && !stylingClaimed) {\n stylingClaimed = true;\n }\n }\n\n // Rest - keys not used by anyone\n const rest: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!allUsedKeys.has(key)) {\n rest[key] = value;\n }\n }\n results.push(rest);\n\n return results;\n}\n\n/**\n * Splits props into multiple groups based on key sources.\n * Each source gets its own result object containing all its matching keys.\n * The first component source claims styling props (class/className/style).\n * Subsequent components only receive variant props.\n * Arrays receive their listed keys but don't claim styling props.\n * The last element is always the \"rest\" containing keys not claimed by any source.\n *\n * @example\n * ```ts\n * const [buttonProps, inputProps, rest] = splitProps(\n * props,\n * buttonComponent,\n * inputComponent,\n * );\n * // buttonProps has class/style + button variants\n * // inputProps has only input variants (no class/style)\n * ```\n */\nexport const splitProps: SplitPropsFunction = ((\n props: Record<string, unknown>,\n source1: unknown,\n ...sources: unknown[]\n) => {\n const normalizedSource1 = normalizeKeySource(source1);\n const normalizedSources = sources.map(normalizeKeySource);\n return splitPropsImpl(\n normalizedSource1.keys,\n normalizedSource1.variantKeys,\n normalizedSource1.defaults,\n normalizedSource1.isComponent,\n props,\n normalizedSources,\n );\n}) as SplitPropsFunction;\n\nexport function create<M extends Mode = \"jsx\">({\n defaultMode = \"jsx\" as M,\n transformClass = (className) => className,\n}: CreateParams<M> = {}) {\n const cx = (...classes: ClsxClassValue[]) => transformClass(clsx(...classes));\n\n const cv = <\n V extends Variants = {},\n CV extends ComputedVariants = {},\n const E extends AnyComponent[] = [],\n >(\n config: CVConfig<V, CV, E> = {},\n ): CVComponent<V, CV, E, StyleProps[M]> => {\n type MergedVariants = MergeVariants<V, CV, E>;\n\n const variantKeys = collectVariantKeys(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n );\n\n const getPropsKeys = (mode: Mode) => [\n getClassPropertyName(mode),\n \"style\",\n ...variantKeys,\n ];\n\n const computeResult = (\n props: ComponentProps<MergedVariants> = {},\n ): { className: string; style: StyleValue } => {\n const allClasses: ClassValue[] = [];\n let allStyle: StyleValue = {};\n\n // Extract variant props from input\n const variantProps: Record<string, unknown> = {};\n for (const key of variantKeys) {\n if (key in props) {\n variantProps[key] = (props as Record<string, unknown>)[key];\n }\n }\n\n // Resolve variants with defaults\n let resolvedVariants = resolveVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n variantProps,\n );\n\n // Process computed first to potentially update variants\n const computedResult = processComputed(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n variantProps,\n );\n resolvedVariants = computedResult.updatedVariants;\n\n // Collect computedVariants keys that will override extended variants\n const computedVariantKeys = new Set<string>(\n config.computedVariants ? Object.keys(config.computedVariants) : [],\n );\n\n // Process extended components (separates base and variant classes)\n const extendedResult = processExtended(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n computedVariantKeys,\n );\n\n // 1. Extended base classes first\n allClasses.push(...extendedResult.baseClasses);\n allStyle = { ...allStyle, ...extendedResult.style };\n\n // 2. Current component's base class\n allClasses.push(config.class);\n\n // 3. Add base style\n if (config.style) {\n allStyle = { ...allStyle, ...config.style };\n }\n\n // 4. Extended variant classes\n allClasses.push(...extendedResult.variantClasses);\n\n // 5. Current component's variants\n const variantsResult = processVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n resolvedVariants,\n );\n allClasses.push(...variantsResult.classes);\n allStyle = { ...allStyle, ...variantsResult.style };\n\n // Add computed results\n allClasses.push(...computedResult.classes);\n allStyle = { ...allStyle, ...computedResult.style };\n\n // Merge class from props\n if (\"class\" in props) {\n allClasses.push(props.class);\n }\n if (\"className\" in props) {\n allClasses.push(props.className);\n }\n\n // Merge style from props\n if (props.style != null) {\n allStyle = { ...allStyle, ...normalizeStyle(props.style) };\n }\n\n return {\n className: cx(...(allClasses as ClsxClassValue[])),\n style: allStyle,\n };\n };\n\n const createModalComponent = <R extends ComponentResult>(\n mode: Mode,\n ): ModalComponent<MergedVariants, R> => {\n const propsKeys = getPropsKeys(mode);\n\n const component = ((props: ComponentProps<MergedVariants> = {}) => {\n const { className, style } = computeResult(props);\n\n if (mode === \"jsx\") {\n return { className, style: styleValueToJSXStyle(style) } as R;\n }\n if (mode === \"html\") {\n return {\n class: className,\n style: styleValueToHTMLStyle(style),\n } as R;\n }\n // htmlObj\n return {\n class: className,\n style: styleValueToHTMLObjStyle(style),\n } as R;\n }) as ModalComponent<MergedVariants, R>;\n\n component.class = (props: ComponentProps<MergedVariants> = {}) => {\n return computeResult(props).className;\n };\n\n component.style = ((props: ComponentProps<MergedVariants> = {}) => {\n const { style } = computeResult(props);\n if (mode === \"jsx\") return styleValueToJSXStyle(style);\n if (mode === \"html\") return styleValueToHTMLStyle(style);\n return styleValueToHTMLObjStyle(style);\n }) as ModalComponent<MergedVariants, R>[\"style\"];\n\n component.getVariants = (\n variants?: VariantValues<MergedVariants>,\n ): VariantValues<MergedVariants> => {\n return resolveVariants(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n variants as VariantValues<Record<string, unknown>>,\n ) as VariantValues<MergedVariants>;\n };\n\n component.keys = propsKeys as (keyof MergedVariants | keyof R)[];\n\n component.variantKeys = variantKeys as (keyof MergedVariants)[];\n\n component.propKeys = propsKeys as (keyof MergedVariants | keyof R)[];\n\n // Compute base class (without variants) - includes extended base classes\n const extendedBaseClasses: ClassValue[] = [];\n if (config.extend) {\n for (const ext of config.extend) {\n extendedBaseClasses.push(ext._baseClass);\n }\n }\n component._baseClass = cx(\n ...(extendedBaseClasses as ClsxClassValue[]),\n config.class as ClsxClassValue,\n );\n\n // Returns only the variants set via setDefaultVariants in the computed\n // function. Used by child components to get parent's computed defaults.\n // @param childDefaults - Child's static defaults (merged into variants)\n // @param userProps - Actual user props (for setDefaultVariants check)\n component._resolveDefaults = (\n childDefaults: Record<string, unknown>,\n userProps: Record<string, unknown> = {},\n ): Record<string, unknown> => {\n // Get static defaults (including from extended components)\n const staticDefaults = collectStaticDefaults(\n config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,\n );\n\n // Merge: parent static < child static < user props\n // This is what parent's computed will see in `variants`\n const resolvedVariants = {\n ...staticDefaults,\n ...filterUndefined(childDefaults),\n ...filterUndefined(userProps),\n };\n\n // Track which keys are set via setDefaultVariants\n const computedDefaults: Record<string, unknown> = {};\n\n if (config.computed) {\n const context: ComputedContext<MergedVariants> = {\n variants: resolvedVariants as VariantValues<MergedVariants>,\n setVariants: () => {\n // Not relevant for collecting defaults\n },\n setDefaultVariants: (newDefaults) => {\n // Only apply defaults for variants not explicitly set by user\n // (child's static defaults should not block setDefaultVariants)\n for (const [key, value] of Object.entries(newDefaults)) {\n if (userProps[key] === undefined) {\n computedDefaults[key] = value;\n }\n }\n },\n };\n config.computed(context);\n }\n\n return computedDefaults;\n };\n\n return component;\n };\n\n // Create the default modal component\n const defaultComponent = createModalComponent<StyleProps[M]>(defaultMode);\n\n // Create all modal variants\n const jsxComponent = createModalComponent<JSXProps>(\"jsx\");\n const htmlComponent = createModalComponent<HTMLProps>(\"html\");\n const htmlObjComponent = createModalComponent<HTMLObjProps>(\"htmlObj\");\n\n // Build the final component\n const component = defaultComponent as CVComponent<V, CV, E, StyleProps[M]>;\n component.jsx = jsxComponent;\n component.html = htmlComponent;\n component.htmlObj = htmlObjComponent;\n\n return component;\n };\n\n return { cv, cx };\n}\n\nexport const { cv, cx } = create();\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -207,13 +207,18 @@ function collectDefaultVariants(
|
|
|
207
207
|
|
|
208
208
|
// Apply computed defaults from extended components
|
|
209
209
|
// Parent's setDefaultVariants should override child's static defaults
|
|
210
|
-
// Pass
|
|
210
|
+
// Pass child's static defaults so parent's computed can see them in `variants`
|
|
211
|
+
// Pass user props separately so setDefaultVariants only checks against user props
|
|
211
212
|
if (config.extend) {
|
|
212
213
|
for (const ext of config.extend) {
|
|
213
214
|
// _resolveDefaults returns the computed defaults after running the
|
|
214
215
|
// parent's computed function, including setDefaultVariants effects
|
|
215
216
|
if (ext._resolveDefaults) {
|
|
216
|
-
const
|
|
217
|
+
const childStaticDefaults = config.defaultVariants || {};
|
|
218
|
+
const extComputedDefaults = ext._resolveDefaults(
|
|
219
|
+
childStaticDefaults,
|
|
220
|
+
propsVariants,
|
|
221
|
+
);
|
|
217
222
|
defaults = { ...defaults, ...extComputedDefaults };
|
|
218
223
|
}
|
|
219
224
|
}
|
|
@@ -737,18 +742,23 @@ export function create<M extends Mode = "jsx">({
|
|
|
737
742
|
|
|
738
743
|
// Returns only the variants set via setDefaultVariants in the computed
|
|
739
744
|
// function. Used by child components to get parent's computed defaults.
|
|
745
|
+
// @param childDefaults - Child's static defaults (merged into variants)
|
|
746
|
+
// @param userProps - Actual user props (for setDefaultVariants check)
|
|
740
747
|
component._resolveDefaults = (
|
|
741
|
-
|
|
748
|
+
childDefaults: Record<string, unknown>,
|
|
749
|
+
userProps: Record<string, unknown> = {},
|
|
742
750
|
): Record<string, unknown> => {
|
|
743
751
|
// Get static defaults (including from extended components)
|
|
744
752
|
const staticDefaults = collectStaticDefaults(
|
|
745
753
|
config as CVConfig<Variants, ComputedVariants, AnyComponent[]>,
|
|
746
754
|
);
|
|
747
755
|
|
|
748
|
-
// Merge
|
|
756
|
+
// Merge: parent static < child static < user props
|
|
757
|
+
// This is what parent's computed will see in `variants`
|
|
749
758
|
const resolvedVariants = {
|
|
750
759
|
...staticDefaults,
|
|
751
|
-
...filterUndefined(
|
|
760
|
+
...filterUndefined(childDefaults),
|
|
761
|
+
...filterUndefined(userProps),
|
|
752
762
|
};
|
|
753
763
|
|
|
754
764
|
// Track which keys are set via setDefaultVariants
|
|
@@ -761,9 +771,10 @@ export function create<M extends Mode = "jsx">({
|
|
|
761
771
|
// Not relevant for collecting defaults
|
|
762
772
|
},
|
|
763
773
|
setDefaultVariants: (newDefaults) => {
|
|
764
|
-
// Only apply defaults for variants not explicitly set
|
|
774
|
+
// Only apply defaults for variants not explicitly set by user
|
|
775
|
+
// (child's static defaults should not block setDefaultVariants)
|
|
765
776
|
for (const [key, value] of Object.entries(newDefaults)) {
|
|
766
|
-
if (
|
|
777
|
+
if (userProps[key] === undefined) {
|
|
767
778
|
computedDefaults[key] = value;
|
|
768
779
|
}
|
|
769
780
|
}
|
package/src/test.ts
CHANGED
|
@@ -1184,6 +1184,28 @@ for (const config of Object.values(CONFIGS)) {
|
|
|
1184
1184
|
expect(getStyleClass(props)).toEqual({ class: cls("lg red") });
|
|
1185
1185
|
});
|
|
1186
1186
|
|
|
1187
|
+
test("computed receives default variants from child", () => {
|
|
1188
|
+
const base = cv({
|
|
1189
|
+
variants: { size: { sm: "sm", lg: "lg" }, large: "" },
|
|
1190
|
+
defaultVariants: { size: "sm" },
|
|
1191
|
+
computed: ({ variants, setDefaultVariants }) => {
|
|
1192
|
+
if (variants.large) {
|
|
1193
|
+
setDefaultVariants({ size: "lg" });
|
|
1194
|
+
}
|
|
1195
|
+
},
|
|
1196
|
+
});
|
|
1197
|
+
const component = getModalComponent(
|
|
1198
|
+
mode,
|
|
1199
|
+
cv({
|
|
1200
|
+
extend: [base],
|
|
1201
|
+
variants: { color: { red: "red", blue: "blue" } },
|
|
1202
|
+
defaultVariants: { size: "sm", color: "red", large: true },
|
|
1203
|
+
}),
|
|
1204
|
+
);
|
|
1205
|
+
const props = component();
|
|
1206
|
+
expect(getStyleClass(props)).toEqual({ class: cls("lg red") });
|
|
1207
|
+
});
|
|
1208
|
+
|
|
1187
1209
|
test("child computed setDefaultVariants overrides parent computed setDefaultVariants", () => {
|
|
1188
1210
|
const base = cv({
|
|
1189
1211
|
variants: { size: { sm: "sm", lg: "lg" } },
|
|
@@ -1210,6 +1232,30 @@ for (const config of Object.values(CONFIGS)) {
|
|
|
1210
1232
|
expect(getStyleClass(props)).toEqual({ class: cls("sm red") });
|
|
1211
1233
|
});
|
|
1212
1234
|
|
|
1235
|
+
test("child setDefaultVariants receives computed variants from parent", () => {
|
|
1236
|
+
const base = cv({
|
|
1237
|
+
variants: { size: { sm: "sm", lg: "lg" }, small: "" },
|
|
1238
|
+
computed: ({ setDefaultVariants }) => {
|
|
1239
|
+
setDefaultVariants({ small: true });
|
|
1240
|
+
},
|
|
1241
|
+
});
|
|
1242
|
+
const component = getModalComponent(
|
|
1243
|
+
mode,
|
|
1244
|
+
cv({
|
|
1245
|
+
extend: [base],
|
|
1246
|
+
variants: { color: { red: "red", blue: "blue" } },
|
|
1247
|
+
defaultVariants: { size: "lg", color: "red" },
|
|
1248
|
+
computed: ({ variants, setDefaultVariants }) => {
|
|
1249
|
+
if (variants.small) {
|
|
1250
|
+
setDefaultVariants({ size: "sm" });
|
|
1251
|
+
}
|
|
1252
|
+
},
|
|
1253
|
+
}),
|
|
1254
|
+
);
|
|
1255
|
+
const props = component();
|
|
1256
|
+
expect(getStyleClass(props)).toEqual({ class: cls("sm red") });
|
|
1257
|
+
});
|
|
1258
|
+
|
|
1213
1259
|
test("computed setDefaultVariants when explicitly passing undefined", () => {
|
|
1214
1260
|
const component = getModalComponent(
|
|
1215
1261
|
mode,
|
package/src/types.ts
CHANGED
|
@@ -338,11 +338,15 @@ export interface ModalComponent<V, R extends ComponentResult> {
|
|
|
338
338
|
/** @internal Base class without variants */
|
|
339
339
|
_baseClass: string;
|
|
340
340
|
/**
|
|
341
|
-
* @internal Returns
|
|
342
|
-
* Used by child components to get parent's
|
|
341
|
+
* @internal Returns only the variants set via setDefaultVariants in the
|
|
342
|
+
* computed function. Used by child components to get parent's computed
|
|
343
|
+
* defaults.
|
|
344
|
+
* @param childDefaults - Child's static defaults (merged into variants)
|
|
345
|
+
* @param userProps - Actual user props (for setDefaultVariants check)
|
|
343
346
|
*/
|
|
344
347
|
_resolveDefaults: (
|
|
345
|
-
|
|
348
|
+
childDefaults: Record<string, unknown>,
|
|
349
|
+
userProps?: Record<string, unknown>,
|
|
346
350
|
) => Record<string, unknown>;
|
|
347
351
|
}
|
|
348
352
|
|