{"version":3,"file":"collectSlots.cjs","names":["Slots","SLOTS_COMPONENT","Template","TEMPLATE_COMPONENT"],"sources":["../../../src/Slots/utils/collectSlots.ts"],"sourcesContent":["import { Children, isValidElement, type ReactElement, type ReactNode } from 'react';\nimport { Slots } from '../Slots';\nimport { Template } from '../Template';\nimport { SLOTS_COMPONENT, TEMPLATE_COMPONENT } from '../constants';\nimport type { SlotContent, SlotFunction, TemplateProps } from '../types';\n\n/**\n * Walks a React subtree and fills the provided slot maps.\n *\n * This stops at nested `Slots`, intrinsic DOM elements, `forwardRef`, and\n * `memo` boundaries so parent collectors do not steal slot content from nested\n * components.\n */\nfunction traverse(\n  node: ReactNode,\n  slots: Record<string, SlotContent>,\n  defaultNodes: Array<ReactNode | SlotFunction>,\n): void {\n  if (node == null) return;\n  if (Array.isArray(node)) {\n    node.forEach(node => traverse(node, slots, defaultNodes));\n    return;\n  }\n  if (!isValidElement(node)) {\n    defaultNodes.push(node);\n    return;\n  }\n\n  const el = node as ReactElement<TemplateProps>;\n\n  if (\n    el.type === Slots ||\n    (el.type as Record<PropertyKey, any>)[SLOTS_COMPONENT] ||\n    typeof el.type === 'string' ||\n    (node as any).type?.$$typeof === Symbol.for('react.forward_ref') ||\n    (node as any).type?.$$typeof === Symbol.for('react.memo')\n  ) {\n    defaultNodes.push(el);\n    return;\n  }\n\n  if (el.type === Template || (el.type as Record<PropertyKey, any>)[TEMPLATE_COMPONENT]) {\n    const slotName = el.props.name ?? 'default';\n    const component = el.props.children;\n\n    if (slotName === 'default') {\n      defaultNodes.push(component);\n      return;\n    }\n    if (slots[slotName]) return;\n\n    slots[slotName] = component;\n    return;\n  }\n\n  if (el.props?.children) {\n    Children.forEach(el.props.children as ReactNode, child => traverse(child, slots, defaultNodes));\n  }\n\n  if (!el.props?.children) defaultNodes.push(el);\n}\n\n/**\n * Collects default content and named `Template` content from a React subtree.\n *\n * @param children - Children passed to a slot-aware component.\n * @returns A map keyed by slot name. The default slot is stored under `default`.\n *\n * @example\n * ```tsx\n * const slots = collectSlots(children);\n * const title = slots.title;\n * const body = slots.default;\n * ```\n */\nexport function collectSlots(children: ReactNode): Record<string, SlotContent> {\n  const slots: Record<string, SlotContent> = {};\n  const defaultNodes: Array<ReactNode | SlotFunction> = [];\n\n  Children.forEach(children, child => traverse(child, slots, defaultNodes));\n\n  if (defaultNodes.length) {\n    slots['default'] = defaultNodes.length === 1 ? defaultNodes[0] : defaultNodes;\n  }\n\n  return slots;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAS,SACP,MACA,OACA,cACM;CACN,IAAI,QAAQ,MAAM;CAClB,IAAI,MAAM,QAAQ,IAAI,GAAG;EACvB,KAAK,SAAQ,SAAQ,SAAS,MAAM,OAAO,YAAY,CAAC;EACxD;CACF;CACA,IAAI,EAAA,GAAA,MAAA,eAAA,CAAgB,IAAI,GAAG;EACzB,aAAa,KAAK,IAAI;EACtB;CACF;CAEA,MAAM,KAAK;CAEX,IACE,GAAG,SAASA,cAAAA,SACX,GAAG,KAAkCC,wBAAAA,oBACtC,OAAO,GAAG,SAAS,YAClB,KAAa,MAAM,aAAa,OAAO,IAAI,mBAAmB,KAC9D,KAAa,MAAM,aAAa,OAAO,IAAI,YAAY,GACxD;EACA,aAAa,KAAK,EAAE;EACpB;CACF;CAEA,IAAI,GAAG,SAASC,iBAAAA,YAAa,GAAG,KAAkCC,wBAAAA,qBAAqB;EACrF,MAAM,WAAW,GAAG,MAAM,QAAQ;EAClC,MAAM,YAAY,GAAG,MAAM;EAE3B,IAAI,aAAa,WAAW;GAC1B,aAAa,KAAK,SAAS;GAC3B;EACF;EACA,IAAI,MAAM,WAAW;EAErB,MAAM,YAAY;EAClB;CACF;CAEA,IAAI,GAAG,OAAO,UACZ,MAAA,SAAS,QAAQ,GAAG,MAAM,WAAuB,UAAS,SAAS,OAAO,OAAO,YAAY,CAAC;CAGhG,IAAI,CAAC,GAAG,OAAO,UAAU,aAAa,KAAK,EAAE;AAC/C;;;;;;;;;;;;;;AAeA,SAAgB,aAAa,UAAkD;CAC7E,MAAM,QAAqC,CAAC;CAC5C,MAAM,eAAgD,CAAC;CAEvD,MAAA,SAAS,QAAQ,WAAU,UAAS,SAAS,OAAO,OAAO,YAAY,CAAC;CAExE,IAAI,aAAa,QACf,MAAM,aAAa,aAAa,WAAW,IAAI,aAAa,KAAK;CAGnE,OAAO;AACT"}