{"version":3,"sources":["../packages/infrastructure/storybook-addon/src/index.ts"],"sourcesContent":["/**\n * tailwind-styled-v4 — Storybook Addon\n *\n * Integrasi Storybook untuk komponen tw().\n * Fitur:\n *   - withTailwindStyled decorator: inject className ke story\n *   - generateArgTypes: auto-generate controls dari ComponentConfig\n *   - enumerateVariantProps: buat semua kombinasi variant untuk testing\n */\n\nimport type { VariantMatrix } from \"@tailwind-styled/shared\"\nexport type { VariantMatrix } from \"@tailwind-styled/shared\"\n\nexport interface ComponentConfig {\n  base?: string\n  variants?: Record<string, Record<string, string>>\n  defaultVariants?: Record<string, string>\n  compoundVariants?: Array<{ class: string; [key: string]: string }>\n}\n\n// ─── Variant enumeration (core utility) ──────────────────────────────────────\n\n/**\n * Enumerate semua kombinasi variant dari matrix.\n *\n * @example\n * enumerateVariantProps({ size: ['sm','lg'], intent: ['primary','danger'] })\n * // → [{ size:'sm', intent:'primary' }, { size:'sm', intent:'danger' }, ...]\n */\nexport function enumerateVariantProps(\n  matrix: VariantMatrix\n): Array<Record<string, string | number | boolean>> {\n  const keys = Object.keys(matrix)\n  if (keys.length === 0) return [{}]\n\n  const result: Array<Record<string, string | number | boolean>> = []\n\n  function walk(index: number, current: Record<string, string | number | boolean>) {\n    if (index >= keys.length) {\n      result.push({ ...current })\n      return\n    }\n    const key = keys[index]!\n    for (const value of matrix[key] ?? []) {\n      current[key] = value\n      walk(index + 1, current)\n    }\n  }\n\n  walk(0, {})\n  return result\n}\n\n// ─── Storybook argTypes generator ─────────────────────────────────────────────\n\n/**\n * Generate Storybook argTypes dari ComponentConfig.\n * Otomatis membuat kontrol dropdown untuk setiap variant.\n */\nexport function generateArgTypes(config: ComponentConfig): Record<string, unknown> {\n  if (!config.variants) return {}\n\n  const argTypes: Record<string, unknown> = {}\n\n  for (const [variantKey, variantValues] of Object.entries(config.variants)) {\n    const options = Object.keys(variantValues)\n    const defaultValue = config.defaultVariants?.[variantKey]\n\n    argTypes[variantKey] = {\n      control: { type: \"select\" },\n      options,\n      defaultValue,\n      description: `Variant: **${variantKey}**`,\n      table: {\n        type: { summary: options.join(\" | \") },\n        defaultValue: defaultValue ? { summary: defaultValue } : undefined,\n        category: \"Variants\",\n      },\n    }\n  }\n\n  return argTypes\n}\n\nexport function generateDefaultArgs(config: ComponentConfig): Record<string, string> {\n  return { ...(config.defaultVariants ?? undefined) }\n}\n\n// ─── Storybook decorator ───────────────────────────────────────────────────────\n\nexport function withTailwindStyled(\n  StoryFn: () => unknown,\n  context: {\n    args?: Record<string, unknown>\n    parameters?: { tailwindStyled?: { wrapperClass?: string; padding?: string } }\n  }\n): unknown {\n  const wrapperClass = context.parameters?.tailwindStyled?.wrapperClass ?? \"\"\n  const padding = context.parameters?.tailwindStyled?.padding ?? \"p-8\"\n\n  if (typeof document !== \"undefined\") {\n    const wrapper = document.createElement(\"div\")\n    wrapper.className = [padding, wrapperClass].filter(Boolean).join(\" \")\n    return wrapper\n  }\n\n  return StoryFn()\n}\n\n// ─── Story template helpers ────────────────────────────────────────────────────\n\nexport function createVariantStoryArgs(config: ComponentConfig): {\n  combinations: Array<Record<string, string | number | boolean>>\n  matrix: VariantMatrix\n} {\n  if (!config.variants) return { combinations: [{}], matrix: {} }\n\n  const matrix: VariantMatrix = {}\n  for (const [key, values] of Object.entries(config.variants)) {\n    matrix[key] = Object.keys(values)\n  }\n\n  return {\n    combinations: enumerateVariantProps(matrix),\n    matrix,\n  }\n}\n\nexport function getVariantClass(config: ComponentConfig, props: Record<string, string>): string {\n  const classes: string[] = []\n\n  if (config.base) classes.push(config.base)\n\n  if (config.variants) {\n    for (const [key, values] of Object.entries(config.variants)) {\n      const val = props[key] ?? config.defaultVariants?.[key]\n      if (val && values[val]) classes.push(values[val])\n    }\n  }\n\n  if (config.compoundVariants) {\n    for (const compound of config.compoundVariants) {\n      const { class: cls, ...conditions } = compound\n      if (Object.entries(conditions).every(([k, v]) => props[k] === v)) {\n        classes.push(cls)\n      }\n    }\n  }\n\n  return classes.join(\" \")\n}\n\n"],"mappings":";AA6BO,SAAS,sBACd,QACkD;AAClD,QAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC,CAAC,CAAC;AAEjC,QAAM,SAA2D,CAAC;AAElE,WAAS,KAAK,OAAe,SAAoD;AAC/E,QAAI,SAAS,KAAK,QAAQ;AACxB,aAAO,KAAK,EAAE,GAAG,QAAQ,CAAC;AAC1B;AAAA,IACF;AACA,UAAM,MAAM,KAAK,KAAK;AACtB,eAAW,SAAS,OAAO,GAAG,KAAK,CAAC,GAAG;AACrC,cAAQ,GAAG,IAAI;AACf,WAAK,QAAQ,GAAG,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,OAAK,GAAG,CAAC,CAAC;AACV,SAAO;AACT;AAQO,SAAS,iBAAiB,QAAkD;AACjF,MAAI,CAAC,OAAO,SAAU,QAAO,CAAC;AAE9B,QAAM,WAAoC,CAAC;AAE3C,aAAW,CAAC,YAAY,aAAa,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACzE,UAAM,UAAU,OAAO,KAAK,aAAa;AACzC,UAAM,eAAe,OAAO,kBAAkB,UAAU;AAExD,aAAS,UAAU,IAAI;AAAA,MACrB,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,aAAa,cAAc,UAAU;AAAA,MACrC,OAAO;AAAA,QACL,MAAM,EAAE,SAAS,QAAQ,KAAK,KAAK,EAAE;AAAA,QACrC,cAAc,eAAe,EAAE,SAAS,aAAa,IAAI;AAAA,QACzD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAiD;AACnF,SAAO,EAAE,GAAI,OAAO,mBAAmB,OAAW;AACpD;AAIO,SAAS,mBACd,SACA,SAIS;AACT,QAAM,eAAe,QAAQ,YAAY,gBAAgB,gBAAgB;AACzE,QAAM,UAAU,QAAQ,YAAY,gBAAgB,WAAW;AAE/D,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY,CAAC,SAAS,YAAY,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpE,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ;AACjB;AAIO,SAAS,uBAAuB,QAGrC;AACA,MAAI,CAAC,OAAO,SAAU,QAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE9D,QAAM,SAAwB,CAAC;AAC/B,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC3D,WAAO,GAAG,IAAI,OAAO,KAAK,MAAM;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,cAAc,sBAAsB,MAAM;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAAyB,OAAuC;AAC9F,QAAM,UAAoB,CAAC;AAE3B,MAAI,OAAO,KAAM,SAAQ,KAAK,OAAO,IAAI;AAEzC,MAAI,OAAO,UAAU;AACnB,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC3D,YAAM,MAAM,MAAM,GAAG,KAAK,OAAO,kBAAkB,GAAG;AACtD,UAAI,OAAO,OAAO,GAAG,EAAG,SAAQ,KAAK,OAAO,GAAG,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB;AAC3B,eAAW,YAAY,OAAO,kBAAkB;AAC9C,YAAM,EAAE,OAAO,KAAK,GAAG,WAAW,IAAI;AACtC,UAAI,OAAO,QAAQ,UAAU,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG;AAChE,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,GAAG;AACzB;","names":[]}