{"version":3,"names":["dynamic","createEffect","createRenderEffect","createSignal","omit","onCleanup","Show","untrack","mergeRootProps","resolveClassStyle","useAnimationsFinished","useImageLoadingStatus","useTransitionStatus","useAvatarRootContext","AvatarImage","props","context","asString","v","undefined","status","src","referrerPolicy","referrerpolicy","crossOrigin","crossorigin","isVisible","mounted","transitionStatus","setMounted","next","setImageLoadingStatus","onLoadingStatusChange","imageElement","setImageElement","ownedWrite","runOnceAnimationsFinish","visible","imageRef","el","userStyling","imageLoadingStatus","userHtmlProps","internalProps","ref","data-starting-style","data-ending-style","styledUserProps","merged","Tag","as"],"sources":["avatar-image.tsx"],"sourcesContent":["import type { JSX, ValidComponent } from \"@solidjs/web\";\nimport { dynamic } from \"@solidjs/web\";\nimport {\n\tcreateEffect,\n\tcreateRenderEffect,\n\tcreateSignal,\n\tomit,\n\tonCleanup,\n\tShow,\n\tuntrack,\n} from \"solid-js\";\nimport { mergeRootProps } from \"../../internals/merge-root-props\";\nimport { resolveClassStyle } from \"../../internals/resolve-class-style\";\nimport type { BaseUIComponentProps } from \"../../internals/types\";\nimport { useAnimationsFinished } from \"../../internals/use-animations-finished\";\nimport { useImageLoadingStatus } from \"../../internals/use-image-loading-status\";\nimport {\n\ttype TransitionStatus,\n\tuseTransitionStatus,\n} from \"../../internals/use-transition-status/use-transition-status\";\nimport {\n\ttype ImageLoadingStatus,\n\tuseAvatarRootContext,\n} from \"../avatar-root-context\";\nimport type { AvatarRootState } from \"../root/avatar-root\";\n\nexport interface AvatarImageState extends AvatarRootState {\n\t/**\n\t * The transition status of the component. Mirrors Base UI React's\n\t * `AvatarImageState.transitionStatus` — drives `data-starting-style` /\n\t * `data-ending-style` during animated mount / unmount.\n\t */\n\ttransitionStatus: TransitionStatus;\n}\n\nexport interface AvatarImageProps\n\textends BaseUIComponentProps<\"img\", AvatarImageState> {\n\t/** Tag/component to render. Defaults to `\"img\"`. */\n\tas?: ValidComponent;\n\t/** Callback fired when the loading status changes. */\n\tonLoadingStatusChange?: ((status: ImageLoadingStatus) => void) | undefined;\n}\n\n/**\n * The image to be displayed in the avatar. Renders an `<img>` element.\n *\n * Mount/unmount is driven by {@link useTransitionStatus}: the element mounts\n * as soon as the standalone probe reports `loaded`, and stays mounted (with\n * `data-ending-style`) on unload until any CSS transitions / animations\n * settle — matching Base UI React's\n * `useTransitionStatus` + `useOpenChangeComplete` composition.\n */\nexport function AvatarImage(props: AvatarImageProps): JSX.Element {\n\tconst context = useAvatarRootContext();\n\n\t// Solid 2's JSX typings widen HTML attributes to `string | RemoveAttribute`\n\t// (RFC 07 — boolean false removes the attribute). The probe only\n\t// understands plain strings; coerce out the boolean branch here.\n\tconst asString = (v: unknown): string | undefined =>\n\t\ttypeof v === \"string\" ? v : undefined;\n\tconst status = useImageLoadingStatus({\n\t\tsrc: () => asString(props.src),\n\t\treferrerPolicy: () => asString(props.referrerpolicy),\n\t\tcrossOrigin: () => asString(props.crossorigin),\n\t});\n\n\tconst isVisible = (): boolean => status() === \"loaded\";\n\n\tconst { mounted, transitionStatus, setMounted } =\n\t\tuseTransitionStatus(isVisible);\n\n\t// Mirror the internal status into the root context (so `<Avatar.Fallback>`\n\t// can react) and notify the consumer callback. Two separate split effects\n\t// keep the dependencies explicit.\n\tcreateEffect(\n\t\t() => status(),\n\t\t(next) => {\n\t\t\tif (next !== \"idle\") {\n\t\t\t\tcontext.setImageLoadingStatus(next);\n\t\t\t}\n\t\t},\n\t);\n\n\tcreateEffect(\n\t\t() => status(),\n\t\t(next) => {\n\t\t\tif (next !== \"idle\") {\n\t\t\t\t// Resolve the latest callback at fire time, untracked — the\n\t\t\t\t// apply scope is strict-read and the callback identity isn't\n\t\t\t\t// a dependency of this effect.\n\t\t\t\tuntrack(() => props.onLoadingStatusChange)?.(next);\n\t\t\t}\n\t\t},\n\t);\n\n\t// Ensure we reset the root context status on unmount so a later remount\n\t// starts fresh rather than reading a stale `loaded`/`error` signal.\n\tonCleanup(() => {\n\t\tcontext.setImageLoadingStatus(\"idle\");\n\t});\n\n\t// Image element signal — captured via the ref forwarded to `renderElement`\n\t// below. `ownedWrite` mirrors the pattern used by `useCollapsiblePanel`:\n\t// the ref callback fires from an unowned scope.\n\tconst [imageElement, setImageElement] = createSignal<HTMLElement | null>(\n\t\tnull,\n\t\t{ ownedWrite: true },\n\t);\n\n\tconst runOnceAnimationsFinish = useAnimationsFinished(imageElement);\n\n\t// Defer the unmount until CSS transitions / animations on the image settle.\n\t// Mirrors React's `useOpenChangeComplete({ open: isVisible, onComplete: () =>\n\t// setMounted(false) })`: when `isVisible` flips false while we're still\n\t// mounted, wait for animations, then drop `mounted` to false so\n\t// `useTransitionStatus` clears `transitionStatus` back to `undefined`.\n\tcreateRenderEffect(\n\t\t() => isVisible(),\n\t\t(visible) => {\n\t\t\tif (!visible && untrack(mounted)) {\n\t\t\t\trunOnceAnimationsFinish(() => {\n\t\t\t\t\tsetMounted(false);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t);\n\n\tconst imageRef = (el: HTMLImageElement | null): void => {\n\t\tsetImageElement(el);\n\t};\n\n\tconst userStyling = resolveClassStyle(props, () => ({\n\t\timageLoadingStatus: context.imageLoadingStatus(),\n\t\ttransitionStatus: transitionStatus(),\n\t}));\n\n\tconst userHtmlProps = omit(\n\t\tprops,\n\t\t\"class\",\n\t\t\"style\",\n\t\t\"attrs\",\n\t\t\"as\",\n\t\t\"onLoadingStatusChange\",\n\t) as Record<string, unknown>;\n\n\tconst internalProps = {\n\t\tref: imageRef,\n\t\tget \"data-starting-style\"(): \"\" | undefined {\n\t\t\treturn transitionStatus() === \"starting\" ? \"\" : undefined;\n\t\t},\n\t\tget \"data-ending-style\"(): \"\" | undefined {\n\t\t\treturn transitionStatus() === \"ending\" ? \"\" : undefined;\n\t\t},\n\t};\n\n\tconst styledUserProps = mergeRootProps(userStyling, userHtmlProps);\n\n\tconst merged = mergeRootProps(internalProps, styledUserProps);\n\n\t// Only mount the real `<img>` once our standalone probe has fired `load`\n\t// (matches Base UI React's `if (!mounted) return null`). Rendering the DOM\n\t// img during `idle`/`loading` would dispatch its own load events and flash\n\t// a broken-image icon before the probe settles. Staying mounted during the\n\t// `ending` phase lets CSS exit animations run before the node leaves the\n\t// tree.\n\tconst Tag = dynamic(() => props.as ?? \"img\");\n\treturn (\n\t\t<Show when={mounted()}>\n\t\t\t<Tag {...merged} />\n\t\t</Show>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}