@splenddev/kreativ-core 0.1.5 → 0.1.7
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/dist/{chunk-OJSXALOI.js → chunk-Q5PIXJRW.js} +53 -3
- package/dist/chunk-Q5PIXJRW.js.map +1 -0
- package/dist/hooks/index.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/utils/index.d.ts +278 -4
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-OJSXALOI.js.map +0 -1
|
@@ -12,6 +12,32 @@ function createComponent(config) {
|
|
|
12
12
|
function hasKuiMeta(value) {
|
|
13
13
|
return (typeof value === "function" || typeof value === "object" && value !== null) && "__kui" in value && typeof value.__kui === "object" && value.__kui !== null;
|
|
14
14
|
}
|
|
15
|
+
function requireProvider(component, opts) {
|
|
16
|
+
return { component, ...opts };
|
|
17
|
+
}
|
|
18
|
+
function useValidateChildren(parentKey, children) {
|
|
19
|
+
if (process.env.NODE_ENV === "production") return;
|
|
20
|
+
React.Children.forEach(children, (child) => {
|
|
21
|
+
if (!React.isValidElement(child)) return;
|
|
22
|
+
const type = child.type;
|
|
23
|
+
if (!hasKuiMeta(type)) return;
|
|
24
|
+
const meta = type.__kui;
|
|
25
|
+
const allowedRoles = KUI_CHILDREN_REGISTRY_ALLOWED[parentKey]?.roles ?? [];
|
|
26
|
+
const allowedSlots = KUI_CHILDREN_REGISTRY_ALLOWED[parentKey]?.slots ?? [];
|
|
27
|
+
const roleOk = meta.role ? allowedRoles.includes(meta.role) : false;
|
|
28
|
+
const slotOk = meta.groupSlot ? allowedSlots.includes(meta.groupSlot) : false;
|
|
29
|
+
if (!roleOk && !slotOk) {
|
|
30
|
+
const name = type.displayName ?? "component";
|
|
31
|
+
console.warn(
|
|
32
|
+
`[kreativ-ui] ${String(parentKey)} received an unexpected child "${name}" (role: ${meta.role ?? "none"}, groupSlot: ${meta.groupSlot ?? "none"}). Expected role in [${allowedRoles.join(", ")}] or groupSlot in [${allowedSlots.join(", ")}].`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
var KUI_CHILDREN_REGISTRY_ALLOWED = {
|
|
38
|
+
ButtonGroup: { roles: ["action"], slots: ["ButtonGroup"] },
|
|
39
|
+
List: { roles: [], slots: ["List"] }
|
|
40
|
+
};
|
|
15
41
|
|
|
16
42
|
// src/utils/composeRefs.ts
|
|
17
43
|
function composeRefs(...refs) {
|
|
@@ -346,7 +372,31 @@ function tokensToCssVars(tokens, mode, intensity, prefix = "kui") {
|
|
|
346
372
|
[`--${prefix}-intensity`]: String(intensity)
|
|
347
373
|
};
|
|
348
374
|
}
|
|
375
|
+
function warnOnFlatCompoundConflict({
|
|
376
|
+
flatValue,
|
|
377
|
+
hasFlatValue,
|
|
378
|
+
children,
|
|
379
|
+
matchType,
|
|
380
|
+
componentName,
|
|
381
|
+
propName,
|
|
382
|
+
childName
|
|
383
|
+
}) {
|
|
384
|
+
const flatIsSet = hasFlatValue !== void 0 ? hasFlatValue : Boolean(flatValue);
|
|
385
|
+
let childIsPresent = false;
|
|
386
|
+
React.Children.forEach(children, (child) => {
|
|
387
|
+
if (childIsPresent) return;
|
|
388
|
+
if (React.isValidElement(child) && child.type === matchType) {
|
|
389
|
+
childIsPresent = true;
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
if (flatIsSet && childIsPresent && process.env.NODE_ENV !== "production") {
|
|
393
|
+
console.warn(
|
|
394
|
+
`<${componentName}>: both the \`${propName}\` prop and a <${childName} /> child were provided. The \`${propName}\` prop will be ignored in favor of the explicit <${childName} /> child. Remove one of the two to resolve this warning.`
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
return childIsPresent;
|
|
398
|
+
}
|
|
349
399
|
|
|
350
|
-
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars };
|
|
351
|
-
//# sourceMappingURL=chunk-
|
|
352
|
-
//# sourceMappingURL=chunk-
|
|
400
|
+
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict };
|
|
401
|
+
//# sourceMappingURL=chunk-Q5PIXJRW.js.map
|
|
402
|
+
//# sourceMappingURL=chunk-Q5PIXJRW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/createComponent.tsx","../src/utils/composeRefs.ts","../src/utils/createFromProps.ts","../src/utils/responsive.ts","../src/utils/deepMerge.ts","../src/utils/resolveTokenReference.ts","../src/utils/resolveTypography.ts","../src/utils/cssVariables.ts","../src/utils/warnOnFlatCompoundConflict.ts"],"names":["value","resolveValue","React2"],"mappings":"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","file":"chunk-Q5PIXJRW.js","sourcesContent":["import * as React from \"react\";\n\n/**\n * Describes the common states a component can support.\n *\n * These flags are used by Kreativ UI to communicate states such as\n * disabled, invalid, and required to consumers and supporting utilities.\n *\n * Additional state flags may be added by components when needed.\n */\nexport interface KuiSupports {\n disabled?: boolean;\n invalid?: boolean;\n required?: boolean;\n [key: string]: boolean | undefined;\n}\n\n/**\n * Describes the visual shape a component should use when represented\n * as a skeleton.\n *\n * Custom string values can be used when a component needs a specialized\n * skeleton representation.\n */\nexport type KuiSkeletonHint =\n | \"text\"\n | \"rect\"\n | \"circle\"\n | \"input-shaped\"\n | \"preserve\"\n | (string & {});\n\n/**\n * Identifies the primary purpose of a component.\n *\n * The role helps Kreativ UI and supporting tools understand how a\n * component behaves and how it should be treated in different contexts.\n */\nexport type KuiRole =\n | \"action\"\n | \"formControl\"\n | \"overlay\"\n | \"layout\"\n | \"display\"\n | \"disclosure\"\n | \"navigation\"\n | (string & {});\n\n/**\n * Interaction states that can be represented by a component.\n */\nexport type KuiInteractionState = \"hover\" | \"focus\" | \"pressed\";\n\n/**\n * Describes how a component can participate in Kreativ Forge.\n *\n * Components can optionally provide this metadata to enable video\n * editing and animation support without requiring Forge as a dependency.\n */\nexport interface KuiVideoMeta<P> {\n /**\n * Stable identifier used to reference the component in Forge projects.\n */\n id: string;\n\n /**\n * Indicates whether Forge can safely control and render the component.\n *\n * Components marked as unsafe are excluded from Forge's interactive\n * component controls.\n */\n safe: boolean;\n\n /**\n * Indicates whether the component can contain other Forge elements.\n */\n acceptsChildren?: boolean;\n\n /**\n * Indicates that the component depends on context provided by\n * an ancestor component.\n */\n needsParentContext?: boolean;\n\n /**\n * Identifies props that can reference project assets.\n *\n * Forge uses these declarations to provide the appropriate asset\n * selection and resolution behavior.\n */\n assetProps?: Record<\n string,\n \"image\" | \"video\" | \"audio\" | \"font\" | \"snippet\" | \"icon\"\n >;\n\n /**\n * Lists props whose values can be controlled by Forge.\n */\n controlled?: Array<keyof P>;\n\n /**\n * Specifies which interaction states Forge can represent for the component.\n */\n interactionStates?: KuiInteractionState[];\n\n /**\n * Indicates the component's motion is gated by Forge at render-start\n * (timers/transitions/uncontrolled animation disabled during render),\n * rather than driven as a per-frame controlled prop. Components marked\n * `safe: true` must honor this gate.\n */\n motionGated?: boolean;\n}\n\n/**\n * Metadata describing a Kreativ UI component's capabilities and behavior.\n *\n * This metadata is attached to components and can be used by Kreativ UI,\n * development tools, and integrations such as Kreativ Forge.\n */\nexport interface KuiMeta<P = any> {\n /**\n * Identifies whether the component is a single or compound form control.\n */\n formControl?: \"single\" | \"compound\";\n\n /**\n * Describes the states supported by the component.\n */\n supports?: KuiSupports;\n\n /**\n * Defines the skeleton representation used while the component loads.\n */\n skeleton?: KuiSkeletonHint;\n\n /**\n * Identifies the component's primary role.\n */\n role?: KuiRole;\n\n /**\n * Identifies the component's slot when it participates in a compound component.\n */\n groupSlot?: string;\n\n /**\n * Optional Kreativ Forge integration metadata.\n */\n video?: KuiVideoMeta<P>;\n\n /**\n * Allowlist of props exposed in Forge's Properties tab, with the\n * synthesized-group each belongs to.\n */\n editableProps?: Array<{\n prop: keyof P;\n group: string;\n label?: string;\n }>;\n\n /**\n * Declares which prop resolves typography (via Kui's `resolveTypography`),\n * letting Forge synthesize a Typography group wired to that prop.\n */\n typographyProp?: {\n prop: keyof P;\n allowedPresets?: string[] | \"all\";\n allowCustom?: boolean;\n allowTokenReferences?: boolean;\n customFields?: {\n fontFamily?: boolean;\n fontSize?: boolean;\n fontWeight?: boolean;\n lineHeight?: boolean;\n letterSpacing?: boolean;\n };\n };\n\n /**\n * Declares which prop resolves a semantic color token, letting Forge\n * synthesize a Color group wired to that prop.\n */\n colorProp?: {\n prop: keyof P;\n allowedTokens?: string[] | \"all\";\n };\n\n /**\n * Declares which prop resolves a size-scale token, letting Forge\n * synthesize a Size group wired to that prop.\n */\n sizeProp?: {\n prop: keyof P;\n allowedSizes?: string[] | \"all\";\n };\n}\n\n/**\n * A Kreativ UI component created with `createComponent`.\n *\n * In addition to normal React component behavior, Kreativ UI components\n * expose metadata describing their capabilities and role.\n */\nexport type KuiComponent<P, E> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<E>\n> & {\n __kui: KuiMeta<P>;\n\n /**\n * Describes a provider required by the component.\n */\n providerRequired?: KuiProviderRequirement;\n};\n\n/**\n * Configuration used to create a Kreativ UI component.\n */\nexport interface CreateComponentConfig<P, E> {\n /**\n * Metadata describing the component's capabilities and behavior.\n */\n __kui: KuiMeta<P>;\n\n /**\n * Renders the component and receives its forwarded ref.\n */\n render: (props: P, ref: React.ForwardedRef<E>) => React.ReactElement | null;\n\n /**\n * Optional name used when displaying the component in development tools.\n */\n displayName?: string;\n}\n\n/**\n * Creates a Kreativ UI component with forwarded-ref support and\n * Kreativ UI metadata.\n *\n * @param config Component rendering function and metadata.\n * @returns A React component with Kreativ UI metadata attached.\n */\nexport function createComponent<P extends object, E = unknown>(\n config: CreateComponentConfig<P, E>,\n): KuiComponent<P, E> {\n const C = React.forwardRef(\n config.render as unknown as React.ForwardRefRenderFunction<E, any>,\n ) as unknown as KuiComponent<P, E>;\n\n if (config.displayName) C.displayName = config.displayName;\n\n C.__kui = config.__kui;\n return C;\n}\n\n/**\n * Checks whether a value is a Kreativ UI component with component metadata.\n *\n * Useful when working with component types dynamically, such as when\n * inspecting children of compound components.\n *\n * @param value Value to inspect.\n * @returns `true` when the value contains valid Kreativ UI metadata.\n */\nexport function hasKuiMeta(value: unknown): value is { __kui: KuiMeta } {\n return (\n (typeof value === \"function\" ||\n (typeof value === \"object\" && value !== null)) &&\n \"__kui\" in (value as object) &&\n typeof (value as { __kui: unknown }).__kui === \"object\" &&\n (value as { __kui: unknown }).__kui !== null\n );\n}\n\n/**\n * Lists the provider families available to Kreativ UI components.\n */\nexport interface KuiProviderRegistry {\n \"Popover.Root\": { controlled: \"open\" };\n \"Menu.Root\": { controlled: \"open\" };\n}\n\n/**\n * Describes a provider that a component requires from its parent tree.\n */\nexport interface KuiProviderRequirement<\n C extends keyof KuiProviderRegistry = keyof KuiProviderRegistry,\n> {\n /**\n * Identifies the provider component that must be present.\n */\n component: C;\n\n /**\n * Human-readable description of the provider requirement.\n */\n label: string;\n\n /**\n * Lists provider state values that can be controlled by the parent provider.\n */\n controlled?: Array<KuiProviderRegistry[C][\"controlled\"]>;\n}\n\n/**\n * Declares that a component requires a specific provider ancestor.\n *\n * Use this when a component is intended to be rendered as part of a\n * provider-based component such as Popover or Menu.\n *\n * @param component Provider component that must be present (e.g. \"Popover.Root\").\n * @param opts Provider requirement details (label, controlled state).\n * @returns A requirement descriptor; attach it via `component.providerRequired = ...`\n * or pass the target component separately depending on call site.\n */\nexport function requireProvider<C extends keyof KuiProviderRegistry>(\n component: C,\n opts: Omit<KuiProviderRequirement<C>, \"component\">,\n): KuiProviderRequirement<C> {\n return { component, ...opts };\n}\n\n/**\n * Defines the child roles and slots accepted by a compound component.\n */\nexport interface KuiChildrenRegistry {\n ButtonGroup: { roles: [\"action\"]; slots: [\"ButtonGroup\"] };\n List: { roles: []; slots: [\"List\"] };\n}\n\n/**\n * Validates the direct children of a compound component during development.\n *\n * Unexpected children produce a development warning. Validation is skipped\n * in production builds.\n *\n * @param parentKey Compound component whose children are being validated.\n * @param children Children passed to the compound component.\n */\nexport function useValidateChildren<K extends keyof KuiChildrenRegistry>(\n parentKey: K,\n children: React.ReactNode,\n): void {\n if (process.env.NODE_ENV === \"production\") return;\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const type = child.type;\n\n if (!hasKuiMeta(type)) return;\n\n const meta = (type as { __kui: KuiMeta }).__kui;\n\n const allowedRoles: readonly string[] =\n KUI_CHILDREN_REGISTRY_ALLOWED[parentKey]?.roles ?? [];\n\n const allowedSlots: readonly string[] =\n KUI_CHILDREN_REGISTRY_ALLOWED[parentKey]?.slots ?? [];\n\n const roleOk = meta.role ? allowedRoles.includes(meta.role) : false;\n\n const slotOk = meta.groupSlot\n ? allowedSlots.includes(meta.groupSlot)\n : false;\n\n if (!roleOk && !slotOk) {\n const name =\n (type as { displayName?: string }).displayName ?? \"component\";\n\n console.warn(\n `[kreativ-ui] ${String(parentKey)} received an unexpected child \"${name}\" ` +\n `(role: ${meta.role ?? \"none\"}, groupSlot: ${meta.groupSlot ?? \"none\"}). ` +\n `Expected role in [${allowedRoles.join(\", \")}] or groupSlot in [${allowedSlots.join(\", \")}].`,\n );\n }\n });\n}\n\nconst KUI_CHILDREN_REGISTRY_ALLOWED = {\n ButtonGroup: { roles: [\"action\"], slots: [\"ButtonGroup\"] },\n List: { roles: [], slots: [\"List\"] },\n} satisfies {\n [K in keyof KuiChildrenRegistry]: {\n roles: KuiChildrenRegistry[K][\"roles\"];\n slots: KuiChildrenRegistry[K][\"slots\"];\n };\n};\n","import type * as React from \"react\";\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\nexport function composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<T | null>).current = node;\n }\n };\n}\n","export interface CreateFromPropsInput<T extends object> {\n providerDefaults?: Partial<T>;\n defaultProps?: Partial<T>;\n generatedProps?: Partial<T>;\n consumerProps?: Partial<T>;\n}\nexport function createFromProps<T extends object>(input: CreateFromPropsInput<T>): T {\n return {\n ...input.providerDefaults,\n ...input.defaultProps,\n ...input.generatedProps,\n ...input.consumerProps,\n } as T;\n}\n","import type { BaseBreakpoint, ResponsiveValue } from \"@/types\";\n\nexport function isResponsiveValue<T>(\n value: ResponsiveValue<T>,\n): value is Partial<Record<\"base\" | BaseBreakpoint, T>> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport interface ResolvedResponsiveValue<T> {\n base?: T;\n responsive: Record<string, T>;\n}\n\nexport function resolveResponsiveValue<T, B extends string = string>(\n value: ResponsiveValue<T, B>,\n): ResolvedResponsiveValue<T> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return {\n base: value,\n responsive: {},\n };\n }\n\n const responsiveValue = value as Partial<Record<\"base\" | B, T>>;\n\n const { base, ...responsive } = responsiveValue;\n\n return {\n base,\n responsive: Object.fromEntries(\n Object.entries(responsive).filter(([, value]) => value !== undefined),\n ) as Record<string, T>,\n };\n}\n\nexport function toResponsiveClasses<T>(\n value: ResolvedResponsiveValue<T>,\n resolve: (value: T) => string,\n): string {\n const classes: string[] = [];\n\n if (value.base !== undefined) {\n classes.push(resolve(value.base));\n }\n\n for (const [breakpoint, item] of Object.entries(value.responsive)) {\n classes.push(\n item\n ? item\n .toString()\n .split(\" \")\n .map((className) => `${breakpoint}:${className}`)\n .join(\" \")\n : \"\",\n );\n }\n\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function mergeResponsiveValue<T, B extends string = string>(\n defaults: ResponsiveValue<T, B>,\n value?: ResponsiveValue<T, B>,\n): ResolvedResponsiveValue<T> {\n const defaultValue = resolveResponsiveValue(defaults);\n\n if (value === undefined) {\n return defaultValue;\n }\n\n const overrideValue = resolveResponsiveValue(value);\n\n return {\n base: overrideValue.base ?? defaultValue.base,\n responsive: {\n ...defaultValue.responsive,\n ...overrideValue.responsive,\n },\n };\n}\n","function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function deepMerge<T>(base: T, override?: unknown): T {\n if (override === undefined) {\n return base;\n }\n\n if (!isPlainObject(base) || !isPlainObject(override)) {\n return override as T;\n }\n\n const result: Record<string, unknown> = {\n ...base,\n };\n\n for (const [key, value] of Object.entries(override)) {\n const existing = result[key];\n\n if (isPlainObject(existing) && isPlainObject(value)) {\n result[key] = deepMerge(existing, value);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n","import type { DesignTokens } from \"@/types\";\r\n\r\nexport function resolveTokenReference(\r\n value: unknown,\r\n tokens: DesignTokens,\r\n): string | number {\r\n if (typeof value !== \"string\") {\r\n return typeof value === \"number\" ? value : \"\";\r\n }\r\n\r\n const match = value.match(/^\\{(.+)\\}$/);\r\n\r\n if (!match || match[1] === undefined) {\r\n return value;\r\n }\r\n\r\n const path = match[1].split(\".\");\r\n\r\n let current: unknown = tokens;\r\n\r\n for (const key of path) {\r\n if (typeof current !== \"object\" || current === null || !(key in current)) {\r\n return \"\";\r\n }\r\n\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n\r\n if (typeof current === \"object\" && current !== null && \"value\" in current) {\r\n const tokenValue = (current as { value: unknown }).value;\r\n\r\n if (typeof tokenValue === \"string\" || typeof tokenValue === \"number\") {\r\n return tokenValue;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n return typeof current === \"string\" || typeof current === \"number\"\r\n ? current\r\n : \"\";\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport type { DesignTokens, TypographyStyle } from \"@/types\";\r\nimport { resolveTokenReference } from \"./resolveTokenReference\";\r\n\r\nexport function resolveTypography(\r\n typography: TypographyStyle | undefined,\r\n tokens: DesignTokens,\r\n): CSSProperties {\r\n if (!typography) return {};\r\n\r\n return {\r\n fontFamily: resolveTokenReference(typography.fontFamily, tokens) as string,\r\n fontSize: resolveTokenReference(typography.fontSize, tokens) as string,\r\n fontWeight: resolveTokenReference(typography.fontWeight, tokens),\r\n lineHeight: resolveTokenReference(typography.lineHeight, tokens),\r\n letterSpacing: resolveTokenReference(\r\n typography.letterSpacing,\r\n tokens,\r\n ) as string,\r\n };\r\n}\r\n","import type {\r\n DesignTokens,\r\n ResolvedTokens,\r\n SemanticTokens,\r\n TokenDefinition,\r\n} from \"@/types\";\r\n\r\nexport function toKebabCase(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\nfunction colorToRgbChannels(value: string): string {\r\n const trimmed = value.trim();\r\n\r\n const rgbMatch = trimmed.match(\r\n /^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*[,\\s]\\s*(\\d+(?:\\.\\d+)?)\\s*[,\\s]\\s*(\\d+(?:\\.\\d+)?)(?:\\s*[/,]\\s*[\\d.]+%?)?\\s*\\)$/i,\r\n );\r\n\r\n if (rgbMatch) {\r\n return `${rgbMatch[1]} ${rgbMatch[2]} ${rgbMatch[3]}`;\r\n }\r\n\r\n if (trimmed.startsWith(\"#\")) {\r\n const hex = trimmed.slice(1);\r\n\r\n if (hex.length === 3) {\r\n const r = parseInt(hex.slice(0, 1).repeat(2), 16);\r\n const g = parseInt(hex.slice(1, 2).repeat(2), 16);\r\n const b = parseInt(hex.slice(2, 3).repeat(2), 16);\r\n\r\n return `${r} ${g} ${b}`;\r\n }\r\n\r\n if (hex.length === 6) {\r\n const r = parseInt(hex.slice(0, 2), 16);\r\n const g = parseInt(hex.slice(2, 4), 16);\r\n const b = parseInt(hex.slice(4, 6), 16);\r\n\r\n return `${r} ${g} ${b}`;\r\n }\r\n }\r\n\r\n if (/^\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?$/.test(trimmed)) {\r\n return trimmed;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction getTokenValue(\r\n reference: string,\r\n tokens: DesignTokens,\r\n): string | number | undefined {\r\n const path = reference.replace(/^\\{/, \"\").replace(/\\}$/, \"\").split(\".\");\r\n\r\n let current: unknown = tokens;\r\n\r\n for (const segment of path) {\r\n if (\r\n typeof current !== \"object\" ||\r\n current === null ||\r\n !(segment in current)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n current = (current as Record<string, unknown>)[segment];\r\n }\r\n\r\n if (typeof current === \"object\" && current !== null && \"value\" in current) {\r\n const value = (current as TokenDefinition).value;\r\n\r\n if (typeof value === \"string\" || typeof value === \"number\") {\r\n return value;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolveReference(\r\n reference: string,\r\n tokens: DesignTokens,\r\n seen = new Set<string>(),\r\n): string | undefined {\r\n if (seen.has(reference)) {\r\n console.error(\r\n `[kreativ-core] Circular token reference detected: ${reference}`,\r\n );\r\n\r\n return undefined;\r\n }\r\n\r\n const nextSeen = new Set(seen);\r\n nextSeen.add(reference);\r\n\r\n const value = getTokenValue(reference, tokens);\r\n\r\n if (value === undefined) {\r\n console.warn(\r\n `[kreativ-core] Unable to resolve token reference: ${reference}`,\r\n );\r\n\r\n return undefined;\r\n }\r\n\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n if (value.startsWith(\"{\") && value.endsWith(\"}\")) {\r\n return resolveReference(value, tokens, nextSeen);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction resolveValue(\r\n value: unknown,\r\n tokens: DesignTokens,\r\n): string | undefined {\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n if (value.startsWith(\"{\") && value.endsWith(\"}\")) {\r\n return resolveReference(value, tokens);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction flattenTokens(\r\n value: unknown,\r\n path: string[],\r\n result: ResolvedTokens,\r\n tokens: DesignTokens,\r\n): void {\r\n if (typeof value !== \"object\" || value === null) {\r\n return;\r\n }\r\n\r\n if (\"value\" in value) {\r\n const tokenValue = (value as TokenDefinition).value;\r\n\r\n const resolved = resolveValue(tokenValue, tokens);\r\n\r\n if (resolved !== undefined) {\r\n result[path.join(\".\")] = resolved;\r\n }\r\n\r\n return;\r\n }\r\n\r\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\r\n flattenTokens(child, [...path, key], result, tokens);\r\n }\r\n}\r\n\r\nfunction resolveSemanticValue(\r\n value: unknown,\r\n mode: \"light\" | \"dark\",\r\n tokens: DesignTokens,\r\n): string | undefined {\r\n if (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"light\" in value &&\r\n \"dark\" in value\r\n ) {\r\n const modeValue = (\r\n value as {\r\n light: unknown;\r\n dark: unknown;\r\n }\r\n )[mode];\r\n\r\n return resolveValue(modeValue, tokens);\r\n }\r\n\r\n return resolveValue(value, tokens);\r\n}\r\n\r\nfunction resolveSemanticTokens(\r\n semanticTokens: SemanticTokens,\r\n tokens: DesignTokens,\r\n mode: \"light\" | \"dark\",\r\n): ResolvedTokens {\r\n const result: ResolvedTokens = {};\r\n\r\n function walk(value: unknown, path: string[]): void {\r\n if (typeof value !== \"object\" || value === null) {\r\n return;\r\n }\r\n\r\n if (\"value\" in value) {\r\n const semanticValue = (value as TokenDefinition).value;\r\n\r\n const resolved = resolveSemanticValue(semanticValue, mode, tokens);\r\n\r\n if (resolved !== undefined) {\r\n result[path.join(\".\")] = resolved;\r\n }\r\n\r\n return;\r\n }\r\n\r\n for (const [key, child] of Object.entries(\r\n value as Record<string, unknown>,\r\n )) {\r\n walk(child, [...path, key]);\r\n }\r\n }\r\n\r\n walk(semanticTokens, []);\r\n\r\n return result;\r\n}\r\n\r\nexport function resolveTokens(\r\n tokens: DesignTokens,\r\n semanticTokens: SemanticTokens,\r\n mode: \"light\" | \"dark\",\r\n): ResolvedTokens {\r\n const primitiveTokens: ResolvedTokens = {};\r\n\r\n flattenTokens(tokens, [], primitiveTokens, tokens);\r\n\r\n const resolvedSemanticTokens = resolveSemanticTokens(\r\n semanticTokens,\r\n tokens,\r\n mode,\r\n );\r\n\r\n return {\r\n ...primitiveTokens,\r\n ...resolvedSemanticTokens,\r\n };\r\n}\r\n\r\nexport function resolveSemanticTokenReferences(\r\n tokens: DesignTokens,\r\n semanticTokens: SemanticTokens,\r\n): SemanticTokens {\r\n function resolveValue(value: unknown, seen = new Set<string>()): unknown {\r\n if (typeof value === \"string\") {\r\n if (!value.startsWith(\"{\") || !value.endsWith(\"}\")) {\r\n return value;\r\n }\r\n\r\n if (seen.has(value)) {\r\n console.error(\r\n `[kreativ-core] Circular token reference detected: ${value}`,\r\n );\r\n\r\n return value;\r\n }\r\n\r\n const resolved = getTokenValue(value, tokens);\r\n\r\n if (resolved === undefined) {\r\n console.warn(\r\n `[kreativ-core] Unable to resolve token reference: ${value}`,\r\n );\r\n\r\n return value;\r\n }\r\n\r\n const nextSeen = new Set(seen);\r\n nextSeen.add(value);\r\n\r\n return resolveValue(resolved, nextSeen);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => resolveValue(item, seen));\r\n }\r\n\r\n if (typeof value === \"object\" && value !== null) {\r\n return Object.fromEntries(\r\n Object.entries(value).map(([key, child]) => [\r\n key,\r\n resolveValue(child, seen),\r\n ]),\r\n );\r\n }\r\n\r\n return value;\r\n }\r\n\r\n return resolveValue(semanticTokens) as SemanticTokens;\r\n}\r\n\r\nexport function tokensToCssVars(\r\n tokens: ResolvedTokens,\r\n mode: \"light\" | \"dark\",\r\n intensity: number,\r\n prefix = \"kui\",\r\n): Record<string, string> {\r\n const cssVars: Record<string, string> = {};\r\n\r\n for (const [path, value] of Object.entries(tokens)) {\r\n const parts = path.split(\".\");\r\n const [_first = \"\", second = \"\"] = parts;\r\n\r\n const isSemanticColor = parts.length === 2 && parts[0] === \"colors\";\r\n\r\n const isPrimitiveColor = parts.length >= 3 && parts[0] === \"colors\";\r\n\r\n const varName = isSemanticColor\r\n ? `--${prefix}-${toKebabCase(second)}`\r\n : `--${prefix}-${parts.map(toKebabCase).join(\"-\")}`;\r\n\r\n const outputValue =\r\n isSemanticColor || isPrimitiveColor ? colorToRgbChannels(value) : value;\r\n\r\n cssVars[varName] = outputValue;\r\n }\r\n\r\n return {\r\n ...cssVars,\r\n\r\n [`--${prefix}-mode`]: mode,\r\n [`--${prefix}-intensity`]: String(intensity),\r\n };\r\n}\r\n","import * as React from \"react\";\n\nexport interface WarnOnFlatCompoundConflictOptions {\n /** The flat prop's value (or undefined/falsy if unset). */\n flatValue: unknown;\n /**\n * Override for legitimately-falsy boolean flat props (e.g. a flat\n * `open={false}` is still \"set\" and should be checked for conflict) —\n * when provided, this takes precedence over checking flatValue's truthiness.\n */\n hasFlatValue?: boolean;\n children: React.ReactNode;\n /** The compound part's component reference to match against, e.g. FormField.Label */\n matchType: React.ElementType;\n componentName: string;\n propName: string;\n childName: string;\n}\n\n/**\n * Detects whether a flat prop (sugar for one specific named compound\n * part) and that same named child are both present in the same\n * render. Scoped ONLY to this named-flat-prop-vs-named-child\n * conflict — not the general flat-vs-compound API style choice\n * (e.g. Slider's flat-or-compound, which has no such conflict since\n * the two are mutually exclusive paths with no simultaneous-use case).\n *\n * Returns true when the matching named child is present, meaning the\n * caller should suppress its flat-prop-derived rendering and let the\n * explicit child win. Warns in dev when BOTH the flat prop and the\n * child are present, since that's very likely an authoring mistake.\n */\nexport function warnOnFlatCompoundConflict({\n flatValue,\n hasFlatValue,\n children,\n matchType,\n componentName,\n propName,\n childName,\n}: WarnOnFlatCompoundConflictOptions): boolean {\n const flatIsSet = hasFlatValue !== undefined ? hasFlatValue : Boolean(flatValue);\n\n let childIsPresent = false;\n React.Children.forEach(children, (child) => {\n if (childIsPresent) return;\n if (React.isValidElement(child) && child.type === matchType) {\n childIsPresent = true;\n }\n });\n\n if (flatIsSet && childIsPresent && process.env.NODE_ENV !== \"production\") {\n console.warn(\n `<${componentName}>: both the \\`${propName}\\` prop and a <${childName} /> child were provided. ` +\n `The \\`${propName}\\` prop will be ignored in favor of the explicit <${childName} /> child. ` +\n `Remove one of the two to resolve this warning.`\n );\n }\n\n return childIsPresent;\n}\n"]}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ThemeContext, useTheme } from '../chunk-5CYSF7C3.js';
|
|
2
|
-
import { isResponsiveValue, resolveTypography, resolveResponsiveValue } from '../chunk-
|
|
2
|
+
import { isResponsiveValue, resolveTypography, resolveResponsiveValue } from '../chunk-Q5PIXJRW.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { useState, useEffect, useContext, useMemo, useId, useRef, useCallback } from 'react';
|
|
5
5
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TokenValue, SemanticToken, SizeToken, SizeScale, Typography, RecipeDefinition, DesignTokens, TokenDefinition, TokenReferenceString as TokenReferenceString$1, SemanticTokens, Theme, ColorMode, ResolvedTokens } from './types/index.js';
|
|
2
2
|
export { AnimationTokens, BaseBreakpoint, BaseColor, BaseProps, BaseVariant, BreakpointTokens, CSSPropertiesWithVars, ClearableProps, ColorModeValue, ColorProps, ColorScale, ColorTokens, ControlledProps, CustomRecipes, DeepPartial, DefaultRecipeCollection, DisabledProps, Easing, EmbeddedProps, FontSizeTokens, FontTokens, FontWeightTokens, FormFieldStatus, FullWidthProps, IntensityMap, LetterSpacingTokens, LineHeightTokens, LoadingProps, Orientation, OrientationProps, RadiusTokens, RecipeCollection, RecipeCompoundVariant, RecipeStyle, RecipeVariant, RecipeVariantValue, ReportedValidity, RequiredStateControlProps, ResponsiveStyles, ResponsiveValue, SemanticColorTokens, ShadowTokens, Size, SizeProps, SizeValue, SpacingTokens, StateControlProps, StateProps, StatusProps, StyleObject, StyleValue, Styleable, ThemeAnimation, ThemeOverride, ThemeTogglerTransition, ThemeTransition, TokenGroup, TrimProps, TypographyProps, TypographyStyle, UndoRedoProps, ValidateOn, ValidateProps, ValidationResult, ValueProps, Variant, VariantProps } from './types/index.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
export { CreateComponentConfig, CreateFromPropsInput, KuiComponent, KuiMeta, KuiRole, KuiSkeletonHint, KuiSupports, ResolvedResponsiveValue, composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars } from './utils/index.js';
|
|
4
|
+
export { CreateComponentConfig, CreateFromPropsInput, KuiChildrenRegistry, KuiComponent, KuiInteractionState, KuiMeta, KuiProviderRegistry, KuiProviderRequirement, KuiRole, KuiSkeletonHint, KuiSupports, KuiVideoMeta, ResolvedResponsiveValue, WarnOnFlatCompoundConflictOptions, composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict } from './utils/index.js';
|
|
5
5
|
|
|
6
6
|
declare function defineToken<T extends TokenValue>(value: T): {
|
|
7
7
|
value: T;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ThemeContext, useTheme } from './chunk-5CYSF7C3.js';
|
|
2
|
-
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars } from './chunk-
|
|
2
|
+
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict } from './chunk-Q5PIXJRW.js';
|
|
3
3
|
import './chunk-RV5MKKBP.js';
|
|
4
4
|
|
|
5
5
|
// src/define/token.ts
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,33 +2,276 @@ import * as React from 'react';
|
|
|
2
2
|
import { CSSProperties } from 'react';
|
|
3
3
|
import { ResponsiveValue, BaseBreakpoint, TypographyStyle, DesignTokens, SemanticTokens, ResolvedTokens } from '../types/index.js';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Describes the common states a component can support.
|
|
7
|
+
*
|
|
8
|
+
* These flags are used by Kreativ UI to communicate states such as
|
|
9
|
+
* disabled, invalid, and required to consumers and supporting utilities.
|
|
10
|
+
*
|
|
11
|
+
* Additional state flags may be added by components when needed.
|
|
12
|
+
*/
|
|
5
13
|
interface KuiSupports {
|
|
6
14
|
disabled?: boolean;
|
|
7
15
|
invalid?: boolean;
|
|
8
16
|
required?: boolean;
|
|
9
17
|
[key: string]: boolean | undefined;
|
|
10
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Describes the visual shape a component should use when represented
|
|
21
|
+
* as a skeleton.
|
|
22
|
+
*
|
|
23
|
+
* Custom string values can be used when a component needs a specialized
|
|
24
|
+
* skeleton representation.
|
|
25
|
+
*/
|
|
11
26
|
type KuiSkeletonHint = "text" | "rect" | "circle" | "input-shaped" | "preserve" | (string & {});
|
|
27
|
+
/**
|
|
28
|
+
* Identifies the primary purpose of a component.
|
|
29
|
+
*
|
|
30
|
+
* The role helps Kreativ UI and supporting tools understand how a
|
|
31
|
+
* component behaves and how it should be treated in different contexts.
|
|
32
|
+
*/
|
|
12
33
|
type KuiRole = "action" | "formControl" | "overlay" | "layout" | "display" | "disclosure" | "navigation" | (string & {});
|
|
13
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Interaction states that can be represented by a component.
|
|
36
|
+
*/
|
|
37
|
+
type KuiInteractionState = "hover" | "focus" | "pressed";
|
|
38
|
+
/**
|
|
39
|
+
* Describes how a component can participate in Kreativ Forge.
|
|
40
|
+
*
|
|
41
|
+
* Components can optionally provide this metadata to enable video
|
|
42
|
+
* editing and animation support without requiring Forge as a dependency.
|
|
43
|
+
*/
|
|
44
|
+
interface KuiVideoMeta<P> {
|
|
45
|
+
/**
|
|
46
|
+
* Stable identifier used to reference the component in Forge projects.
|
|
47
|
+
*/
|
|
48
|
+
id: string;
|
|
49
|
+
/**
|
|
50
|
+
* Indicates whether Forge can safely control and render the component.
|
|
51
|
+
*
|
|
52
|
+
* Components marked as unsafe are excluded from Forge's interactive
|
|
53
|
+
* component controls.
|
|
54
|
+
*/
|
|
55
|
+
safe: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Indicates whether the component can contain other Forge elements.
|
|
58
|
+
*/
|
|
59
|
+
acceptsChildren?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Indicates that the component depends on context provided by
|
|
62
|
+
* an ancestor component.
|
|
63
|
+
*/
|
|
64
|
+
needsParentContext?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Identifies props that can reference project assets.
|
|
67
|
+
*
|
|
68
|
+
* Forge uses these declarations to provide the appropriate asset
|
|
69
|
+
* selection and resolution behavior.
|
|
70
|
+
*/
|
|
71
|
+
assetProps?: Record<string, "image" | "video" | "audio" | "font" | "snippet" | "icon">;
|
|
72
|
+
/**
|
|
73
|
+
* Lists props whose values can be controlled by Forge.
|
|
74
|
+
*/
|
|
75
|
+
controlled?: Array<keyof P>;
|
|
76
|
+
/**
|
|
77
|
+
* Specifies which interaction states Forge can represent for the component.
|
|
78
|
+
*/
|
|
79
|
+
interactionStates?: KuiInteractionState[];
|
|
80
|
+
/**
|
|
81
|
+
* Indicates the component's motion is gated by Forge at render-start
|
|
82
|
+
* (timers/transitions/uncontrolled animation disabled during render),
|
|
83
|
+
* rather than driven as a per-frame controlled prop. Components marked
|
|
84
|
+
* `safe: true` must honor this gate.
|
|
85
|
+
*/
|
|
86
|
+
motionGated?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Metadata describing a Kreativ UI component's capabilities and behavior.
|
|
90
|
+
*
|
|
91
|
+
* This metadata is attached to components and can be used by Kreativ UI,
|
|
92
|
+
* development tools, and integrations such as Kreativ Forge.
|
|
93
|
+
*/
|
|
94
|
+
interface KuiMeta<P = any> {
|
|
95
|
+
/**
|
|
96
|
+
* Identifies whether the component is a single or compound form control.
|
|
97
|
+
*/
|
|
14
98
|
formControl?: "single" | "compound";
|
|
99
|
+
/**
|
|
100
|
+
* Describes the states supported by the component.
|
|
101
|
+
*/
|
|
15
102
|
supports?: KuiSupports;
|
|
103
|
+
/**
|
|
104
|
+
* Defines the skeleton representation used while the component loads.
|
|
105
|
+
*/
|
|
16
106
|
skeleton?: KuiSkeletonHint;
|
|
107
|
+
/**
|
|
108
|
+
* Identifies the component's primary role.
|
|
109
|
+
*/
|
|
17
110
|
role?: KuiRole;
|
|
111
|
+
/**
|
|
112
|
+
* Identifies the component's slot when it participates in a compound component.
|
|
113
|
+
*/
|
|
18
114
|
groupSlot?: string;
|
|
115
|
+
/**
|
|
116
|
+
* Optional Kreativ Forge integration metadata.
|
|
117
|
+
*/
|
|
118
|
+
video?: KuiVideoMeta<P>;
|
|
119
|
+
/**
|
|
120
|
+
* Allowlist of props exposed in Forge's Properties tab, with the
|
|
121
|
+
* synthesized-group each belongs to.
|
|
122
|
+
*/
|
|
123
|
+
editableProps?: Array<{
|
|
124
|
+
prop: keyof P;
|
|
125
|
+
group: string;
|
|
126
|
+
label?: string;
|
|
127
|
+
}>;
|
|
128
|
+
/**
|
|
129
|
+
* Declares which prop resolves typography (via Kui's `resolveTypography`),
|
|
130
|
+
* letting Forge synthesize a Typography group wired to that prop.
|
|
131
|
+
*/
|
|
132
|
+
typographyProp?: {
|
|
133
|
+
prop: keyof P;
|
|
134
|
+
allowedPresets?: string[] | "all";
|
|
135
|
+
allowCustom?: boolean;
|
|
136
|
+
allowTokenReferences?: boolean;
|
|
137
|
+
customFields?: {
|
|
138
|
+
fontFamily?: boolean;
|
|
139
|
+
fontSize?: boolean;
|
|
140
|
+
fontWeight?: boolean;
|
|
141
|
+
lineHeight?: boolean;
|
|
142
|
+
letterSpacing?: boolean;
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Declares which prop resolves a semantic color token, letting Forge
|
|
147
|
+
* synthesize a Color group wired to that prop.
|
|
148
|
+
*/
|
|
149
|
+
colorProp?: {
|
|
150
|
+
prop: keyof P;
|
|
151
|
+
allowedTokens?: string[] | "all";
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Declares which prop resolves a size-scale token, letting Forge
|
|
155
|
+
* synthesize a Size group wired to that prop.
|
|
156
|
+
*/
|
|
157
|
+
sizeProp?: {
|
|
158
|
+
prop: keyof P;
|
|
159
|
+
allowedSizes?: string[] | "all";
|
|
160
|
+
};
|
|
19
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* A Kreativ UI component created with `createComponent`.
|
|
164
|
+
*
|
|
165
|
+
* In addition to normal React component behavior, Kreativ UI components
|
|
166
|
+
* expose metadata describing their capabilities and role.
|
|
167
|
+
*/
|
|
20
168
|
type KuiComponent<P, E> = React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<E>> & {
|
|
21
|
-
__kui: KuiMeta
|
|
169
|
+
__kui: KuiMeta<P>;
|
|
170
|
+
/**
|
|
171
|
+
* Describes a provider required by the component.
|
|
172
|
+
*/
|
|
173
|
+
providerRequired?: KuiProviderRequirement;
|
|
22
174
|
};
|
|
175
|
+
/**
|
|
176
|
+
* Configuration used to create a Kreativ UI component.
|
|
177
|
+
*/
|
|
23
178
|
interface CreateComponentConfig<P, E> {
|
|
24
|
-
|
|
179
|
+
/**
|
|
180
|
+
* Metadata describing the component's capabilities and behavior.
|
|
181
|
+
*/
|
|
182
|
+
__kui: KuiMeta<P>;
|
|
183
|
+
/**
|
|
184
|
+
* Renders the component and receives its forwarded ref.
|
|
185
|
+
*/
|
|
25
186
|
render: (props: P, ref: React.ForwardedRef<E>) => React.ReactElement | null;
|
|
187
|
+
/**
|
|
188
|
+
* Optional name used when displaying the component in development tools.
|
|
189
|
+
*/
|
|
26
190
|
displayName?: string;
|
|
27
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Creates a Kreativ UI component with forwarded-ref support and
|
|
194
|
+
* Kreativ UI metadata.
|
|
195
|
+
*
|
|
196
|
+
* @param config Component rendering function and metadata.
|
|
197
|
+
* @returns A React component with Kreativ UI metadata attached.
|
|
198
|
+
*/
|
|
28
199
|
declare function createComponent<P extends object, E = unknown>(config: CreateComponentConfig<P, E>): KuiComponent<P, E>;
|
|
200
|
+
/**
|
|
201
|
+
* Checks whether a value is a Kreativ UI component with component metadata.
|
|
202
|
+
*
|
|
203
|
+
* Useful when working with component types dynamically, such as when
|
|
204
|
+
* inspecting children of compound components.
|
|
205
|
+
*
|
|
206
|
+
* @param value Value to inspect.
|
|
207
|
+
* @returns `true` when the value contains valid Kreativ UI metadata.
|
|
208
|
+
*/
|
|
29
209
|
declare function hasKuiMeta(value: unknown): value is {
|
|
30
210
|
__kui: KuiMeta;
|
|
31
211
|
};
|
|
212
|
+
/**
|
|
213
|
+
* Lists the provider families available to Kreativ UI components.
|
|
214
|
+
*/
|
|
215
|
+
interface KuiProviderRegistry {
|
|
216
|
+
"Popover.Root": {
|
|
217
|
+
controlled: "open";
|
|
218
|
+
};
|
|
219
|
+
"Menu.Root": {
|
|
220
|
+
controlled: "open";
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Describes a provider that a component requires from its parent tree.
|
|
225
|
+
*/
|
|
226
|
+
interface KuiProviderRequirement<C extends keyof KuiProviderRegistry = keyof KuiProviderRegistry> {
|
|
227
|
+
/**
|
|
228
|
+
* Identifies the provider component that must be present.
|
|
229
|
+
*/
|
|
230
|
+
component: C;
|
|
231
|
+
/**
|
|
232
|
+
* Human-readable description of the provider requirement.
|
|
233
|
+
*/
|
|
234
|
+
label: string;
|
|
235
|
+
/**
|
|
236
|
+
* Lists provider state values that can be controlled by the parent provider.
|
|
237
|
+
*/
|
|
238
|
+
controlled?: Array<KuiProviderRegistry[C]["controlled"]>;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Declares that a component requires a specific provider ancestor.
|
|
242
|
+
*
|
|
243
|
+
* Use this when a component is intended to be rendered as part of a
|
|
244
|
+
* provider-based component such as Popover or Menu.
|
|
245
|
+
*
|
|
246
|
+
* @param component Provider component that must be present (e.g. "Popover.Root").
|
|
247
|
+
* @param opts Provider requirement details (label, controlled state).
|
|
248
|
+
* @returns A requirement descriptor; attach it via `component.providerRequired = ...`
|
|
249
|
+
* or pass the target component separately depending on call site.
|
|
250
|
+
*/
|
|
251
|
+
declare function requireProvider<C extends keyof KuiProviderRegistry>(component: C, opts: Omit<KuiProviderRequirement<C>, "component">): KuiProviderRequirement<C>;
|
|
252
|
+
/**
|
|
253
|
+
* Defines the child roles and slots accepted by a compound component.
|
|
254
|
+
*/
|
|
255
|
+
interface KuiChildrenRegistry {
|
|
256
|
+
ButtonGroup: {
|
|
257
|
+
roles: ["action"];
|
|
258
|
+
slots: ["ButtonGroup"];
|
|
259
|
+
};
|
|
260
|
+
List: {
|
|
261
|
+
roles: [];
|
|
262
|
+
slots: ["List"];
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Validates the direct children of a compound component during development.
|
|
267
|
+
*
|
|
268
|
+
* Unexpected children produce a development warning. Validation is skipped
|
|
269
|
+
* in production builds.
|
|
270
|
+
*
|
|
271
|
+
* @param parentKey Compound component whose children are being validated.
|
|
272
|
+
* @param children Children passed to the compound component.
|
|
273
|
+
*/
|
|
274
|
+
declare function useValidateChildren<K extends keyof KuiChildrenRegistry>(parentKey: K, children: React.ReactNode): void;
|
|
32
275
|
|
|
33
276
|
type PossibleRef<T> = React.Ref<T> | undefined;
|
|
34
277
|
declare function composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T>;
|
|
@@ -61,4 +304,35 @@ declare function resolveTokens(tokens: DesignTokens, semanticTokens: SemanticTok
|
|
|
61
304
|
declare function resolveSemanticTokenReferences(tokens: DesignTokens, semanticTokens: SemanticTokens): SemanticTokens;
|
|
62
305
|
declare function tokensToCssVars(tokens: ResolvedTokens, mode: "light" | "dark", intensity: number, prefix?: string): Record<string, string>;
|
|
63
306
|
|
|
64
|
-
|
|
307
|
+
interface WarnOnFlatCompoundConflictOptions {
|
|
308
|
+
/** The flat prop's value (or undefined/falsy if unset). */
|
|
309
|
+
flatValue: unknown;
|
|
310
|
+
/**
|
|
311
|
+
* Override for legitimately-falsy boolean flat props (e.g. a flat
|
|
312
|
+
* `open={false}` is still "set" and should be checked for conflict) —
|
|
313
|
+
* when provided, this takes precedence over checking flatValue's truthiness.
|
|
314
|
+
*/
|
|
315
|
+
hasFlatValue?: boolean;
|
|
316
|
+
children: React.ReactNode;
|
|
317
|
+
/** The compound part's component reference to match against, e.g. FormField.Label */
|
|
318
|
+
matchType: React.ElementType;
|
|
319
|
+
componentName: string;
|
|
320
|
+
propName: string;
|
|
321
|
+
childName: string;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Detects whether a flat prop (sugar for one specific named compound
|
|
325
|
+
* part) and that same named child are both present in the same
|
|
326
|
+
* render. Scoped ONLY to this named-flat-prop-vs-named-child
|
|
327
|
+
* conflict — not the general flat-vs-compound API style choice
|
|
328
|
+
* (e.g. Slider's flat-or-compound, which has no such conflict since
|
|
329
|
+
* the two are mutually exclusive paths with no simultaneous-use case).
|
|
330
|
+
*
|
|
331
|
+
* Returns true when the matching named child is present, meaning the
|
|
332
|
+
* caller should suppress its flat-prop-derived rendering and let the
|
|
333
|
+
* explicit child win. Warns in dev when BOTH the flat prop and the
|
|
334
|
+
* child are present, since that's very likely an authoring mistake.
|
|
335
|
+
*/
|
|
336
|
+
declare function warnOnFlatCompoundConflict({ flatValue, hasFlatValue, children, matchType, componentName, propName, childName, }: WarnOnFlatCompoundConflictOptions): boolean;
|
|
337
|
+
|
|
338
|
+
export { type CreateComponentConfig, type CreateFromPropsInput, type KuiChildrenRegistry, type KuiComponent, type KuiInteractionState, type KuiMeta, type KuiProviderRegistry, type KuiProviderRequirement, type KuiRole, type KuiSkeletonHint, type KuiSupports, type KuiVideoMeta, type ResolvedResponsiveValue, type WarnOnFlatCompoundConflictOptions, composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict };
|
package/dist/utils/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars } from '../chunk-
|
|
1
|
+
export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict } from '../chunk-Q5PIXJRW.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/createComponent.tsx","../src/utils/composeRefs.ts","../src/utils/createFromProps.ts","../src/utils/responsive.ts","../src/utils/deepMerge.ts","../src/utils/resolveTokenReference.ts","../src/utils/resolveTypography.ts","../src/utils/cssVariables.ts"],"names":["value","resolveValue"],"mappings":";;;AA2CO,SAAS,gBACd,MAAA,EACoB;AACpB,EAAA,MAAM,CAAA,GAAU,KAAA,CAAA,UAAA;AAAA,IACd,MAAA,CAAO;AAAA,GACT;AACA,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,WAAA,GAAc,MAAA,CAAO,WAAA;AAC/C,EAAA,CAAA,CAAE,QAAQ,MAAA,CAAO,KAAA;AACjB,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAA6C;AACtE,EAAA,OAAA,CACG,OAAO,KAAA,KAAU,UAAA,IACf,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,IAAA,KAC1C,OAAA,IAAY,SACZ,OAAQ,KAAA,CAA6B,KAAA,KAAU,QAAA,IAC9C,MAA6B,KAAA,KAAU,IAAA;AAE5C;;;AC3DO,SAAS,eAAkB,IAAA,EAA8C;AAC9E,EAAA,OAAO,CAAC,IAAA,KAAS;AACf,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,WAAA,IAC9B,GAAA,EAAM,GAAA,CAAyC,OAAA,GAAU,IAAA;AAAA,IACpE;AAAA,EACF,CAAA;AACF;;;ACJO,SAAS,gBAAkC,KAAA,EAAmC;AACnF,EAAA,OAAO;AAAA,IACL,GAAG,KAAA,CAAM,gBAAA;AAAA,IACT,GAAG,KAAA,CAAM,YAAA;AAAA,IACT,GAAG,KAAA,CAAM,cAAA;AAAA,IACT,GAAG,KAAA,CAAM;AAAA,GACX;AACF;;;ACXO,SAAS,kBACd,KAAA,EACsD;AACtD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAOO,SAAS,uBACd,KAAA,EAC4B;AAC5B,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,YAAY;AAAC,KACf;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,KAAA;AAExB,EAAA,MAAM,EAAE,IAAA,EAAM,GAAG,UAAA,EAAW,GAAI,eAAA;AAEhC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAY,MAAA,CAAO,WAAA;AAAA,MACjB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,GAAGA,MAAK,CAAA,KAAMA,MAAAA,KAAU,MAAS;AAAA;AACtE,GACF;AACF;AAEO,SAAS,mBAAA,CACd,OACA,OAAA,EACQ;AACR,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,KAAA,MAAW,CAAC,YAAY,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,EAAG;AACjE,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,OACI,IAAA,CACG,QAAA,GACA,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,SAAA,KAAc,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAC/C,IAAA,CAAK,GAAG,CAAA,GACX;AAAA,KACN;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;AAEO,SAAS,oBAAA,CACd,UACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,YAAA,GAAe,uBAAuB,QAAQ,CAAA;AAEpD,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,uBAAuB,KAAK,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA,CAAc,IAAA,IAAQ,YAAA,CAAa,IAAA;AAAA,IACzC,UAAA,EAAY;AAAA,MACV,GAAG,YAAA,CAAa,UAAA;AAAA,MAChB,GAAG,aAAA,CAAc;AAAA;AACnB,GACF;AACF;;;AC/EA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEO,SAAS,SAAA,CAAa,MAAS,QAAA,EAAuB;AAC3D,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,KAAK,CAAC,aAAA,CAAc,QAAQ,CAAA,EAAG;AACpD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,GAAG;AAAA,GACL;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,IAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAE3B,IAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,QAAA,EAAU,KAAK,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1BO,SAAS,qBAAA,CACd,OACA,MAAA,EACiB;AACjB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AAEtC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,CAAC,MAAM,MAAA,EAAW;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AAE/B,EAAA,IAAI,OAAA,GAAmB,MAAA;AAEvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,YAAY,IAAA,IAAQ,EAAE,OAAO,OAAA,CAAA,EAAU;AACxE,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,WAAW,OAAA,EAAS;AACzE,IAAA,MAAM,aAAc,OAAA,CAA+B,KAAA;AAEnD,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,OAAO,eAAe,QAAA,EAAU;AACpE,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,IAAY,OAAO,OAAA,KAAY,WACrD,OAAA,GACA,EAAA;AACN;;;ACrCO,SAAS,iBAAA,CACd,YACA,MAAA,EACe;AACf,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAAA,IAC/D,QAAA,EAAU,qBAAA,CAAsB,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AAAA,IAC3D,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAAA,IAC/D,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAAA,IAC/D,aAAA,EAAe,qBAAA;AAAA,MACb,UAAA,CAAW,aAAA;AAAA,MACX;AAAA;AACF,GACF;AACF;;;ACbO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,oBAAA,EAAsB,OAAO,EAAE,WAAA,EAAY;AAChE;AACA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAE3B,EAAA,MAAM,WAAW,OAAA,CAAQ,KAAA;AAAA,IACvB;AAAA,GACF;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAE5B,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA;AAChD,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,CAAA;AAEhD,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,IACvB;AAEC,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,MAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACtC,MAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAEtC,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,IAAI,iDAAA,CAAkD,IAAA,CAAK,OAAO,CAAA,EAAG;AACnE,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAA,CACP,WACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAEtE,EAAA,IAAI,OAAA,GAAmB,MAAA;AAEvB,EAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,IAAA,IACE,OAAO,OAAA,KAAY,QAAA,IACnB,YAAY,IAAA,IACZ,EAAE,WAAW,OAAA,CAAA,EACb;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAA,GAAW,QAAoC,OAAO,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,WAAW,OAAA,EAAS;AACzE,IAAA,MAAM,QAAS,OAAA,CAA4B,KAAA;AAE3C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBACP,SAAA,EACA,MAAA,EACA,IAAA,mBAAO,IAAI,KAAY,EACH;AACpB,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACvB,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,qDAAqD,SAAS,CAAA;AAAA,KAChE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,IAAI,CAAA;AAC7B,EAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAEtB,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,EAAW,MAAM,CAAA;AAE7C,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,qDAAqD,SAAS,CAAA;AAAA,KAChE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,IAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAA,CACP,OACA,MAAA,EACoB;AACpB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChD,IAAA,OAAO,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAA,CACP,KAAA,EACA,IAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,aAAc,KAAA,CAA0B,KAAA;AAE9C,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,EAAY,MAAM,CAAA;AAEhD,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,QAAA;AAAA,IAC3B;AAEA,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC3E,IAAA,aAAA,CAAc,OAAO,CAAC,GAAG,MAAM,GAAG,CAAA,EAAG,QAAQ,MAAM,CAAA;AAAA,EACrD;AACF;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,IAAA,EACA,MAAA,EACoB;AACpB,EAAA,IACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,OAAA,IAAW,KAAA,IACX,UAAU,KAAA,EACV;AACA,IAAA,MAAM,SAAA,GACJ,MAIA,IAAI,CAAA;AAEN,IAAA,OAAO,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AACnC;AAEA,SAAS,qBAAA,CACP,cAAA,EACA,MAAA,EACA,IAAA,EACgB;AAChB,EAAA,MAAM,SAAyB,EAAC;AAEhC,EAAA,SAAS,IAAA,CAAK,OAAgB,IAAA,EAAsB;AAClD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,gBAAiB,KAAA,CAA0B,KAAA;AAEjD,MAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,aAAA,EAAe,IAAA,EAAM,MAAM,CAAA;AAEjE,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,GAAI,QAAA;AAAA,MAC3B;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,MAChC;AAAA,KACF,EAAG;AACD,MAAA,IAAA,CAAK,KAAA,EAAO,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,cAAA,EAAgB,EAAE,CAAA;AAEvB,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,MAAA,EACA,cAAA,EACA,IAAA,EACgB;AAChB,EAAA,MAAM,kBAAkC,EAAC;AAEzC,EAAA,aAAA,CAAc,MAAA,EAAQ,EAAC,EAAG,eAAA,EAAiB,MAAM,CAAA;AAEjD,EAAA,MAAM,sBAAA,GAAyB,qBAAA;AAAA,IAC7B,cAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,eAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAEO,SAAS,8BAAA,CACd,QACA,cAAA,EACgB;AAChB,EAAA,SAASC,aAAAA,CAAa,KAAA,EAAgB,IAAA,mBAAO,IAAI,KAAY,EAAY;AACvE,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,CAAC,MAAM,UAAA,CAAW,GAAG,KAAK,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,qDAAqD,KAAK,CAAA;AAAA,SAC5D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA;AAE5C,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,qDAAqD,KAAK,CAAA;AAAA,SAC5D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,IAAI,CAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAElB,MAAA,OAAOA,aAAAA,CAAa,UAAU,QAAQ,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAASA,aAAAA,CAAa,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QACZ,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,UAC1C,GAAA;AAAA,UACAA,aAAAA,CAAa,OAAO,IAAI;AAAA,SACzB;AAAA,OACH;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAOA,cAAa,cAAc,CAAA;AACpC;AAEO,SAAS,eAAA,CACd,MAAA,EACA,IAAA,EACA,SAAA,EACA,SAAS,KAAA,EACe;AACxB,EAAA,MAAM,UAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,CAAC,MAAA,GAAS,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA,GAAI,KAAA;AAEnC,IAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA;AAE3D,IAAA,MAAM,mBAAmB,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA;AAE3D,IAAA,MAAM,UAAU,eAAA,GACZ,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,WAAA,CAAY,MAAM,CAAC,CAAA,CAAA,GAClC,CAAA,EAAA,EAAK,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAEnD,IAAA,MAAM,WAAA,GACJ,eAAA,IAAmB,gBAAA,GAAmB,kBAAA,CAAmB,KAAK,CAAA,GAAI,KAAA;AAEpE,IAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,WAAA;AAAA,EACrB;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IAEH,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,KAAA,CAAO,GAAG,IAAA;AAAA,IACtB,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,UAAA,CAAY,GAAG,OAAO,SAAS;AAAA,GAC7C;AACF","file":"chunk-OJSXALOI.js","sourcesContent":["import * as React from \"react\";\n\nexport interface KuiSupports {\n disabled?: boolean;\n invalid?: boolean;\n required?: boolean;\n [key: string]: boolean | undefined;\n}\nexport type KuiSkeletonHint =\n | \"text\"\n | \"rect\"\n | \"circle\"\n | \"input-shaped\"\n | \"preserve\"\n | (string & {});\nexport type KuiRole =\n | \"action\"\n | \"formControl\"\n | \"overlay\"\n | \"layout\"\n | \"display\"\n | \"disclosure\"\n | \"navigation\"\n | (string & {});\n\nexport interface KuiMeta {\n formControl?: \"single\" | \"compound\";\n supports?: KuiSupports;\n skeleton?: KuiSkeletonHint;\n role?: KuiRole;\n groupSlot?: string;\n}\n\nexport type KuiComponent<P, E> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<E>\n> & { __kui: KuiMeta };\n\nexport interface CreateComponentConfig<P, E> {\n __kui: KuiMeta;\n render: (props: P, ref: React.ForwardedRef<E>) => React.ReactElement | null;\n displayName?: string;\n}\n\nexport function createComponent<P extends object, E = unknown>(\n config: CreateComponentConfig<P, E>,\n): KuiComponent<P, E> {\n const C = React.forwardRef(\n config.render as unknown as React.ForwardRefRenderFunction<E, any>,\n ) as unknown as KuiComponent<P, E>;\n if (config.displayName) C.displayName = config.displayName;\n C.__kui = config.__kui;\n return C;\n}\n\nexport function hasKuiMeta(value: unknown): value is { __kui: KuiMeta } {\n return (\n (typeof value === \"function\" ||\n (typeof value === \"object\" && value !== null)) &&\n \"__kui\" in (value as object) &&\n typeof (value as { __kui: unknown }).__kui === \"object\" &&\n (value as { __kui: unknown }).__kui !== null\n );\n}\n","import type * as React from \"react\";\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\nexport function composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<T | null>).current = node;\n }\n };\n}\n","export interface CreateFromPropsInput<T extends object> {\n providerDefaults?: Partial<T>;\n defaultProps?: Partial<T>;\n generatedProps?: Partial<T>;\n consumerProps?: Partial<T>;\n}\nexport function createFromProps<T extends object>(input: CreateFromPropsInput<T>): T {\n return {\n ...input.providerDefaults,\n ...input.defaultProps,\n ...input.generatedProps,\n ...input.consumerProps,\n } as T;\n}\n","import type { BaseBreakpoint, ResponsiveValue } from \"@/types\";\n\nexport function isResponsiveValue<T>(\n value: ResponsiveValue<T>,\n): value is Partial<Record<\"base\" | BaseBreakpoint, T>> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport interface ResolvedResponsiveValue<T> {\n base?: T;\n responsive: Record<string, T>;\n}\n\nexport function resolveResponsiveValue<T, B extends string = string>(\n value: ResponsiveValue<T, B>,\n): ResolvedResponsiveValue<T> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return {\n base: value,\n responsive: {},\n };\n }\n\n const responsiveValue = value as Partial<Record<\"base\" | B, T>>;\n\n const { base, ...responsive } = responsiveValue;\n\n return {\n base,\n responsive: Object.fromEntries(\n Object.entries(responsive).filter(([, value]) => value !== undefined),\n ) as Record<string, T>,\n };\n}\n\nexport function toResponsiveClasses<T>(\n value: ResolvedResponsiveValue<T>,\n resolve: (value: T) => string,\n): string {\n const classes: string[] = [];\n\n if (value.base !== undefined) {\n classes.push(resolve(value.base));\n }\n\n for (const [breakpoint, item] of Object.entries(value.responsive)) {\n classes.push(\n item\n ? item\n .toString()\n .split(\" \")\n .map((className) => `${breakpoint}:${className}`)\n .join(\" \")\n : \"\",\n );\n }\n\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function mergeResponsiveValue<T, B extends string = string>(\n defaults: ResponsiveValue<T, B>,\n value?: ResponsiveValue<T, B>,\n): ResolvedResponsiveValue<T> {\n const defaultValue = resolveResponsiveValue(defaults);\n\n if (value === undefined) {\n return defaultValue;\n }\n\n const overrideValue = resolveResponsiveValue(value);\n\n return {\n base: overrideValue.base ?? defaultValue.base,\n responsive: {\n ...defaultValue.responsive,\n ...overrideValue.responsive,\n },\n };\n}\n","function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function deepMerge<T>(base: T, override?: unknown): T {\n if (override === undefined) {\n return base;\n }\n\n if (!isPlainObject(base) || !isPlainObject(override)) {\n return override as T;\n }\n\n const result: Record<string, unknown> = {\n ...base,\n };\n\n for (const [key, value] of Object.entries(override)) {\n const existing = result[key];\n\n if (isPlainObject(existing) && isPlainObject(value)) {\n result[key] = deepMerge(existing, value);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n","import type { DesignTokens } from \"@/types\";\r\n\r\nexport function resolveTokenReference(\r\n value: unknown,\r\n tokens: DesignTokens,\r\n): string | number {\r\n if (typeof value !== \"string\") {\r\n return typeof value === \"number\" ? value : \"\";\r\n }\r\n\r\n const match = value.match(/^\\{(.+)\\}$/);\r\n\r\n if (!match || match[1] === undefined) {\r\n return value;\r\n }\r\n\r\n const path = match[1].split(\".\");\r\n\r\n let current: unknown = tokens;\r\n\r\n for (const key of path) {\r\n if (typeof current !== \"object\" || current === null || !(key in current)) {\r\n return \"\";\r\n }\r\n\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n\r\n if (typeof current === \"object\" && current !== null && \"value\" in current) {\r\n const tokenValue = (current as { value: unknown }).value;\r\n\r\n if (typeof tokenValue === \"string\" || typeof tokenValue === \"number\") {\r\n return tokenValue;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n return typeof current === \"string\" || typeof current === \"number\"\r\n ? current\r\n : \"\";\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport type { DesignTokens, TypographyStyle } from \"@/types\";\r\nimport { resolveTokenReference } from \"./resolveTokenReference\";\r\n\r\nexport function resolveTypography(\r\n typography: TypographyStyle | undefined,\r\n tokens: DesignTokens,\r\n): CSSProperties {\r\n if (!typography) return {};\r\n\r\n return {\r\n fontFamily: resolveTokenReference(typography.fontFamily, tokens) as string,\r\n fontSize: resolveTokenReference(typography.fontSize, tokens) as string,\r\n fontWeight: resolveTokenReference(typography.fontWeight, tokens),\r\n lineHeight: resolveTokenReference(typography.lineHeight, tokens),\r\n letterSpacing: resolveTokenReference(\r\n typography.letterSpacing,\r\n tokens,\r\n ) as string,\r\n };\r\n}\r\n","import type {\r\n DesignTokens,\r\n ResolvedTokens,\r\n SemanticTokens,\r\n TokenDefinition,\r\n} from \"@/types\";\r\n\r\nexport function toKebabCase(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\nfunction colorToRgbChannels(value: string): string {\r\n const trimmed = value.trim();\r\n\r\n const rgbMatch = trimmed.match(\r\n /^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*[,\\s]\\s*(\\d+(?:\\.\\d+)?)\\s*[,\\s]\\s*(\\d+(?:\\.\\d+)?)(?:\\s*[/,]\\s*[\\d.]+%?)?\\s*\\)$/i,\r\n );\r\n\r\n if (rgbMatch) {\r\n return `${rgbMatch[1]} ${rgbMatch[2]} ${rgbMatch[3]}`;\r\n }\r\n\r\n if (trimmed.startsWith(\"#\")) {\r\n const hex = trimmed.slice(1);\r\n\r\n if (hex.length === 3) {\r\n const r = parseInt(hex.slice(0, 1).repeat(2), 16);\r\n const g = parseInt(hex.slice(1, 2).repeat(2), 16);\r\n const b = parseInt(hex.slice(2, 3).repeat(2), 16);\r\n\r\n return `${r} ${g} ${b}`;\r\n }\r\n\r\n if (hex.length === 6) {\r\n const r = parseInt(hex.slice(0, 2), 16);\r\n const g = parseInt(hex.slice(2, 4), 16);\r\n const b = parseInt(hex.slice(4, 6), 16);\r\n\r\n return `${r} ${g} ${b}`;\r\n }\r\n }\r\n\r\n if (/^\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?$/.test(trimmed)) {\r\n return trimmed;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction getTokenValue(\r\n reference: string,\r\n tokens: DesignTokens,\r\n): string | number | undefined {\r\n const path = reference.replace(/^\\{/, \"\").replace(/\\}$/, \"\").split(\".\");\r\n\r\n let current: unknown = tokens;\r\n\r\n for (const segment of path) {\r\n if (\r\n typeof current !== \"object\" ||\r\n current === null ||\r\n !(segment in current)\r\n ) {\r\n return undefined;\r\n }\r\n\r\n current = (current as Record<string, unknown>)[segment];\r\n }\r\n\r\n if (typeof current === \"object\" && current !== null && \"value\" in current) {\r\n const value = (current as TokenDefinition).value;\r\n\r\n if (typeof value === \"string\" || typeof value === \"number\") {\r\n return value;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction resolveReference(\r\n reference: string,\r\n tokens: DesignTokens,\r\n seen = new Set<string>(),\r\n): string | undefined {\r\n if (seen.has(reference)) {\r\n console.error(\r\n `[kreativ-core] Circular token reference detected: ${reference}`,\r\n );\r\n\r\n return undefined;\r\n }\r\n\r\n const nextSeen = new Set(seen);\r\n nextSeen.add(reference);\r\n\r\n const value = getTokenValue(reference, tokens);\r\n\r\n if (value === undefined) {\r\n console.warn(\r\n `[kreativ-core] Unable to resolve token reference: ${reference}`,\r\n );\r\n\r\n return undefined;\r\n }\r\n\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n if (value.startsWith(\"{\") && value.endsWith(\"}\")) {\r\n return resolveReference(value, tokens, nextSeen);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction resolveValue(\r\n value: unknown,\r\n tokens: DesignTokens,\r\n): string | undefined {\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n if (value.startsWith(\"{\") && value.endsWith(\"}\")) {\r\n return resolveReference(value, tokens);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction flattenTokens(\r\n value: unknown,\r\n path: string[],\r\n result: ResolvedTokens,\r\n tokens: DesignTokens,\r\n): void {\r\n if (typeof value !== \"object\" || value === null) {\r\n return;\r\n }\r\n\r\n if (\"value\" in value) {\r\n const tokenValue = (value as TokenDefinition).value;\r\n\r\n const resolved = resolveValue(tokenValue, tokens);\r\n\r\n if (resolved !== undefined) {\r\n result[path.join(\".\")] = resolved;\r\n }\r\n\r\n return;\r\n }\r\n\r\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\r\n flattenTokens(child, [...path, key], result, tokens);\r\n }\r\n}\r\n\r\nfunction resolveSemanticValue(\r\n value: unknown,\r\n mode: \"light\" | \"dark\",\r\n tokens: DesignTokens,\r\n): string | undefined {\r\n if (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"light\" in value &&\r\n \"dark\" in value\r\n ) {\r\n const modeValue = (\r\n value as {\r\n light: unknown;\r\n dark: unknown;\r\n }\r\n )[mode];\r\n\r\n return resolveValue(modeValue, tokens);\r\n }\r\n\r\n return resolveValue(value, tokens);\r\n}\r\n\r\nfunction resolveSemanticTokens(\r\n semanticTokens: SemanticTokens,\r\n tokens: DesignTokens,\r\n mode: \"light\" | \"dark\",\r\n): ResolvedTokens {\r\n const result: ResolvedTokens = {};\r\n\r\n function walk(value: unknown, path: string[]): void {\r\n if (typeof value !== \"object\" || value === null) {\r\n return;\r\n }\r\n\r\n if (\"value\" in value) {\r\n const semanticValue = (value as TokenDefinition).value;\r\n\r\n const resolved = resolveSemanticValue(semanticValue, mode, tokens);\r\n\r\n if (resolved !== undefined) {\r\n result[path.join(\".\")] = resolved;\r\n }\r\n\r\n return;\r\n }\r\n\r\n for (const [key, child] of Object.entries(\r\n value as Record<string, unknown>,\r\n )) {\r\n walk(child, [...path, key]);\r\n }\r\n }\r\n\r\n walk(semanticTokens, []);\r\n\r\n return result;\r\n}\r\n\r\nexport function resolveTokens(\r\n tokens: DesignTokens,\r\n semanticTokens: SemanticTokens,\r\n mode: \"light\" | \"dark\",\r\n): ResolvedTokens {\r\n const primitiveTokens: ResolvedTokens = {};\r\n\r\n flattenTokens(tokens, [], primitiveTokens, tokens);\r\n\r\n const resolvedSemanticTokens = resolveSemanticTokens(\r\n semanticTokens,\r\n tokens,\r\n mode,\r\n );\r\n\r\n return {\r\n ...primitiveTokens,\r\n ...resolvedSemanticTokens,\r\n };\r\n}\r\n\r\nexport function resolveSemanticTokenReferences(\r\n tokens: DesignTokens,\r\n semanticTokens: SemanticTokens,\r\n): SemanticTokens {\r\n function resolveValue(value: unknown, seen = new Set<string>()): unknown {\r\n if (typeof value === \"string\") {\r\n if (!value.startsWith(\"{\") || !value.endsWith(\"}\")) {\r\n return value;\r\n }\r\n\r\n if (seen.has(value)) {\r\n console.error(\r\n `[kreativ-core] Circular token reference detected: ${value}`,\r\n );\r\n\r\n return value;\r\n }\r\n\r\n const resolved = getTokenValue(value, tokens);\r\n\r\n if (resolved === undefined) {\r\n console.warn(\r\n `[kreativ-core] Unable to resolve token reference: ${value}`,\r\n );\r\n\r\n return value;\r\n }\r\n\r\n const nextSeen = new Set(seen);\r\n nextSeen.add(value);\r\n\r\n return resolveValue(resolved, nextSeen);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => resolveValue(item, seen));\r\n }\r\n\r\n if (typeof value === \"object\" && value !== null) {\r\n return Object.fromEntries(\r\n Object.entries(value).map(([key, child]) => [\r\n key,\r\n resolveValue(child, seen),\r\n ]),\r\n );\r\n }\r\n\r\n return value;\r\n }\r\n\r\n return resolveValue(semanticTokens) as SemanticTokens;\r\n}\r\n\r\nexport function tokensToCssVars(\r\n tokens: ResolvedTokens,\r\n mode: \"light\" | \"dark\",\r\n intensity: number,\r\n prefix = \"kui\",\r\n): Record<string, string> {\r\n const cssVars: Record<string, string> = {};\r\n\r\n for (const [path, value] of Object.entries(tokens)) {\r\n const parts = path.split(\".\");\r\n const [_first = \"\", second = \"\"] = parts;\r\n\r\n const isSemanticColor = parts.length === 2 && parts[0] === \"colors\";\r\n\r\n const isPrimitiveColor = parts.length >= 3 && parts[0] === \"colors\";\r\n\r\n const varName = isSemanticColor\r\n ? `--${prefix}-${toKebabCase(second)}`\r\n : `--${prefix}-${parts.map(toKebabCase).join(\"-\")}`;\r\n\r\n const outputValue =\r\n isSemanticColor || isPrimitiveColor ? colorToRgbChannels(value) : value;\r\n\r\n cssVars[varName] = outputValue;\r\n }\r\n\r\n return {\r\n ...cssVars,\r\n\r\n [`--${prefix}-mode`]: mode,\r\n [`--${prefix}-intensity`]: String(intensity),\r\n };\r\n}\r\n"]}
|