@splenddev/kreativ-core 0.1.1 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useBreakpoint.ts","../../src/provider/ThemeContext.tsx","../../src/hooks/useColorMode.ts","../../src/hooks/useControllableState.ts","../../src/utils/responsive.ts","../../src/hooks/useMergedResponsiveStyles.ts","../../src/provider/useTheme.ts","../../src/hooks/useResponsiveStyles.ts","../../src/hooks/useSizeStyle.ts","../../src/hooks/useSizeToken.ts","../../src/hooks/useSizes.ts","../../src/utils/resolveTokenReference.ts","../../src/utils/resolveTypography.ts","../../src/hooks/useTypography.ts","../../src/hooks/useUndoRedo.ts"],"names":["value","useContext","useMemo","token","useState","useRef","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\n\r\n// Mirrors Tailwind's default breakpoints so component internals can branch\r\n// on the same thresholds consumers style against.\r\nconst BREAKPOINTS = {\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n \"2xl\": 1536,\r\n} as const;\r\n\r\ntype Breakpoint = keyof typeof BREAKPOINTS;\r\n\r\n/** Returns whether the viewport is at or above the given breakpoint. */\r\nexport function useBreakpoint(breakpoint: Breakpoint): boolean {\r\n const query = `(min-width: ${BREAKPOINTS[breakpoint]}px)`;\r\n const [matches, setMatches] = useState(\r\n () => typeof window !== \"undefined\" && window.matchMedia(query).matches\r\n );\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(query);\r\n const listener = (e: MediaQueryListEvent) => setMatches(e.matches);\r\n mql.addEventListener(\"change\", listener);\r\n setMatches(mql.matches);\r\n return () => mql.removeEventListener(\"change\", listener);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport type { ColorMode, Theme, ResolvedTokens } from \"@/types/theme\";\r\n\r\nexport interface ThemeContextValue {\r\n theme: Theme;\r\n mode: ColorMode;\r\n resolvedMode: \"light\" | \"dark\";\r\n setMode: (mode: ColorMode) => void;\r\n fallbackSize: string;\r\n tokens: ResolvedTokens;\r\n}\r\n\r\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\r\n","import { useContext } from \"react\";\nimport { ThemeContext } from \"../provider/ThemeContext\";\nimport { ColorMode } from \"@/types/theme\";\n\nexport interface UseColorModeReturn {\n mode: ColorMode;\n setMode: (mode: ColorMode) => void;\n toggleColorMode: () => void;\n}\n\nexport function useColorMode(): UseColorModeReturn {\n const ctx = useContext(ThemeContext);\n\n if (!ctx) {\n throw new Error(\"useColorMode must be used within a ThemeProvider\");\n }\n\n return {\n mode: ctx.mode,\n setMode: ctx.setMode,\n toggleColorMode: () => {\n throw new Error(\"not implemented\");\n },\n };\n}\n","import * as React from \"react\";\n\nexport interface UseControllableStateOptions<T> {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? (value as T) : internal;\n const currentRef = React.useRef(current);\n currentRef.current = current;\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n\n const set = React.useCallback(\n (next: T) => {\n if (Object.is(next, currentRef.current)) return;\n if (!isControlled) setInternal(next);\n onChangeRef.current?.(next);\n },\n [isControlled],\n );\n return [current, set];\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","\"use client\";\r\n\r\nimport { useMemo } from \"react\";\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ResponsiveValue, ResponsiveStyles } from \"@/types\";\r\nimport { resolveResponsiveValue } from \"@/utils/responsive\";\r\n\r\n/**\r\n * One entry: a responsive prop value plus a mapper from that value to a\r\n * partial CSSProperties object.\r\n *\r\n * Using `any` for the value type because different entries may have different\r\n * value types, and we only need to call the mapper with the resolved value.\r\n */\r\nexport type ResponsivePropEntry = [\r\n value: ResponsiveValue<any> | undefined,\r\n toCss: (value: any) => Partial<CSSProperties>,\r\n];\r\n\r\nfunction mergeResponsiveProps(\r\n entries: ResponsivePropEntry[],\r\n): ResponsiveStyles {\r\n const result: ResponsiveStyles = {};\r\n\r\n for (const [value, toCss] of entries) {\r\n if (value === undefined) continue;\r\n\r\n const { base, responsive } = resolveResponsiveValue(value);\r\n\r\n if (base !== undefined) {\r\n result.base = { ...result.base, ...toCss(base) };\r\n }\r\n\r\n for (const [bp, v] of Object.entries(responsive)) {\r\n result[bp] = { ...result[bp], ...toCss(v) };\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Merges multiple ResponsiveValue<T> props into one ResponsiveStyles map,\r\n * memoized on the entries' values.\r\n *\r\n * @example\r\n * const responsiveStyles = useMergedResponsiveStyles([\r\n * [gap, (v) => ({ gap: spaceVar(v) })],\r\n * [align, (v) => ({ alignItems: v })],\r\n * ]);\r\n */\r\nexport function useMergedResponsiveStyles(\r\n entries: ResponsivePropEntry[],\r\n): ResponsiveStyles {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useMemo(\r\n () => mergeResponsiveProps(entries),\r\n entries.map(([value]) => value),\r\n );\r\n}\r\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThemeContext } from \"@/provider/ThemeContext\";\n\nexport function useTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\n \"useTheme() was called outside <UIProvider>. Wrap your app in <UIProvider> from 'kreativ-ui'.\",\n );\n }\n return ctx;\n}\n","\"use client\";\r\n\r\nimport { type CSSProperties, useId, useMemo } from \"react\";\r\n\r\nimport type { ResponsiveStyles } from \"@/types\";\r\nimport { useTheme } from \"@/provider/useTheme\";\r\n\r\nconst cssPropertyToKebab = (property: string) =>\r\n property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n\r\nconst cssValue = (value: CSSProperties[keyof CSSProperties]) => {\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n return value;\r\n};\r\n\r\nexport function useResponsiveStyles(responsiveStyles?: ResponsiveStyles) {\r\n const { theme } = useTheme();\r\n const id = useId();\r\n\r\n return useMemo(() => {\r\n if (!responsiveStyles || Object.keys(responsiveStyles).length === 0) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n const breakpoints = theme.tokens.breakpoints;\r\n\r\n if (!breakpoints) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n const attribute = id.replace(/:/g, \"\");\r\n\r\n const selector = `[data-kui-responsive=\"${attribute}\"]`;\r\n\r\n const rules: string[] = [];\r\n\r\n for (const [breakpoint, styles] of Object.entries(responsiveStyles)) {\r\n const declarations = Object.entries(styles)\r\n .filter(([, value]) => value !== undefined)\r\n .map(\r\n ([property, value]) =>\r\n `${cssPropertyToKebab(property)}:${cssValue(value)};`,\r\n )\r\n .join(\"\");\r\n\r\n if (!declarations) continue;\r\n\r\n if (breakpoint === \"base\") {\r\n rules.push(`\r\n ${selector} {\r\n ${declarations}\r\n }\r\n `);\r\n\r\n continue;\r\n }\r\n\r\n const breakpointToken = breakpoints[breakpoint];\r\n\r\n if (!breakpointToken) continue;\r\n\r\n rules.push(`\r\n @media (min-width: ${breakpointToken.value}) {\r\n ${selector} {\r\n ${declarations}\r\n }\r\n }\r\n `);\r\n }\r\n\r\n if (rules.length === 0) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n return {\r\n attribute,\r\n style: rules.join(\"\\n\"),\r\n };\r\n }, [responsiveStyles, theme.tokens.breakpoints, id]);\r\n}\r\n","\"use client\";\n\nimport { useMemo, type CSSProperties } from \"react\";\n\nimport type {\n CSSPropertiesWithVars,\n ResponsiveStyles,\n ResponsiveValue,\n} from \"@/types\";\nimport { isResponsiveValue } from \"@/utils/responsive\";\nimport { useTheme } from \"@/provider/useTheme\";\n\nexport interface UseSizeStyleOptions {\n includeHeight?: boolean;\n includeWidth?: boolean;\n widthFromHeight?: boolean;\n sizeOffset?: string;\n fontSizeOffset?: string;\n}\n\nexport interface ResolvedSize {\n /**\n * Inline styles for non-responsive sizing.\n *\n * For responsive values this is intentionally empty so that\n * breakpoint styles can override each other through CSS.\n */\n style: CSSProperties;\n\n /**\n * Styles generated for responsive sizing.\n */\n responsiveStyles?: ResponsiveStyles;\n\n iconSize?: CSSProperties[\"width\"];\n fontSize?: CSSProperties[\"fontSize\"];\n gap?: CSSProperties[\"gap\"];\n}\n\nconst applySizeOffset = (\n value: string | undefined,\n offset: string | undefined,\n) => {\n if (!value || !offset) return value;\n\n return `calc(${value} - ${offset})`;\n};\n\nexport function useSizeStyle(\n size: ResponsiveValue<string>,\n iconOnly = false,\n componentName = \"component\",\n options: UseSizeStyleOptions = {},\n): ResolvedSize {\n const {\n widthFromHeight = false,\n includeHeight = true,\n includeWidth = false,\n sizeOffset,\n fontSizeOffset,\n } = options;\n\n const { theme, fallbackSize } = useTheme();\n\n return useMemo(() => {\n const scale = theme.sizes;\n\n const resolveToken = (sizeName: string) =>\n scale[sizeName] ?? scale[fallbackSize] ?? Object.values(scale)[0] ?? {};\n\n const buildStyle = (sizeName: string): CSSPropertiesWithVars => {\n const token = resolveToken(sizeName);\n const style: CSSPropertiesWithVars = {};\n\n if (includeHeight && token.height) {\n style.height = applySizeOffset(token.height, sizeOffset);\n }\n\n if (includeWidth) {\n if (iconOnly && token.width) {\n style.width = applySizeOffset(token.width, sizeOffset);\n } else if (\n (iconOnly || widthFromHeight) &&\n includeHeight &&\n token.height\n ) {\n style.width = applySizeOffset(token.height, sizeOffset);\n }\n }\n\n if (!iconOnly && token.paddingX) {\n style.paddingLeft = token.paddingX;\n style.paddingRight = token.paddingX;\n }\n\n if (token.paddingY) {\n style.paddingTop = token.paddingY;\n style.paddingBottom = token.paddingY;\n }\n\n if (token.fontSize) {\n style.fontSize = applySizeOffset(token.fontSize, fontSizeOffset);\n }\n\n if (token.gap) {\n style.gap = iconOnly ? 0 : token.gap;\n }\n\n if (token.radius) {\n const varName = `--kui-${componentName}-radius` as `--kui-${string}`;\n\n style[varName] = token.radius;\n }\n\n return style;\n };\n\n if (!isResponsiveValue(size)) {\n const style = buildStyle(size);\n const token = resolveToken(size);\n\n return {\n style,\n iconSize: token.iconSize,\n fontSize: applySizeOffset(token.fontSize, fontSizeOffset),\n gap: token.gap,\n };\n }\n\n const { base, ...breakpoints } = size;\n\n const baseSize = base ?? fallbackSize;\n\n const responsiveStyles: ResponsiveStyles = {\n base: buildStyle(baseSize),\n };\n\n for (const [breakpoint, breakpointSize] of Object.entries(breakpoints)) {\n if (breakpointSize === undefined) continue;\n\n responsiveStyles[breakpoint] = buildStyle(breakpointSize);\n }\n\n const token = resolveToken(baseSize);\n\n return {\n style: {},\n responsiveStyles,\n iconSize: token.iconSize,\n fontSize: applySizeOffset(token.fontSize, fontSizeOffset),\n gap: token.gap,\n };\n }, [\n theme.sizes,\n size,\n fallbackSize,\n iconOnly,\n includeHeight,\n includeWidth,\n widthFromHeight,\n componentName,\n sizeOffset,\n fontSizeOffset,\n ]);\n}\n","import type { ResponsiveValue, SizeToken } from \"@/types\";\r\n\r\nimport { useMemo } from \"react\";\r\nimport { useTheme } from \"@/provider/useTheme\";\r\nimport { isResponsiveValue } from \"@/utils/responsive\";\r\n\r\ntype SizeTokenValue = SizeToken[keyof SizeToken];\r\n\r\nfunction applyOffset(value: SizeTokenValue, offset?: string): SizeTokenValue {\r\n if (offset == null || value == null) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n return `calc(${value} - ${offset})`;\r\n}\r\n\r\nexport function useSizeToken(size: ResponsiveValue<string>): SizeToken;\r\n\r\nexport function useSizeToken<K extends keyof SizeToken>(\r\n size: ResponsiveValue<string>,\r\n key: K,\r\n offset?: string,\r\n): SizeToken[K];\r\n\r\nexport function useSizeToken<K extends keyof SizeToken>(\r\n size: ResponsiveValue<string>,\r\n key?: K,\r\n offset?: string,\r\n): SizeToken | SizeToken[K] {\r\n const { theme, fallbackSize } = useTheme();\r\n\r\n return useMemo(() => {\r\n const scale = theme.sizes;\r\n\r\n const baseSize = isResponsiveValue(size)\r\n ? (size.base ?? fallbackSize)\r\n : size;\r\n\r\n const token =\r\n scale[baseSize] ?? scale[fallbackSize] ?? Object.values(scale)[0] ?? {};\r\n\r\n if (!key) {\r\n return token;\r\n }\r\n\r\n return applyOffset(token[key], offset) as SizeToken[K];\r\n }, [theme.sizes, size, fallbackSize, key, offset]);\r\n}\r\n","import { useTheme } from \"@/provider/useTheme\";\r\nimport type { Size, Theme } from \"@/types\";\r\n\r\nexport function getSizes(theme: Theme): Size[] {\r\n return Object.keys(theme.sizes ?? {}) as Size[];\r\n}\r\n\r\nexport function useSizes(): Size[] {\r\n const { theme } = useTheme();\r\n return getSizes(theme);\r\n}\r\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 { useTheme } from \"@/provider\";\r\nimport { resolveTypography } from \"@/utils\";\r\n\r\nexport function useTypography(name?: string) {\r\n const { theme } = useTheme();\r\n\r\n return resolveTypography(\r\n name ? theme.typography[name] : undefined,\r\n theme.tokens,\r\n );\r\n}","import { useCallback, useRef, useState } from \"react\";\r\n\r\ninterface UseUndoRedoOptions {\r\n /**\r\n * Maximum number of history entries to keep.\r\n * Only applies when `undoable` is `true` and the component manages its own history.\r\n * @default 30\r\n */\r\n maxHistory?: number;\r\n}\r\n\r\n/**\r\n * Manages a history stack for a value, providing undo/redo capabilities.\r\n * The hook stores the current value in its own state, but you can also\r\n * sync it with external state by calling `push` when the external value changes.\r\n *\r\n * @param initialValue - The starting value.\r\n * @param options - Configuration (maxHistory).\r\n * @returns An object with the current value, setters, and undo/redo controls.\r\n */\r\nexport function useUndoRedo<T>(\r\n initialValue: T,\r\n options: UseUndoRedoOptions & {\r\n onValueChange?: (value: T | undefined) => void;\r\n } = {},\r\n) {\r\n const { maxHistory = 30, onValueChange } = options;\r\n\r\n const [value, setValue] = useState<T | undefined>(initialValue);\r\n const historyRef = useRef<T[]>([initialValue]);\r\n const indexRef = useRef(0);\r\n\r\n const push = useCallback(\r\n (newValue: T) => {\r\n if (newValue === historyRef.current[indexRef.current]) return;\r\n\r\n historyRef.current = historyRef.current.slice(0, indexRef.current + 1);\r\n\r\n historyRef.current.push(newValue);\r\n if (historyRef.current.length > maxHistory) {\r\n historyRef.current = historyRef.current.slice(-maxHistory);\r\n indexRef.current = historyRef.current.length - 1;\r\n } else {\r\n indexRef.current = historyRef.current.length - 1;\r\n }\r\n\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n },\r\n [maxHistory, onValueChange],\r\n );\r\n\r\n const undo = useCallback(() => {\r\n if (indexRef.current <= 0) return;\r\n indexRef.current -= 1;\r\n const newValue = historyRef.current[indexRef.current];\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n }, [onValueChange]);\r\n\r\n const redo = useCallback(() => {\r\n if (indexRef.current >= historyRef.current.length - 1) return;\r\n indexRef.current += 1;\r\n const newVal = historyRef.current[indexRef.current];\r\n setValue(newVal);\r\n }, []);\r\n\r\n const reset = useCallback(\r\n (newValue: T) => {\r\n historyRef.current = [newValue];\r\n indexRef.current = 0;\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n },\r\n [onValueChange],\r\n );\r\n\r\n const canUndo = indexRef.current > 0;\r\n const canRedo = indexRef.current < historyRef.current.length - 1;\r\n\r\n return {\r\n value,\r\n setValue,\r\n push,\r\n undo,\r\n redo,\r\n reset,\r\n canUndo,\r\n canRedo,\r\n history: historyRef.current,\r\n currentIndex: indexRef.current,\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/hooks/useBreakpoint.ts","../../src/hooks/useColorMode.ts","../../src/hooks/useControllableState.ts","../../src/hooks/useMergedResponsiveStyles.ts","../../src/hooks/useResponsiveStyles.ts","../../src/hooks/useSizeStyle.ts","../../src/hooks/useSizeToken.ts","../../src/hooks/useSizes.ts","../../src/hooks/useTypography.ts","../../src/hooks/useUndoRedo.ts"],"names":["useMemo","token","useState","useRef","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\r\n\r\nimport { BaseBreakpoint } from \"@/types\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nconst BREAKPOINTS: Record<BaseBreakpoint, number> = {\r\n sm: 640,\r\n md: 768,\r\n lg: 1024,\r\n xl: 1280,\r\n \"2xl\": 1536,\r\n};\r\n\r\nexport function useBreakpoint(breakpoint: BaseBreakpoint): boolean {\r\n const query = `(min-width: ${BREAKPOINTS[breakpoint]}px)`;\r\n const [matches, setMatches] = useState(\r\n () => typeof window !== \"undefined\" && window.matchMedia(query).matches,\r\n );\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(query);\r\n const listener = (e: MediaQueryListEvent) => setMatches(e.matches);\r\n mql.addEventListener(\"change\", listener);\r\n setMatches(mql.matches);\r\n return () => mql.removeEventListener(\"change\", listener);\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n","import { useContext } from \"react\";\nimport { ThemeContext } from \"../provider/ThemeContext\";\nimport { ColorMode } from \"@/types/theme\";\n\nexport interface UseColorModeReturn {\n mode: ColorMode;\n setMode: (mode: ColorMode) => void;\n toggleColorMode: () => void;\n}\n\nexport function useColorMode(): UseColorModeReturn {\n const ctx = useContext(ThemeContext);\n\n if (!ctx) {\n throw new Error(\"useColorMode must be used within a ThemeProvider\");\n }\n\n return {\n mode: ctx.mode,\n setMode: ctx.setMode,\n toggleColorMode: () => {\n throw new Error(\"not implemented\");\n },\n };\n}\n","import * as React from \"react\";\n\nexport interface UseControllableStateOptions<T> {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? (value as T) : internal;\n const currentRef = React.useRef(current);\n currentRef.current = current;\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n\n const set = React.useCallback(\n (next: T) => {\n if (Object.is(next, currentRef.current)) return;\n if (!isControlled) setInternal(next);\n onChangeRef.current?.(next);\n },\n [isControlled],\n );\n return [current, set];\n}\n","\"use client\";\r\n\r\nimport { useMemo } from \"react\";\r\nimport type { CSSProperties } from \"react\";\r\nimport type { ResponsiveValue, ResponsiveStyles } from \"@/types\";\r\nimport { resolveResponsiveValue } from \"@/utils/responsive\";\r\n\r\n/**\r\n * One entry: a responsive prop value plus a mapper from that value to a\r\n * partial CSSProperties object.\r\n *\r\n * Using `any` for the value type because different entries may have different\r\n * value types, and we only need to call the mapper with the resolved value.\r\n */\r\nexport type ResponsivePropEntry = [\r\n value: ResponsiveValue<any> | undefined,\r\n toCss: (value: any) => Partial<CSSProperties>,\r\n];\r\n\r\nfunction mergeResponsiveProps(\r\n entries: ResponsivePropEntry[],\r\n): ResponsiveStyles {\r\n const result: ResponsiveStyles = {};\r\n\r\n for (const [value, toCss] of entries) {\r\n if (value === undefined) continue;\r\n\r\n const { base, responsive } = resolveResponsiveValue(value);\r\n\r\n if (base !== undefined) {\r\n result.base = { ...result.base, ...toCss(base) };\r\n }\r\n\r\n for (const [bp, v] of Object.entries(responsive)) {\r\n result[bp] = { ...result[bp], ...toCss(v) };\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Merges multiple ResponsiveValue<T> props into one ResponsiveStyles map,\r\n * memoized on the entries' values.\r\n *\r\n * @example\r\n * const responsiveStyles = useMergedResponsiveStyles([\r\n * [gap, (v) => ({ gap: spaceVar(v) })],\r\n * [align, (v) => ({ alignItems: v })],\r\n * ]);\r\n */\r\nexport function useMergedResponsiveStyles(\r\n entries: ResponsivePropEntry[],\r\n): ResponsiveStyles {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useMemo(\r\n () => mergeResponsiveProps(entries),\r\n entries.map(([value]) => value),\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { type CSSProperties, useId, useMemo } from \"react\";\r\n\r\nimport type { ResponsiveStyles } from \"@/types\";\r\nimport { useTheme } from \"@/provider/useTheme\";\r\n\r\nconst cssPropertyToKebab = (property: string) =>\r\n property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n\r\nconst cssValue = (value: CSSProperties[keyof CSSProperties]) => {\r\n if (typeof value === \"number\") {\r\n return String(value);\r\n }\r\n\r\n return value;\r\n};\r\n\r\nexport function useResponsiveStyles(responsiveStyles?: ResponsiveStyles) {\r\n const { theme } = useTheme();\r\n const id = useId();\r\n\r\n return useMemo(() => {\r\n if (!responsiveStyles || Object.keys(responsiveStyles).length === 0) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n const breakpoints = theme.tokens.breakpoints;\r\n\r\n if (!breakpoints) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n const attribute = id.replace(/:/g, \"\");\r\n\r\n const selector = `[data-kui-responsive=\"${attribute}\"]`;\r\n\r\n const rules: string[] = [];\r\n\r\n for (const [breakpoint, styles] of Object.entries(responsiveStyles)) {\r\n const declarations = Object.entries(styles)\r\n .filter(([, value]) => value !== undefined)\r\n .map(\r\n ([property, value]) =>\r\n `${cssPropertyToKebab(property)}:${cssValue(value)};`,\r\n )\r\n .join(\"\");\r\n\r\n if (!declarations) continue;\r\n\r\n if (breakpoint === \"base\") {\r\n rules.push(`\r\n ${selector} {\r\n ${declarations}\r\n }\r\n `);\r\n\r\n continue;\r\n }\r\n\r\n const breakpointToken = breakpoints[breakpoint];\r\n\r\n if (!breakpointToken) continue;\r\n\r\n rules.push(`\r\n @media (min-width: ${breakpointToken.value}) {\r\n ${selector} {\r\n ${declarations}\r\n }\r\n }\r\n `);\r\n }\r\n\r\n if (rules.length === 0) {\r\n return {\r\n attribute: undefined,\r\n style: undefined,\r\n };\r\n }\r\n\r\n return {\r\n attribute,\r\n style: rules.join(\"\\n\"),\r\n };\r\n }, [responsiveStyles, theme.tokens.breakpoints, id]);\r\n}\r\n","\"use client\";\n\nimport { useMemo, type CSSProperties } from \"react\";\n\nimport type {\n CSSPropertiesWithVars,\n ResponsiveStyles,\n ResponsiveValue,\n} from \"@/types\";\nimport { isResponsiveValue } from \"@/utils/responsive\";\nimport { useTheme } from \"@/provider/useTheme\";\n\nexport interface UseSizeStyleOptions {\n includeHeight?: boolean;\n includeWidth?: boolean;\n widthFromHeight?: boolean;\n sizeOffset?: string;\n fontSizeOffset?: string;\n}\n\nexport interface ResolvedSize {\n /**\n * Inline styles for non-responsive sizing.\n *\n * For responsive values this is intentionally empty so that\n * breakpoint styles can override each other through CSS.\n */\n style: CSSProperties;\n\n /**\n * Styles generated for responsive sizing.\n */\n responsiveStyles?: ResponsiveStyles;\n\n iconSize?: CSSProperties[\"width\"];\n fontSize?: CSSProperties[\"fontSize\"];\n gap?: CSSProperties[\"gap\"];\n}\n\nconst applySizeOffset = (\n value: string | undefined,\n offset: string | undefined,\n) => {\n if (!value || !offset) return value;\n\n return `calc(${value} - ${offset})`;\n};\n\nexport function useSizeStyle(\n size: ResponsiveValue<string>,\n iconOnly = false,\n componentName = \"component\",\n options: UseSizeStyleOptions = {},\n): ResolvedSize {\n const {\n widthFromHeight = false,\n includeHeight = true,\n includeWidth = false,\n sizeOffset,\n fontSizeOffset,\n } = options;\n\n const { theme, fallbackSize } = useTheme();\n\n return useMemo(() => {\n const scale = theme.sizes;\n\n const resolveToken = (sizeName: string) =>\n scale[sizeName] ?? scale[fallbackSize] ?? Object.values(scale)[0] ?? {};\n\n const buildStyle = (sizeName: string): CSSPropertiesWithVars => {\n const token = resolveToken(sizeName);\n const style: CSSPropertiesWithVars = {};\n\n if (includeHeight && token.height) {\n style.height = applySizeOffset(token.height, sizeOffset);\n }\n\n if (includeWidth) {\n if (iconOnly && token.width) {\n style.width = applySizeOffset(token.width, sizeOffset);\n } else if (\n (iconOnly || widthFromHeight) &&\n includeHeight &&\n token.height\n ) {\n style.width = applySizeOffset(token.height, sizeOffset);\n }\n }\n\n if (!iconOnly && token.paddingX) {\n style.paddingLeft = token.paddingX;\n style.paddingRight = token.paddingX;\n }\n\n if (token.paddingY) {\n style.paddingTop = token.paddingY;\n style.paddingBottom = token.paddingY;\n }\n\n if (token.fontSize) {\n style.fontSize = applySizeOffset(token.fontSize, fontSizeOffset);\n }\n\n if (token.gap) {\n style.gap = iconOnly ? 0 : token.gap;\n }\n\n if (token.radius) {\n const varName = `--kui-${componentName}-radius` as `--kui-${string}`;\n\n style[varName] = token.radius;\n }\n\n return style;\n };\n\n if (!isResponsiveValue(size)) {\n const style = buildStyle(size);\n const token = resolveToken(size);\n\n return {\n style,\n iconSize: token.iconSize,\n fontSize: applySizeOffset(token.fontSize, fontSizeOffset),\n gap: token.gap,\n };\n }\n\n const { base, ...breakpoints } = size;\n\n const baseSize = base ?? fallbackSize;\n\n const responsiveStyles: ResponsiveStyles = {\n base: buildStyle(baseSize),\n };\n\n for (const [breakpoint, breakpointSize] of Object.entries(breakpoints)) {\n if (breakpointSize === undefined) continue;\n\n responsiveStyles[breakpoint] = buildStyle(breakpointSize);\n }\n\n const token = resolveToken(baseSize);\n\n return {\n style: {},\n responsiveStyles,\n iconSize: token.iconSize,\n fontSize: applySizeOffset(token.fontSize, fontSizeOffset),\n gap: token.gap,\n };\n }, [\n theme.sizes,\n size,\n fallbackSize,\n iconOnly,\n includeHeight,\n includeWidth,\n widthFromHeight,\n componentName,\n sizeOffset,\n fontSizeOffset,\n ]);\n}\n","import type { ResponsiveValue, SizeToken } from \"@/types\";\r\n\r\nimport { useMemo } from \"react\";\r\nimport { useTheme } from \"@/provider/useTheme\";\r\nimport { isResponsiveValue } from \"@/utils/responsive\";\r\n\r\ntype SizeTokenValue = SizeToken[keyof SizeToken];\r\n\r\nfunction applyOffset(value: SizeTokenValue, offset?: string): SizeTokenValue {\r\n if (offset == null || value == null) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n return `calc(${value} - ${offset})`;\r\n}\r\n\r\nexport function useSizeToken(size: ResponsiveValue<string>): SizeToken;\r\n\r\nexport function useSizeToken<K extends keyof SizeToken>(\r\n size: ResponsiveValue<string>,\r\n key: K,\r\n offset?: string,\r\n): SizeToken[K];\r\n\r\nexport function useSizeToken<K extends keyof SizeToken>(\r\n size: ResponsiveValue<string>,\r\n key?: K,\r\n offset?: string,\r\n): SizeToken | SizeToken[K] {\r\n const { theme, fallbackSize } = useTheme();\r\n\r\n return useMemo(() => {\r\n const scale = theme.sizes;\r\n\r\n const baseSize = isResponsiveValue(size)\r\n ? (size.base ?? fallbackSize)\r\n : size;\r\n\r\n const token =\r\n scale[baseSize] ?? scale[fallbackSize] ?? Object.values(scale)[0] ?? {};\r\n\r\n if (!key) {\r\n return token;\r\n }\r\n\r\n return applyOffset(token[key], offset) as SizeToken[K];\r\n }, [theme.sizes, size, fallbackSize, key, offset]);\r\n}\r\n","import { useTheme } from \"@/provider/useTheme\";\r\nimport type { Size, Theme } from \"@/types\";\r\n\r\nexport function getSizes(theme: Theme): Size[] {\r\n return Object.keys(theme.sizes ?? {}) as Size[];\r\n}\r\n\r\nexport function useSizes(): Size[] {\r\n const { theme } = useTheme();\r\n return getSizes(theme);\r\n}\r\n","import { useTheme } from \"@/provider\";\r\nimport { resolveTypography } from \"@/utils\";\r\n\r\nexport function useTypography(name?: string) {\r\n const { theme } = useTheme();\r\n\r\n return resolveTypography(\r\n name ? theme.typography[name] : undefined,\r\n theme.tokens,\r\n );\r\n}","import { useCallback, useRef, useState } from \"react\";\r\n\r\ninterface UseUndoRedoOptions {\r\n /**\r\n * Maximum number of history entries to keep.\r\n * Only applies when `undoable` is `true` and the component manages its own history.\r\n * @default 30\r\n */\r\n maxHistory?: number;\r\n}\r\n\r\n/**\r\n * Manages a history stack for a value, providing undo/redo capabilities.\r\n * The hook stores the current value in its own state, but you can also\r\n * sync it with external state by calling `push` when the external value changes.\r\n *\r\n * @param initialValue - The starting value.\r\n * @param options - Configuration (maxHistory).\r\n * @returns An object with the current value, setters, and undo/redo controls.\r\n */\r\nexport function useUndoRedo<T>(\r\n initialValue: T,\r\n options: UseUndoRedoOptions & {\r\n onValueChange?: (value: T | undefined) => void;\r\n } = {},\r\n) {\r\n const { maxHistory = 30, onValueChange } = options;\r\n\r\n const [value, setValue] = useState<T | undefined>(initialValue);\r\n const historyRef = useRef<T[]>([initialValue]);\r\n const indexRef = useRef(0);\r\n\r\n const push = useCallback(\r\n (newValue: T) => {\r\n if (newValue === historyRef.current[indexRef.current]) return;\r\n\r\n historyRef.current = historyRef.current.slice(0, indexRef.current + 1);\r\n\r\n historyRef.current.push(newValue);\r\n if (historyRef.current.length > maxHistory) {\r\n historyRef.current = historyRef.current.slice(-maxHistory);\r\n indexRef.current = historyRef.current.length - 1;\r\n } else {\r\n indexRef.current = historyRef.current.length - 1;\r\n }\r\n\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n },\r\n [maxHistory, onValueChange],\r\n );\r\n\r\n const undo = useCallback(() => {\r\n if (indexRef.current <= 0) return;\r\n indexRef.current -= 1;\r\n const newValue = historyRef.current[indexRef.current];\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n }, [onValueChange]);\r\n\r\n const redo = useCallback(() => {\r\n if (indexRef.current >= historyRef.current.length - 1) return;\r\n indexRef.current += 1;\r\n const newVal = historyRef.current[indexRef.current];\r\n setValue(newVal);\r\n }, []);\r\n\r\n const reset = useCallback(\r\n (newValue: T) => {\r\n historyRef.current = [newValue];\r\n indexRef.current = 0;\r\n setValue(newValue);\r\n onValueChange?.(newValue);\r\n },\r\n [onValueChange],\r\n );\r\n\r\n const canUndo = indexRef.current > 0;\r\n const canRedo = indexRef.current < historyRef.current.length - 1;\r\n\r\n return {\r\n value,\r\n setValue,\r\n push,\r\n undo,\r\n redo,\r\n reset,\r\n canUndo,\r\n canRedo,\r\n history: historyRef.current,\r\n currentIndex: indexRef.current,\r\n };\r\n}\r\n"]}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- import { T as TokenValue, b as SemanticToken, c as Typography, D as DesignTokens, d as TokenDefinition, e as TokenReferenceString$1, f as SemanticTokens } from './common-1QyKLdTc.js';
2
- export { A as AnimationTokens, B as BaseBreakpoint, g as BaseColor, h as BaseProps, i as BaseVariant, j as BreakpointTokens, C as CSSPropertiesWithVars, k as ClearableProps, l as ColorModeValue, m as ColorProps, n as ColorScale, o as ColorTokens, p as ControlledProps, q as DeepPartial, r as DisabledProps, E as Easing, s as EmbeddedProps, F as FontSizeTokens, t as FontTokens, u as FontWeightTokens, v as FormFieldStatus, w as FullWidthProps, L as LetterSpacingTokens, x as LineHeightTokens, y as LoadingProps, O as Orientation, z as OrientationProps, G as RadiusTokens, H as ReportedValidity, I as RequiredStateControlProps, a as ResponsiveStyles, R as ResponsiveValue, J as SemanticColorTokens, K as ShadowTokens, S as Size, M as SizeProps, N as SizeValue, P as SpacingTokens, Q as StateControlProps, U as StateProps, V as StatusProps, W as Styleable, X as ThemeAnimation, Y as TokenGroup, Z as TrimProps, _ as TypographyProps, $ as TypographyStyle, a0 as UndoRedoProps, a1 as ValidateOn, a2 as ValidateProps, a3 as ValidationResult, a4 as ValueProps, a5 as Variant, a6 as VariantProps } from './common-1QyKLdTc.js';
3
- import { SizeToken, SizeScale, RecipeDefinition, Theme, ColorMode, ResolvedTokens } from './types/index.js';
4
- export { CustomRecipes, DefaultRecipeCollection, IntensityMap, RecipeCollection, RecipeCompoundVariant, RecipeStyle, RecipeVariant, RecipeVariantValue, StyleObject, StyleValue, ThemeOverride, ThemeTogglerTransition, ThemeTransition } from './types/index.js';
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';
5
3
  import * as React from 'react';
6
- export { CreateComponentConfig, CreateFromPropsInput, KuiComponent, KuiMeta, KuiRole, KuiSkeletonHint, KuiSupports, ResolvedResponsiveValue, composeRefs, createComponent, createFromProps, deepMerge, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveTokenReference, resolveTypography, toResponsiveClasses } from './utils/index.js';
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';
7
5
 
8
6
  declare function defineToken<T extends TokenValue>(value: T): {
9
7
  value: T;
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- import * as React from 'react';
2
- import { createContext, useContext } from 'react';
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';
3
+ import './chunk-RV5MKKBP.js';
3
4
 
4
5
  // src/define/token.ts
5
6
  function defineToken(value) {
@@ -143,162 +144,7 @@ function defineTheme(theme) {
143
144
  assertNoCycles(theme.semanticTokens);
144
145
  return theme;
145
146
  }
146
- var ThemeContext = createContext(null);
147
- function useTheme() {
148
- const ctx = useContext(ThemeContext);
149
- if (!ctx) {
150
- throw new Error(
151
- "useTheme() was called outside <UIProvider>. Wrap your app in <UIProvider> from 'kreativ-ui'."
152
- );
153
- }
154
- return ctx;
155
- }
156
- function createComponent(config) {
157
- const C = React.forwardRef(
158
- config.render
159
- );
160
- if (config.displayName) C.displayName = config.displayName;
161
- C.__kui = config.__kui;
162
- return C;
163
- }
164
- function hasKuiMeta(value) {
165
- return (typeof value === "function" || typeof value === "object" && value !== null) && "__kui" in value && typeof value.__kui === "object" && value.__kui !== null;
166
- }
167
-
168
- // src/utils/composeRefs.ts
169
- function composeRefs(...refs) {
170
- return (node) => {
171
- for (const ref of refs) {
172
- if (typeof ref === "function") ref(node);
173
- else if (ref) ref.current = node;
174
- }
175
- };
176
- }
177
-
178
- // src/utils/createFromProps.ts
179
- function createFromProps(input) {
180
- return {
181
- ...input.providerDefaults,
182
- ...input.defaultProps,
183
- ...input.generatedProps,
184
- ...input.consumerProps
185
- };
186
- }
187
-
188
- // src/utils/responsive.ts
189
- function isResponsiveValue(value) {
190
- return typeof value === "object" && value !== null;
191
- }
192
- function resolveResponsiveValue(value) {
193
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
194
- return {
195
- base: value,
196
- responsive: {}
197
- };
198
- }
199
- const responsiveValue = value;
200
- const { base, ...responsive } = responsiveValue;
201
- return {
202
- base,
203
- responsive: Object.fromEntries(
204
- Object.entries(responsive).filter(([, value2]) => value2 !== void 0)
205
- )
206
- };
207
- }
208
- function toResponsiveClasses(value, resolve) {
209
- const classes = [];
210
- if (value.base !== void 0) {
211
- classes.push(resolve(value.base));
212
- }
213
- for (const [breakpoint, item] of Object.entries(value.responsive)) {
214
- classes.push(
215
- item ? item.toString().split(" ").map((className) => `${breakpoint}:${className}`).join(" ") : ""
216
- );
217
- }
218
- return classes.filter(Boolean).join(" ");
219
- }
220
- function mergeResponsiveValue(defaults, value) {
221
- const defaultValue = resolveResponsiveValue(defaults);
222
- if (value === void 0) {
223
- return defaultValue;
224
- }
225
- const overrideValue = resolveResponsiveValue(value);
226
- return {
227
- base: overrideValue.base ?? defaultValue.base,
228
- responsive: {
229
- ...defaultValue.responsive,
230
- ...overrideValue.responsive
231
- }
232
- };
233
- }
234
-
235
- // src/utils/deepMerge.ts
236
- function isPlainObject(value) {
237
- return typeof value === "object" && value !== null && !Array.isArray(value);
238
- }
239
- function deepMerge(base, override) {
240
- if (override === void 0) {
241
- return base;
242
- }
243
- if (!isPlainObject(base) || !isPlainObject(override)) {
244
- return override;
245
- }
246
- const result = {
247
- ...base
248
- };
249
- for (const [key, value] of Object.entries(override)) {
250
- const existing = result[key];
251
- if (isPlainObject(existing) && isPlainObject(value)) {
252
- result[key] = deepMerge(existing, value);
253
- } else {
254
- result[key] = value;
255
- }
256
- }
257
- return result;
258
- }
259
-
260
- // src/utils/resolveTokenReference.ts
261
- function resolveTokenReference(value, tokens) {
262
- if (typeof value !== "string") {
263
- return typeof value === "number" ? value : "";
264
- }
265
- const match = value.match(/^\{(.+)\}$/);
266
- if (!match || match[1] === void 0) {
267
- return value;
268
- }
269
- const path = match[1].split(".");
270
- let current = tokens;
271
- for (const key of path) {
272
- if (typeof current !== "object" || current === null || !(key in current)) {
273
- return "";
274
- }
275
- current = current[key];
276
- }
277
- if (typeof current === "object" && current !== null && "value" in current) {
278
- const tokenValue = current.value;
279
- if (typeof tokenValue === "string" || typeof tokenValue === "number") {
280
- return tokenValue;
281
- }
282
- return "";
283
- }
284
- return typeof current === "string" || typeof current === "number" ? current : "";
285
- }
286
-
287
- // src/utils/resolveTypography.ts
288
- function resolveTypography(typography, tokens) {
289
- if (!typography) return {};
290
- return {
291
- fontFamily: resolveTokenReference(typography.fontFamily, tokens),
292
- fontSize: resolveTokenReference(typography.fontSize, tokens),
293
- fontWeight: resolveTokenReference(typography.fontWeight, tokens),
294
- lineHeight: resolveTokenReference(typography.lineHeight, tokens),
295
- letterSpacing: resolveTokenReference(
296
- typography.letterSpacing,
297
- tokens
298
- )
299
- };
300
- }
301
147
 
302
- export { ThemeContext, assertNoCycles, composeRefs, createComponent, createFromProps, deepMerge, defineRecipe, defineSemanticToken, defineSemanticTokens, defineSize, defineSizes, defineTheme, defineToken, defineTokens, defineTypography, hasKuiMeta, isResponsiveValue, mergeResponsiveValue, resolveResponsiveValue, resolveTokenReference, resolveTypography, toResponsiveClasses, useTheme, validateNoCycles };
148
+ export { assertNoCycles, defineRecipe, defineSemanticToken, defineSemanticTokens, defineSize, defineSizes, defineTheme, defineToken, defineTokens, defineTypography, validateNoCycles };
303
149
  //# sourceMappingURL=index.js.map
304
150
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/define/token.ts","../src/define/semanticToken.ts","../src/define/size.ts","../src/define/typography.ts","../src/define/recipe.ts","../src/runtime/validateCycles.ts","../src/define/theme.ts","../src/provider/ThemeContext.tsx","../src/provider/useTheme.ts","../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"],"names":["value"],"mappings":"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","file":"index.js","sourcesContent":["import type { TokenValue } from \"@/types\";\n\nexport function defineToken<T extends TokenValue>(value: T) {\n return {\n value,\n };\n}\n\nexport function defineTokens<T extends Record<string, TokenValue>>(tokens: T) {\n return Object.fromEntries(\n Object.entries(tokens).map(([key, value]) => [key, defineToken(value)]),\n ) as {\n [K in keyof T]: ReturnType<typeof defineToken<T[K]>>;\n };\n}\n","import type { SemanticToken, TokenValue } from \"@/types\";\n\n/**\n * Defines a semantic token that shares a single value across both\n * light and dark modes (the explicit sameForBothModes shorthand).\n */\nexport function defineSemanticToken<T extends TokenValue>(\n value: T,\n): SemanticToken<T>;\n/**\n * Defines a semantic token with distinct light and dark values.\n */\nexport function defineSemanticToken<T extends TokenValue>(\n light: T,\n dark: T,\n): SemanticToken<T>;\nexport function defineSemanticToken<T extends TokenValue>(\n lightOrValue: T,\n dark?: T,\n): SemanticToken<T> {\n if (dark === undefined) {\n return {\n value: {\n sameForBothModes: true,\n value: lightOrValue,\n },\n };\n }\n\n return {\n value: {\n sameForBothModes: false,\n light: lightOrValue,\n dark,\n },\n };\n}\n\ntype SemanticTokenInput<T extends TokenValue> = T | { light: T; dark: T };\n\nexport function defineSemanticTokens<\n T extends Record<string, SemanticTokenInput<TokenValue>>,\n>(\n tokens: T,\n): {\n [K in keyof T]: SemanticToken<T[K] extends { light: infer V; dark: infer _ }\n ? V extends TokenValue\n ? V\n : never\n : T[K] extends TokenValue\n ? T[K]\n : never>;\n} {\n return Object.fromEntries(\n Object.entries(tokens).map(([key, entry]) => [\n key,\n entry !== null &&\n typeof entry === \"object\" &&\n \"light\" in entry &&\n \"dark\" in entry\n ? defineSemanticToken(entry.light, entry.dark)\n : defineSemanticToken(entry as TokenValue),\n ]),\n ) as ReturnType<typeof defineSemanticTokens<T>>;\n}\n","import type { SizeScale, SizeToken } from \"@/types\";\n\nexport function defineSize<const T extends SizeToken>(size: T): T {\n return size;\n}\n\nexport function defineSizes<const T extends SizeScale>(sizes: T): T {\n return sizes;\n}\n","import type { Typography } from \"@/types\";\n\nexport function defineTypography<const T extends Typography>(typography: T): T {\n return typography;\n}\n","import type { RecipeDefinition } from \"@/types\";\n\nexport function defineRecipe<const T extends RecipeDefinition>(recipe: T): T {\n return recipe;\n}\n","import type { SemanticTokens } from \"@/types\";\n\nconst REFERENCE_PATTERN = /^\\{(.+)\\}$/;\n\n/**\n * If value is a \"{colors.brand.500}\"-style reference string, returns\n * the raw dotted path (\"colors.brand.500\"). Otherwise returns null.\n */\nfunction extractReferencePath(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const match = value.match(REFERENCE_PATTERN);\n return match ? match[1] : undefined;\n}\n\n/**\n * Resolves a dotted path against an object tree. Returns undefined\n * if any segment doesn't exist.\n */\nfunction resolvePath(tree: unknown, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = tree;\n\n for (const segment of segments) {\n if (current === null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Given a resolved semantic-token node (shape: { value: ColorModeValue }),\n * returns the reference string(s) its value points to, if any — i.e.\n * the next hop(s) in a semantic->semantic chain. Non-reference\n * (literal) values return an empty array — the chain ends there.\n */\nfunction nextReferences(node: unknown): string[] {\n if (node === null || typeof node !== \"object\" || !(\"value\" in node)) {\n return [];\n }\n\n const colorModeValue = (node as { value: unknown }).value;\n\n if (colorModeValue === null || typeof colorModeValue !== \"object\") {\n return [];\n }\n\n const cmv = colorModeValue as Record<string, unknown>;\n\n if (cmv.sameForBothModes === true) {\n const ref = extractReferencePath(cmv.value);\n return ref ? [ref] : [];\n }\n\n const refs: string[] = [];\n const lightRef = extractReferencePath(cmv.light);\n const darkRef = extractReferencePath(cmv.dark);\n if (lightRef) refs.push(lightRef);\n if (darkRef) refs.push(darkRef);\n return refs;\n}\n\nexport interface CycleValidationResult {\n valid: boolean;\n cyclePath?: string[];\n}\n\n/**\n * Walks every semantic token's reference chain looking for a\n * semantic->semantic cycle. Reference *existence* (does the path\n * resolve at all) is validated separately at the type level via\n * ValidateSemanticTokenSection — this function only detects cycles\n * among references that do resolve to another semantic token.\n *\n * A reference that resolves to nothing (dangling) or to a primitive\n * token is a dead end for cycle-walking purposes here, not an error\n * this function raises — that's the type-level existence check's job.\n */\nexport function validateNoCycles(\n semanticTokens: SemanticTokens,\n): CycleValidationResult {\n function walk(path: string, visited: string[]): CycleValidationResult {\n if (visited.includes(path)) {\n return { valid: false, cyclePath: [...visited, path] };\n }\n\n const node = resolvePath(semanticTokens, path);\n const refs = nextReferences(node);\n\n for (const ref of refs) {\n const result = walk(ref, [...visited, path]);\n if (!result.valid) return result;\n }\n\n return { valid: true };\n }\n\n function collectPaths(tree: unknown, prefix: string[] = []): string[][] {\n if (tree === null || typeof tree !== \"object\") return [];\n\n const entries = Object.entries(tree as Record<string, unknown>);\n const paths: string[][] = [];\n\n for (const [key, value] of entries) {\n const currentPath = [...prefix, key];\n\n if (\n value !== null &&\n typeof value === \"object\" &&\n \"value\" in (value as Record<string, unknown>)\n ) {\n paths.push(currentPath);\n } else {\n paths.push(...collectPaths(value, currentPath));\n }\n }\n\n return paths;\n }\n\n const allLeafPaths = collectPaths(semanticTokens);\n\n for (const pathSegments of allLeafPaths) {\n const path = pathSegments.join(\".\");\n const result = walk(path, []);\n if (!result.valid) return result;\n }\n\n return { valid: true };\n}\n\n/**\n * Throws a descriptive error if a semantic->semantic cycle is found.\n * Intended to be called from defineTheme/extendTheme.\n */\nexport function assertNoCycles(semanticTokens: SemanticTokens): void {\n const result = validateNoCycles(semanticTokens);\n\n if (!result.valid) {\n throw new Error(\n `Kreativ UI: circular semantic token reference detected: ${result.cyclePath?.join(\" -> \")}`,\n );\n }\n}\n","import type { Theme } from \"@/types\";\nimport type { ValidateTheme } from \"../validate/theme\";\nimport { assertNoCycles } from \"../runtime/validateCycles\";\n\n/**\n * Defines a Kreativ UI theme.\n *\n * Type-safe boundary for creating themes while preserving the exact\n * structure and types of the supplied theme. Does not merge with the\n * default theme or mutate the provided object — extension/resolution\n * are handled separately by extendTheme.\n *\n * `T & ValidateTheme<T>` is what actually enforces validation at the\n * call site: ValidateTheme<T> resolves to `unknown` (a no-op) when\n * every section passes, or a section-named `{ tokens: Invalid<...> }`\n * / `{ semanticTokens: Invalid<...> }` / etc. object when a section\n * fails. Intersecting that onto the parameter type means a failing\n * theme produces a real compile error naming the failing section and\n * message, not just a generic \"not assignable to Theme\".\n *\n * Reference *existence* (does \"{colors.brand.500}\" resolve to a real\n * token) is checked at compile time via ValidateSemanticTokenSection,\n * as part of ValidateTheme above. Reference *cycles* (semantic token\n * A -> B -> A) can't be reliably caught at the type level (hit TS\n * inference edge cases in recursive conditional types), so they're\n * checked here at call time instead, via assertNoCycles.\n */\nexport function defineTheme<T extends Theme>(theme: T & ValidateTheme<T>): T {\n assertNoCycles(theme.semanticTokens);\n return theme;\n}\n\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport type { ColorMode, Theme, ResolvedTokens } from \"@/types/theme\";\r\n\r\nexport interface ThemeContextValue {\r\n theme: Theme;\r\n mode: ColorMode;\r\n resolvedMode: \"light\" | \"dark\";\r\n setMode: (mode: ColorMode) => void;\r\n fallbackSize: string;\r\n tokens: ResolvedTokens;\r\n}\r\n\r\nexport const ThemeContext = createContext<ThemeContextValue | null>(null);\r\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThemeContext } from \"@/provider/ThemeContext\";\n\nexport function useTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\n \"useTheme() was called outside <UIProvider>. Wrap your app in <UIProvider> from 'kreativ-ui'.\",\n );\n }\n return ctx;\n}\n","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"]}
1
+ {"version":3,"sources":["../src/define/token.ts","../src/define/semanticToken.ts","../src/define/size.ts","../src/define/typography.ts","../src/define/recipe.ts","../src/runtime/validateCycles.ts","../src/define/theme.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { TokenValue } from \"@/types\";\n\nexport function defineToken<T extends TokenValue>(value: T) {\n return {\n value,\n };\n}\n\nexport function defineTokens<T extends Record<string, TokenValue>>(tokens: T) {\n return Object.fromEntries(\n Object.entries(tokens).map(([key, value]) => [key, defineToken(value)]),\n ) as {\n [K in keyof T]: ReturnType<typeof defineToken<T[K]>>;\n };\n}\n","import type { SemanticToken, TokenValue } from \"@/types\";\n\n/**\n * Defines a semantic token that shares a single value across both\n * light and dark modes (the explicit sameForBothModes shorthand).\n */\nexport function defineSemanticToken<T extends TokenValue>(\n value: T,\n): SemanticToken<T>;\n/**\n * Defines a semantic token with distinct light and dark values.\n */\nexport function defineSemanticToken<T extends TokenValue>(\n light: T,\n dark: T,\n): SemanticToken<T>;\nexport function defineSemanticToken<T extends TokenValue>(\n lightOrValue: T,\n dark?: T,\n): SemanticToken<T> {\n if (dark === undefined) {\n return {\n value: {\n sameForBothModes: true,\n value: lightOrValue,\n },\n };\n }\n\n return {\n value: {\n sameForBothModes: false,\n light: lightOrValue,\n dark,\n },\n };\n}\n\ntype SemanticTokenInput<T extends TokenValue> = T | { light: T; dark: T };\n\nexport function defineSemanticTokens<\n T extends Record<string, SemanticTokenInput<TokenValue>>,\n>(\n tokens: T,\n): {\n [K in keyof T]: SemanticToken<T[K] extends { light: infer V; dark: infer _ }\n ? V extends TokenValue\n ? V\n : never\n : T[K] extends TokenValue\n ? T[K]\n : never>;\n} {\n return Object.fromEntries(\n Object.entries(tokens).map(([key, entry]) => [\n key,\n entry !== null &&\n typeof entry === \"object\" &&\n \"light\" in entry &&\n \"dark\" in entry\n ? defineSemanticToken(entry.light, entry.dark)\n : defineSemanticToken(entry as TokenValue),\n ]),\n ) as ReturnType<typeof defineSemanticTokens<T>>;\n}\n","import type { SizeScale, SizeToken } from \"@/types\";\n\nexport function defineSize<const T extends SizeToken>(size: T): T {\n return size;\n}\n\nexport function defineSizes<const T extends SizeScale>(sizes: T): T {\n return sizes;\n}\n","import type { Typography } from \"@/types\";\n\nexport function defineTypography<const T extends Typography>(typography: T): T {\n return typography;\n}\n","import type { RecipeDefinition } from \"@/types\";\n\nexport function defineRecipe<const T extends RecipeDefinition>(recipe: T): T {\n return recipe;\n}\n","import type { SemanticTokens } from \"@/types\";\n\nconst REFERENCE_PATTERN = /^\\{(.+)\\}$/;\n\n/**\n * If value is a \"{colors.brand.500}\"-style reference string, returns\n * the raw dotted path (\"colors.brand.500\"). Otherwise returns null.\n */\nfunction extractReferencePath(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const match = value.match(REFERENCE_PATTERN);\n return match ? match[1] : undefined;\n}\n\n/**\n * Resolves a dotted path against an object tree. Returns undefined\n * if any segment doesn't exist.\n */\nfunction resolvePath(tree: unknown, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = tree;\n\n for (const segment of segments) {\n if (current === null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\n/**\n * Given a resolved semantic-token node (shape: { value: ColorModeValue }),\n * returns the reference string(s) its value points to, if any — i.e.\n * the next hop(s) in a semantic->semantic chain. Non-reference\n * (literal) values return an empty array — the chain ends there.\n */\nfunction nextReferences(node: unknown): string[] {\n if (node === null || typeof node !== \"object\" || !(\"value\" in node)) {\n return [];\n }\n\n const colorModeValue = (node as { value: unknown }).value;\n\n if (colorModeValue === null || typeof colorModeValue !== \"object\") {\n return [];\n }\n\n const cmv = colorModeValue as Record<string, unknown>;\n\n if (cmv.sameForBothModes === true) {\n const ref = extractReferencePath(cmv.value);\n return ref ? [ref] : [];\n }\n\n const refs: string[] = [];\n const lightRef = extractReferencePath(cmv.light);\n const darkRef = extractReferencePath(cmv.dark);\n if (lightRef) refs.push(lightRef);\n if (darkRef) refs.push(darkRef);\n return refs;\n}\n\nexport interface CycleValidationResult {\n valid: boolean;\n cyclePath?: string[];\n}\n\n/**\n * Walks every semantic token's reference chain looking for a\n * semantic->semantic cycle. Reference *existence* (does the path\n * resolve at all) is validated separately at the type level via\n * ValidateSemanticTokenSection — this function only detects cycles\n * among references that do resolve to another semantic token.\n *\n * A reference that resolves to nothing (dangling) or to a primitive\n * token is a dead end for cycle-walking purposes here, not an error\n * this function raises — that's the type-level existence check's job.\n */\nexport function validateNoCycles(\n semanticTokens: SemanticTokens,\n): CycleValidationResult {\n function walk(path: string, visited: string[]): CycleValidationResult {\n if (visited.includes(path)) {\n return { valid: false, cyclePath: [...visited, path] };\n }\n\n const node = resolvePath(semanticTokens, path);\n const refs = nextReferences(node);\n\n for (const ref of refs) {\n const result = walk(ref, [...visited, path]);\n if (!result.valid) return result;\n }\n\n return { valid: true };\n }\n\n function collectPaths(tree: unknown, prefix: string[] = []): string[][] {\n if (tree === null || typeof tree !== \"object\") return [];\n\n const entries = Object.entries(tree as Record<string, unknown>);\n const paths: string[][] = [];\n\n for (const [key, value] of entries) {\n const currentPath = [...prefix, key];\n\n if (\n value !== null &&\n typeof value === \"object\" &&\n \"value\" in (value as Record<string, unknown>)\n ) {\n paths.push(currentPath);\n } else {\n paths.push(...collectPaths(value, currentPath));\n }\n }\n\n return paths;\n }\n\n const allLeafPaths = collectPaths(semanticTokens);\n\n for (const pathSegments of allLeafPaths) {\n const path = pathSegments.join(\".\");\n const result = walk(path, []);\n if (!result.valid) return result;\n }\n\n return { valid: true };\n}\n\n/**\n * Throws a descriptive error if a semantic->semantic cycle is found.\n * Intended to be called from defineTheme/extendTheme.\n */\nexport function assertNoCycles(semanticTokens: SemanticTokens): void {\n const result = validateNoCycles(semanticTokens);\n\n if (!result.valid) {\n throw new Error(\n `Kreativ UI: circular semantic token reference detected: ${result.cyclePath?.join(\" -> \")}`,\n );\n }\n}\n","import type { Theme } from \"@/types\";\nimport type { ValidateTheme } from \"../validate/theme\";\nimport { assertNoCycles } from \"../runtime/validateCycles\";\n\n/**\n * Defines a Kreativ UI theme.\n *\n * Type-safe boundary for creating themes while preserving the exact\n * structure and types of the supplied theme. Does not merge with the\n * default theme or mutate the provided object — extension/resolution\n * are handled separately by extendTheme.\n *\n * `T & ValidateTheme<T>` is what actually enforces validation at the\n * call site: ValidateTheme<T> resolves to `unknown` (a no-op) when\n * every section passes, or a section-named `{ tokens: Invalid<...> }`\n * / `{ semanticTokens: Invalid<...> }` / etc. object when a section\n * fails. Intersecting that onto the parameter type means a failing\n * theme produces a real compile error naming the failing section and\n * message, not just a generic \"not assignable to Theme\".\n *\n * Reference *existence* (does \"{colors.brand.500}\" resolve to a real\n * token) is checked at compile time via ValidateSemanticTokenSection,\n * as part of ValidateTheme above. Reference *cycles* (semantic token\n * A -> B -> A) can't be reliably caught at the type level (hit TS\n * inference edge cases in recursive conditional types), so they're\n * checked here at call time instead, via assertNoCycles.\n */\nexport function defineTheme<T extends Theme>(theme: T & ValidateTheme<T>): T {\n assertNoCycles(theme.semanticTokens);\n return theme;\n}\n\n"]}