@splenddev/kreativ-core 0.1.6 → 0.1.8

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.
@@ -12,6 +12,36 @@ 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
+ Card: { roles: ["layout"], slots: ["Card"] }
41
+ };
42
+ function isMotionGated(props) {
43
+ return props["data-kui-motion-gated"] === true || props["data-kui-motion-gated"] === "true";
44
+ }
15
45
 
16
46
  // src/utils/composeRefs.ts
17
47
  function composeRefs(...refs) {
@@ -346,7 +376,31 @@ function tokensToCssVars(tokens, mode, intensity, prefix = "kui") {
346
376
  [`--${prefix}-intensity`]: String(intensity)
347
377
  };
348
378
  }
379
+ function warnOnFlatCompoundConflict({
380
+ flatValue,
381
+ hasFlatValue,
382
+ children,
383
+ matchType,
384
+ componentName,
385
+ propName,
386
+ childName
387
+ }) {
388
+ const flatIsSet = hasFlatValue !== void 0 ? hasFlatValue : Boolean(flatValue);
389
+ let childIsPresent = false;
390
+ React.Children.forEach(children, (child) => {
391
+ if (childIsPresent) return;
392
+ if (React.isValidElement(child) && child.type === matchType) {
393
+ childIsPresent = true;
394
+ }
395
+ });
396
+ if (flatIsSet && childIsPresent && process.env.NODE_ENV !== "production") {
397
+ console.warn(
398
+ `<${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.`
399
+ );
400
+ }
401
+ return childIsPresent;
402
+ }
349
403
 
350
- export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars };
351
- //# sourceMappingURL=chunk-OJSXALOI.js.map
352
- //# sourceMappingURL=chunk-OJSXALOI.js.map
404
+ export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isMotionGated, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict };
405
+ //# sourceMappingURL=chunk-KWNAUBVY.js.map
406
+ //# sourceMappingURL=chunk-KWNAUBVY.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-KWNAUBVY.js","sourcesContent":["import * as React from \"react\";\nimport { MotionGatedProps } from \"..\";\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 *\n * `controlled` is the provider state a child may declare via\n * `requireProvider`, not Forge `video.controlled` (that list is keyof props).\n */\nexport interface KuiProviderRegistry {\n \"Popover.Root\": { controlled: \"open\" };\n \"Menu.Root\": { controlled: \"open\" };\n \"Form.Root\": { controlled: \"values\" };\n \"FormField.Root\": { controlled: \"invalid\" };\n \"Select.Root\": { controlled: \"value\" | \"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 Card:{roles:[\"layout\"];slots:[\"Card\"]}\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 Card: { roles: [\"layout\"], slots: [\"Card\"] },\n} satisfies {\n [K in keyof KuiChildrenRegistry]: {\n roles: KuiChildrenRegistry[K][\"roles\"];\n slots: KuiChildrenRegistry[K][\"slots\"];\n };\n};\n\nexport function isMotionGated(props: MotionGatedProps): boolean {\n return (\n props[\"data-kui-motion-gated\"] === true ||\n props[\"data-kui-motion-gated\"] === \"true\"\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"]}
@@ -1,5 +1,5 @@
1
1
  import { ThemeContext, useTheme } from '../chunk-5CYSF7C3.js';
2
- import { isResponsiveValue, resolveTypography, resolveResponsiveValue } from '../chunk-OJSXALOI.js';
2
+ import { isResponsiveValue, resolveTypography, resolveResponsiveValue } from '../chunk-KWNAUBVY.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
- 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';
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, MotionGatedProps, 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, isMotionGated, 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-OJSXALOI.js';
2
+ export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isMotionGated, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict } from './chunk-KWNAUBVY.js';
3
3
  import './chunk-RV5MKKBP.js';
4
4
 
5
5
  // src/define/token.ts
@@ -456,6 +456,14 @@ interface ValidateProps<T = string> {
456
456
  */
457
457
  validateOn?: ValidateOn;
458
458
  }
459
+ /**
460
+ * Forge sets this on a safe, motionGated component at render-start.
461
+ * Data attributes stringify, so both the boolean prop and the "true"
462
+ * attribute count as gated.
463
+ */
464
+ interface MotionGatedProps {
465
+ "data-kui-motion-gated"?: boolean | "true" | "false";
466
+ }
459
467
 
460
468
  type TokenValue = string | number;
461
469
  interface TokenDefinition<T extends TokenValue = TokenValue> {
@@ -643,4 +651,4 @@ interface ThemeOverride {
643
651
  }
644
652
  type ColorMode = "light" | "dark" | "system";
645
653
 
646
- export type { AnimationTokens, BaseBreakpoint, BaseColor, BaseProps, BaseVariant, BreakpointTokens, CSSPropertiesWithVars, ClearableProps, ColorMode, ColorModeValue, ColorProps, ColorScale, ColorTokens, ControlledProps, CustomRecipes, DeepPartial, DefaultRecipeCollection, DesignTokens, DisabledProps, Easing, EmbeddedProps, FontSizeTokens, FontTokens, FontWeightTokens, FormFieldStatus, FullWidthProps, IntensityMap, LetterSpacingTokens, LineHeightTokens, LoadingProps, Orientation, OrientationProps, RadiusTokens, RecipeCollection, RecipeCompoundVariant, RecipeDefinition, RecipeStyle, RecipeVariant, RecipeVariantValue, ReportedValidity, RequiredStateControlProps, ResolvedTokens, ResponsiveStyles, ResponsiveValue, SemanticColorTokens, SemanticToken, SemanticTokens, ShadowTokens, Size, SizeProps, SizeScale, SizeToken, SizeValue, SpacingTokens, StateControlProps, StateProps, StatusProps, StyleObject, StyleValue, Styleable, Theme, ThemeAnimation, ThemeOverride, ThemeTogglerTransition, ThemeTransition, TokenDefinition, TokenGroup, TokenReferenceString, TokenValue, TrimProps, Typography, TypographyProps, TypographyStyle, UndoRedoProps, ValidateOn, ValidateProps, ValidationResult, ValueProps, Variant, VariantProps };
654
+ export type { AnimationTokens, BaseBreakpoint, BaseColor, BaseProps, BaseVariant, BreakpointTokens, CSSPropertiesWithVars, ClearableProps, ColorMode, ColorModeValue, ColorProps, ColorScale, ColorTokens, ControlledProps, CustomRecipes, DeepPartial, DefaultRecipeCollection, DesignTokens, DisabledProps, Easing, EmbeddedProps, FontSizeTokens, FontTokens, FontWeightTokens, FormFieldStatus, FullWidthProps, IntensityMap, LetterSpacingTokens, LineHeightTokens, LoadingProps, MotionGatedProps, Orientation, OrientationProps, RadiusTokens, RecipeCollection, RecipeCompoundVariant, RecipeDefinition, RecipeStyle, RecipeVariant, RecipeVariantValue, ReportedValidity, RequiredStateControlProps, ResolvedTokens, ResponsiveStyles, ResponsiveValue, SemanticColorTokens, SemanticToken, SemanticTokens, ShadowTokens, Size, SizeProps, SizeScale, SizeToken, SizeValue, SpacingTokens, StateControlProps, StateProps, StatusProps, StyleObject, StyleValue, Styleable, Theme, ThemeAnimation, ThemeOverride, ThemeTogglerTransition, ThemeTransition, TokenDefinition, TokenGroup, TokenReferenceString, TokenValue, TrimProps, Typography, TypographyProps, TypographyStyle, UndoRedoProps, ValidateOn, ValidateProps, ValidationResult, ValueProps, Variant, VariantProps };
@@ -1,34 +1,294 @@
1
1
  import * as React from 'react';
2
2
  import { CSSProperties } from 'react';
3
- import { ResponsiveValue, BaseBreakpoint, TypographyStyle, DesignTokens, SemanticTokens, ResolvedTokens } from '../types/index.js';
3
+ import { MotionGatedProps, 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
- interface KuiMeta {
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
- __kui: KuiMeta;
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
+ * `controlled` is the provider state a child may declare via
216
+ * `requireProvider`, not Forge `video.controlled` (that list is keyof props).
217
+ */
218
+ interface KuiProviderRegistry {
219
+ "Popover.Root": {
220
+ controlled: "open";
221
+ };
222
+ "Menu.Root": {
223
+ controlled: "open";
224
+ };
225
+ "Form.Root": {
226
+ controlled: "values";
227
+ };
228
+ "FormField.Root": {
229
+ controlled: "invalid";
230
+ };
231
+ "Select.Root": {
232
+ controlled: "value" | "open";
233
+ };
234
+ }
235
+ /**
236
+ * Describes a provider that a component requires from its parent tree.
237
+ */
238
+ interface KuiProviderRequirement<C extends keyof KuiProviderRegistry = keyof KuiProviderRegistry> {
239
+ /**
240
+ * Identifies the provider component that must be present.
241
+ */
242
+ component: C;
243
+ /**
244
+ * Human-readable description of the provider requirement.
245
+ */
246
+ label: string;
247
+ /**
248
+ * Lists provider state values that can be controlled by the parent provider.
249
+ */
250
+ controlled?: Array<KuiProviderRegistry[C]["controlled"]>;
251
+ }
252
+ /**
253
+ * Declares that a component requires a specific provider ancestor.
254
+ *
255
+ * Use this when a component is intended to be rendered as part of a
256
+ * provider-based component such as Popover or Menu.
257
+ *
258
+ * @param component Provider component that must be present (e.g. "Popover.Root").
259
+ * @param opts Provider requirement details (label, controlled state).
260
+ * @returns A requirement descriptor; attach it via `component.providerRequired = ...`
261
+ * or pass the target component separately depending on call site.
262
+ */
263
+ declare function requireProvider<C extends keyof KuiProviderRegistry>(component: C, opts: Omit<KuiProviderRequirement<C>, "component">): KuiProviderRequirement<C>;
264
+ /**
265
+ * Defines the child roles and slots accepted by a compound component.
266
+ */
267
+ interface KuiChildrenRegistry {
268
+ ButtonGroup: {
269
+ roles: ["action"];
270
+ slots: ["ButtonGroup"];
271
+ };
272
+ List: {
273
+ roles: [];
274
+ slots: ["List"];
275
+ };
276
+ Card: {
277
+ roles: ["layout"];
278
+ slots: ["Card"];
279
+ };
280
+ }
281
+ /**
282
+ * Validates the direct children of a compound component during development.
283
+ *
284
+ * Unexpected children produce a development warning. Validation is skipped
285
+ * in production builds.
286
+ *
287
+ * @param parentKey Compound component whose children are being validated.
288
+ * @param children Children passed to the compound component.
289
+ */
290
+ declare function useValidateChildren<K extends keyof KuiChildrenRegistry>(parentKey: K, children: React.ReactNode): void;
291
+ declare function isMotionGated(props: MotionGatedProps): boolean;
32
292
 
33
293
  type PossibleRef<T> = React.Ref<T> | undefined;
34
294
  declare function composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T>;
@@ -61,4 +321,35 @@ declare function resolveTokens(tokens: DesignTokens, semanticTokens: SemanticTok
61
321
  declare function resolveSemanticTokenReferences(tokens: DesignTokens, semanticTokens: SemanticTokens): SemanticTokens;
62
322
  declare function tokensToCssVars(tokens: ResolvedTokens, mode: "light" | "dark", intensity: number, prefix?: string): Record<string, string>;
63
323
 
64
- export { type CreateComponentConfig, type CreateFromPropsInput, type KuiComponent, type KuiMeta, type KuiRole, type KuiSkeletonHint, type KuiSupports, type ResolvedResponsiveValue, composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars };
324
+ interface WarnOnFlatCompoundConflictOptions {
325
+ /** The flat prop's value (or undefined/falsy if unset). */
326
+ flatValue: unknown;
327
+ /**
328
+ * Override for legitimately-falsy boolean flat props (e.g. a flat
329
+ * `open={false}` is still "set" and should be checked for conflict) —
330
+ * when provided, this takes precedence over checking flatValue's truthiness.
331
+ */
332
+ hasFlatValue?: boolean;
333
+ children: React.ReactNode;
334
+ /** The compound part's component reference to match against, e.g. FormField.Label */
335
+ matchType: React.ElementType;
336
+ componentName: string;
337
+ propName: string;
338
+ childName: string;
339
+ }
340
+ /**
341
+ * Detects whether a flat prop (sugar for one specific named compound
342
+ * part) and that same named child are both present in the same
343
+ * render. Scoped ONLY to this named-flat-prop-vs-named-child
344
+ * conflict — not the general flat-vs-compound API style choice
345
+ * (e.g. Slider's flat-or-compound, which has no such conflict since
346
+ * the two are mutually exclusive paths with no simultaneous-use case).
347
+ *
348
+ * Returns true when the matching named child is present, meaning the
349
+ * caller should suppress its flat-prop-derived rendering and let the
350
+ * explicit child win. Warns in dev when BOTH the flat prop and the
351
+ * child are present, since that's very likely an authoring mistake.
352
+ */
353
+ declare function warnOnFlatCompoundConflict({ flatValue, hasFlatValue, children, matchType, componentName, propName, childName, }: WarnOnFlatCompoundConflictOptions): boolean;
354
+
355
+ 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, isMotionGated, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict };
@@ -1,3 +1,3 @@
1
- export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars } from '../chunk-OJSXALOI.js';
1
+ export { composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isMotionGated, isResponsiveValue, mergeResponsiveValue, requireProvider, resolveResponsiveValue, resolveSemanticTokenReferences, resolveTokenReference, resolveTokens, resolveTypography, toKebabCase, toResponsiveClasses, tokensToCssVars, useValidateChildren, warnOnFlatCompoundConflict } from '../chunk-KWNAUBVY.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splenddev/kreativ-core",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Design-system foundation for Kreativ UI — tokens, theming, recipes, and component primitives.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -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":"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","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"]}