{"version":3,"sources":["../src/css/runtime/hash.ts","../src/css/runtime/serialize.ts","../src/css/runtime/sheet.ts","../src/css/css.ts","../src/css/styled.ts","../src/css/keyframes.ts"],"names":["hash","str","h","i","unitlessProperties","toKebabCase","match","addUnit","property","value","serialize","styles","selector","properties","nested","key","nestedSelector","result","serializeKeyframes","name","keyframes","frames","prop","cache","serverStyles","browserSheet","supportsAdoptedStyleSheets","getBrowserSheet","insert","css","sheet","has","getStyles","getStyleTag","resetStyles","hydrateStyles","styleTag","text","classRegex","className","cssText","cx","classes","styled","tag","config","base","variants","defaultVariants","compoundVariants","baseClass","variantCache","getVariantClass","variantName","variantValue","cacheKey","compoundCache","StyledComponent","props","children","userClassName","rest","variantProps","elementProps","defVal","variantClasses","vc","compound","compoundStyles","conditions","matches","compoundClass","finalClassName","definition"],"mappings":"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","file":"chunk-Z22LUUZS.mjs","sourcesContent":["/**\n * Generate a hash for a style object\n * Uses djb2 algorithm for fast, low-collision hashing\n */\nexport function hash(str: string): string {\n  let h = 5381\n  for (let i = 0; i < str.length; i++) {\n    h = ((h << 5) + h) ^ str.charCodeAt(i)\n  }\n  return 'fx-' + (h >>> 0).toString(36)\n}\n","import type { StyleObject, CSSValue } from '../types'\n\n/**\n * Properties that should not have 'px' auto-added\n */\nconst unitlessProperties = new Set([\n  'animationIterationCount',\n  'borderImageOutset',\n  'borderImageSlice',\n  'borderImageWidth',\n  'boxFlex',\n  'boxFlexGroup',\n  'boxOrdinalGroup',\n  'columnCount',\n  'columns',\n  'flex',\n  'flexGrow',\n  'flexPositive',\n  'flexShrink',\n  'flexNegative',\n  'flexOrder',\n  'gridArea',\n  'gridRow',\n  'gridRowEnd',\n  'gridRowSpan',\n  'gridRowStart',\n  'gridColumn',\n  'gridColumnEnd',\n  'gridColumnSpan',\n  'gridColumnStart',\n  'fontWeight',\n  'lineClamp',\n  'lineHeight',\n  'opacity',\n  'order',\n  'orphans',\n  'tabSize',\n  'widows',\n  'zIndex',\n  'zoom',\n  'fillOpacity',\n  'floodOpacity',\n  'stopOpacity',\n  'strokeDasharray',\n  'strokeDashoffset',\n  'strokeMiterlimit',\n  'strokeOpacity',\n  'strokeWidth',\n])\n\n/**\n * Convert camelCase to kebab-case\n */\nexport function toKebabCase(str: string): string {\n  return str.replace(/[A-Z]/g, (match) => '-' + match.toLowerCase())\n}\n\n/**\n * Add unit to numeric values where appropriate\n */\nexport function addUnit(property: string, value: CSSValue): string {\n  if (typeof value === 'number' && value !== 0 && !unitlessProperties.has(property)) {\n    return value + 'px'\n  }\n  return String(value)\n}\n\n/**\n * Serialize a style object to CSS string\n */\nexport function serialize(styles: StyleObject, selector: string): string {\n  let properties = ''\n  let nested = ''\n\n  for (const key in styles) {\n    const value = styles[key]\n\n    if (value === undefined || value === null) {\n      continue\n    }\n\n    if (key.startsWith('&')) {\n      // Nested selector: &:hover, &::before, & > div\n      const nestedSelector = key.replace(/&/g, selector)\n      nested += serialize(value as StyleObject, nestedSelector)\n    } else if (key.startsWith('@')) {\n      // At-rule: @media, @supports, @container\n      nested += `${key}{${serialize(value as StyleObject, selector)}}`\n    } else if (typeof value === 'object') {\n      // Skip invalid nested objects without & or @\n      continue\n    } else {\n      // Regular CSS property\n      properties += `${toKebabCase(key)}:${addUnit(key, value)};`\n    }\n  }\n\n  let result = ''\n  if (properties) {\n    result = `${selector}{${properties}}`\n  }\n  result += nested\n\n  return result\n}\n\n/**\n * Serialize keyframes to CSS string\n */\nexport function serializeKeyframes(\n  name: string,\n  keyframes: Record<string, Record<string, CSSValue>>\n): string {\n  let frames = ''\n\n  for (const key in keyframes) {\n    const styles = keyframes[key]\n    let properties = ''\n\n    for (const prop in styles) {\n      const value = styles[prop]\n      if (value !== undefined && value !== null && typeof value !== 'object') {\n        properties += `${toKebabCase(prop)}:${addUnit(prop, value)};`\n      }\n    }\n\n    frames += `${key}{${properties}}`\n  }\n\n  return `@keyframes ${name}{${frames}}`\n}\n","/**\n * StyleSheet manager\n * Uses adoptedStyleSheets for efficient style injection\n * Falls back to server-side collection when not available (SSR, jsdom)\n */\n\n// Cache to track which styles have been inserted\nlet cache = new Map<string, boolean>()\n\n// Server-side collected styles\nlet serverStyles: string[] = []\n\n// Browser stylesheet (lazy initialized)\nlet browserSheet: CSSStyleSheet | null = null\n\n/**\n * Check if adoptedStyleSheets is supported\n */\nfunction supportsAdoptedStyleSheets(): boolean {\n  return (\n    typeof document !== 'undefined' &&\n    'adoptedStyleSheets' in document &&\n    typeof CSSStyleSheet !== 'undefined' &&\n    'replaceSync' in CSSStyleSheet.prototype\n  )\n}\n\nfunction getBrowserSheet(): CSSStyleSheet | null {\n  if (!supportsAdoptedStyleSheets()) {\n    return null\n  }\n\n  if (!browserSheet) {\n    browserSheet = new CSSStyleSheet()\n    document.adoptedStyleSheets = [...document.adoptedStyleSheets, browserSheet]\n  }\n  return browserSheet\n}\n\n/**\n * Insert a CSS rule\n */\nexport function insert(hash: string, css: string): void {\n  if (cache.has(hash)) {\n    return\n  }\n\n  cache.set(hash, true)\n\n  const sheet = getBrowserSheet()\n  if (sheet) {\n    try {\n      sheet.insertRule(css, sheet.cssRules.length)\n    } catch {\n      // Handle invalid CSS gracefully\n    }\n  } else {\n    // Server-side or unsupported environment: collect styles\n    serverStyles.push(css)\n  }\n}\n\n/**\n * Check if a hash is already in the cache\n */\nexport function has(hash: string): boolean {\n  return cache.has(hash)\n}\n\n/**\n * Get all collected styles for SSR\n */\nexport function getStyles(): string {\n  return serverStyles.join('')\n}\n\n/**\n * Get styles as a style tag for SSR\n */\nexport function getStyleTag(): string {\n  const styles = getStyles()\n  if (!styles) return ''\n  return `<style data-flexium-css>${styles}</style>`\n}\n\n/**\n * Reset collected styles and cache (for SSR between requests or testing)\n */\nexport function resetStyles(): void {\n  serverStyles = []\n  cache = new Map()\n  browserSheet = null\n}\n\n/**\n * Hydrate styles on the client\n * Call this after SSR to sync the cache with server-rendered styles\n */\nexport function hydrateStyles(): void {\n  if (typeof document === 'undefined') return\n\n  const styleTag = document.querySelector('style[data-flexium-css]')\n  if (styleTag) {\n    // Parse and cache existing styles\n    const text = styleTag.textContent || ''\n    const classRegex = /\\.fx-[a-z0-9]+/g\n    let match\n    while ((match = classRegex.exec(text)) !== null) {\n      const hash = match[0].slice(1) // Remove the dot\n      cache.set(hash, true)\n    }\n  }\n}\n\n// Auto-hydrate on client (only if adoptedStyleSheets is supported)\nif (supportsAdoptedStyleSheets()) {\n  hydrateStyles()\n}\n","import type { StyleObject } from './types'\nimport { hash } from './runtime/hash'\nimport { serialize } from './runtime/serialize'\nimport { insert, has } from './runtime/sheet'\n\n/**\n * Create a CSS class from a style object\n *\n * @example\n * ```tsx\n * const buttonClass = css({\n *   padding: '8px 16px',\n *   backgroundColor: 'blue',\n *   color: 'white',\n *   '&:hover': {\n *     backgroundColor: 'darkblue'\n *   }\n * })\n *\n * <button className={buttonClass}>Click me</button>\n * ```\n */\nexport function css(styles: StyleObject): string {\n  // Generate unique hash from style object\n  const key = JSON.stringify(styles)\n  const className = hash(key)\n\n  // Skip if already inserted\n  if (has(className)) {\n    return className\n  }\n\n  // Serialize and insert CSS\n  const cssText = serialize(styles, '.' + className)\n  insert(className, cssText)\n\n  return className\n}\n\n/**\n * Combine multiple class names, filtering out falsy values\n *\n * @example\n * ```tsx\n * const className = cx(\n *   baseClass,\n *   isActive && activeClass,\n *   variant === 'primary' && primaryClass\n * )\n * ```\n */\nexport function cx(\n  ...classes: (string | boolean | null | undefined)[]\n): string {\n  return classes.filter(Boolean).join(' ')\n}\n","import type { VariantConfig, StyledConfig } from './types'\nimport type { FNode } from '../dom/types'\nimport { css, cx } from './css'\n\n// HTML element tag names\ntype HTMLTag = 'a' | 'abbr' | 'address' | 'area' | 'article' | 'aside' | 'audio' |\n  'b' | 'base' | 'bdi' | 'bdo' | 'blockquote' | 'body' | 'br' | 'button' |\n  'canvas' | 'caption' | 'cite' | 'code' | 'col' | 'colgroup' |\n  'data' | 'datalist' | 'dd' | 'del' | 'details' | 'dfn' | 'dialog' | 'div' | 'dl' | 'dt' |\n  'em' | 'embed' |\n  'fieldset' | 'figcaption' | 'figure' | 'footer' | 'form' |\n  'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'head' | 'header' | 'hgroup' | 'hr' | 'html' |\n  'i' | 'iframe' | 'img' | 'input' | 'ins' |\n  'kbd' |\n  'label' | 'legend' | 'li' | 'link' |\n  'main' | 'map' | 'mark' | 'menu' | 'meta' | 'meter' |\n  'nav' | 'noscript' |\n  'object' | 'ol' | 'optgroup' | 'option' | 'output' |\n  'p' | 'picture' | 'pre' | 'progress' |\n  'q' |\n  'rp' | 'rt' | 'ruby' |\n  's' | 'samp' | 'script' | 'search' | 'section' | 'select' | 'slot' | 'small' | 'source' | 'span' | 'strong' | 'style' | 'sub' | 'summary' | 'sup' | 'svg' |\n  'table' | 'tbody' | 'td' | 'template' | 'textarea' | 'tfoot' | 'th' | 'thead' | 'time' | 'title' | 'tr' | 'track' |\n  'u' | 'ul' |\n  'var' | 'video' |\n  'wbr'\n\n/**\n * Create a styled component with variant support\n *\n * @example\n * ```tsx\n * const Button = styled('button', {\n *   base: {\n *     padding: '8px 16px',\n *     border: 'none',\n *     borderRadius: 4,\n *     cursor: 'pointer'\n *   },\n *   variants: {\n *     variant: {\n *       primary: { backgroundColor: 'blue', color: 'white' },\n *       secondary: { backgroundColor: 'gray', color: 'black' }\n *     },\n *     size: {\n *       sm: { padding: '4px 8px', fontSize: 12 },\n *       md: { padding: '8px 16px', fontSize: 14 },\n *       lg: { padding: '12px 24px', fontSize: 16 }\n *     }\n *   },\n *   defaultVariants: {\n *     variant: 'primary',\n *     size: 'md'\n *   }\n * })\n *\n * // Usage\n * <Button variant=\"secondary\" size=\"lg\">Click me</Button>\n * ```\n */\nexport function styled<\n  T extends HTMLTag,\n  V extends VariantConfig = Record<string, never>\n>(\n  tag: T,\n  config: StyledConfig<V>\n): StyledComponent<T, V> {\n  const { base, variants, defaultVariants, compoundVariants } = config\n\n  // Pre-compute base class\n  const baseClass = css(base)\n\n  // Cache for variant classes\n  const variantCache = new Map<string, string>()\n\n  // Get or create variant class\n  function getVariantClass(variantName: string, variantValue: string): string {\n    const cacheKey = `${variantName}:${variantValue}`\n    let className = variantCache.get(cacheKey)\n\n    if (!className && variants?.[variantName]?.[variantValue]) {\n      className = css(variants[variantName][variantValue])\n      variantCache.set(cacheKey, className)\n    }\n\n    return className || ''\n  }\n\n  // Compound variant cache\n  const compoundCache = new Map<string, string>()\n\n  function StyledComponent(props: StyledComponentProps<V>): FNode {\n    const { children, className: userClassName, ...rest } = props as Record<string, unknown>\n\n    // Separate variant props from element props\n    const variantProps: Record<string, string> = {}\n    const elementProps: Record<string, unknown> = {}\n\n    for (const key in rest) {\n      if (variants && key in variants) {\n        const defVal = (defaultVariants as Record<string, unknown> | undefined)?.[key]\n        variantProps[key] = String(rest[key] ?? defVal ?? '')\n      } else {\n        elementProps[key] = rest[key]\n      }\n    }\n\n    // Apply default variants for missing props\n    if (defaultVariants) {\n      for (const key in defaultVariants) {\n        if (!(key in variantProps)) {\n          variantProps[key] = String(defaultVariants[key as keyof typeof defaultVariants])\n        }\n      }\n    }\n\n    // Collect variant classes\n    const variantClasses: string[] = []\n    for (const [name, value] of Object.entries(variantProps)) {\n      if (value) {\n        const vc = getVariantClass(name, String(value))\n        if (vc) variantClasses.push(vc)\n      }\n    }\n\n    // Check compound variants\n    if (compoundVariants) {\n      for (const compound of compoundVariants) {\n        const { css: compoundStyles, ...conditions } = compound\n\n        // Check if all conditions match\n        let matches = true\n        for (const [key, value] of Object.entries(conditions)) {\n          if (variantProps[key] !== value) {\n            matches = false\n            break\n          }\n        }\n\n        if (matches) {\n          // Generate cache key from conditions\n          const cacheKey = JSON.stringify(conditions)\n          let compoundClass = compoundCache.get(cacheKey)\n\n          if (!compoundClass) {\n            compoundClass = css(compoundStyles)\n            compoundCache.set(cacheKey, compoundClass)\n          }\n\n          variantClasses.push(compoundClass)\n        }\n      }\n    }\n\n    // Combine all classes\n    const finalClassName = cx(baseClass, ...variantClasses, typeof userClassName === 'string' ? userClassName : undefined)\n\n    // Return FNode element\n    return {\n      type: tag,\n      props: { ...elementProps, className: finalClassName },\n      children: Array.isArray(children) ? children : children != null ? [children] : [],\n      key: undefined\n    }\n  }\n\n  // Mark as styled component\n  StyledComponent.displayName = `Styled(${tag})`\n\n  return StyledComponent as unknown as StyledComponent<T, V>\n}\n\n// Types\n// _T is retained to preserve tag-type info at the call site (StyledComponent<T, V>)\ntype StyledComponent<\n  _T extends HTMLTag,\n  V extends VariantConfig\n> = {\n  (props: StyledComponentProps<V>): FNode\n  displayName: string\n}\n\ntype StyledComponentProps<V extends VariantConfig> = {\n  [K in keyof V]?: keyof V[K]\n} & {\n  children?: unknown\n  className?: string\n  [key: string]: unknown\n}\n","import type { KeyframeDefinition, CSSValue } from './types'\nimport { hash } from './runtime/hash'\nimport { serializeKeyframes } from './runtime/serialize'\nimport { insert, has } from './runtime/sheet'\n\n/**\n * Create a keyframes animation\n *\n * @example\n * ```tsx\n * const fadeIn = keyframes({\n *   from: { opacity: 0 },\n *   to: { opacity: 1 }\n * })\n *\n * const slideIn = keyframes({\n *   '0%': { transform: 'translateX(-100%)' },\n *   '100%': { transform: 'translateX(0)' }\n * })\n *\n * const className = css({\n *   animation: `${fadeIn} 0.3s ease-in-out`\n * })\n * ```\n */\nexport function keyframes(definition: KeyframeDefinition): string {\n  // Generate unique name from keyframe definition\n  const key = JSON.stringify(definition)\n  const name = hash(key)\n\n  // Skip if already inserted\n  if (has(name)) {\n    return name\n  }\n\n  // Serialize and insert keyframes\n  const cssText = serializeKeyframes(name, definition as Record<string, Record<string, CSSValue>>)\n  insert(name, cssText)\n\n  return name\n}\n"]}