{"version":3,"file":"link.cjs","names":["Solid","mergeRefs","deepEqual","exactPathTest","functionalUpdate","isDangerousProtocol","preloadWarning","removeTrailingSlash","isServer","Dynamic","useRouter","useIntersectionObserver","useHydrated","AnyRouter","Constrain","LinkOptions","RegisteredRouter","RoutePaths","ValidateLinkOptions","ValidateLinkOptionsArray","timeoutMap","WeakMap","EventTarget","ReturnType","setTimeout","useLinkProps","TRouter","TFrom","options","UseLinkPropsOptions","TTo","TMaskFrom","TMaskTo","ComponentProps","router","isTransitioning","setIsTransitioning","createSignal","shouldHydrateHash","ssr","hasHydrated","hasRenderFetched","local","rest","splitProps","mergeProps","activeProps","STATIC_ACTIVE_PROPS_GET","inactiveProps","STATIC_INACTIVE_PROPS_GET","_","propsSafeToSpread","currentLocation","createMemo","stores","location","state","undefined","equals","prev","next","href","_options","_fromLocation","untrack","buildLocation","hrefOption","disabled","maskedLocation","publicHref","external","history","createHref","externalLink","_href","protocolAllowlist","process","env","NODE_ENV","console","warn","to","safeInternal","isSafeInternal","indexOf","URL","preload","reloadDocument","defaultPreload","preloadDelay","defaultPreloadDelay","isActive","activeOptions","current","nextLocation","exact","testExact","pathname","basepath","currentPath","nextPath","pathIsFuzzyEqual","startsWith","length","includeSearch","searchTest","search","partial","ignoreUndefined","explicitUndefined","includeHash","currentHash","hash","doPreload","preloadRoute","_builtLocation","catch","err","preloadViewportIoCallback","entry","IntersectionObserverEntry","isIntersecting","ref","setRef","Element","rootMargin","createEffect","handleClick","e","MouseEvent","elementTarget","currentTarget","HTMLAnchorElement","SVGAElement","getAttribute","effectiveTarget","target","isCtrlEvent","defaultPrevented","button","preventDefault","unsub","subscribe","navigate","replace","resetScroll","hashScrollIntoView","startTransition","viewTransition","ignoreBlocker","enqueueIntentPreload","FocusEvent","eventTarget","has","set","delete","handleTouchStart","TouchEvent","handleLeave","id","get","clearTimeout","simpleStyling","class","style","onClick","createComposedHandler","onBlur","onFocus","onMouseEnter","onMouseOver","onMouseLeave","onMouseOut","onTouchStart","ResolvedLinkStateProps","Omit","JSX","CSSProperties","resolvedProps","active","base","STATIC_DISABLED_PROPS","STATIC_TRANSITIONING_ATTRIBUTES","STATIC_DEFAULT_ACTIVE_ATTRIBUTES","EMPTY_OBJECT","className","filter","Boolean","join","Object","keys","STATIC_ACTIVE_ATTRIBUTES","STATIC_ACTIVE_PROPS","role","callHandler","Event","event","TEvent","T","handler","EventHandlerUnion","getHandler","fallback","ActiveLinkOptions","ActiveLinkOptionProps","TComp","ActiveLinkProps","Partial","LinkComponentSolidProps","key","LinkProps","LinkPropsChildren","children","ValidComponent","CreateLinkProps","LinkComponentProps","LinkComponent","TDefaultFrom","props","LinkComponentRoute","defaultFrom","createLink","Comp","_$createComponent","Link","_$mergeProps","_asChild","linkProps","ch","svgLinkProps","_el$","_tmpl$","_el$2","firstChild","_$spread","_$insert","_el$3","_tmpl$2","component","metaKey","altKey","ctrlKey","shiftKey","zero","charCodeAt","LinkOptionsFnOptions","TOptions","ReadonlyArray","LinkOptionsFn","linkOptions"],"sources":["../../src/link.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\n\nimport { mergeRefs } from '@solid-primitives/refs'\n\nimport {\n  deepEqual,\n  exactPathTest,\n  functionalUpdate,\n  isDangerousProtocol,\n  preloadWarning,\n  removeTrailingSlash,\n} from '@tanstack/router-core'\n\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { Dynamic } from 'solid-js/web'\nimport { useRouter } from './useRouter'\n\nimport { useIntersectionObserver } from './utils'\n\nimport { useHydrated } from './ClientOnly'\nimport type {\n  AnyRouter,\n  Constrain,\n  LinkOptions,\n  RegisteredRouter,\n  RoutePaths,\n} from '@tanstack/router-core'\nimport type {\n  ValidateLinkOptions,\n  ValidateLinkOptionsArray,\n} from './typePrimitives'\n\nconst timeoutMap = new WeakMap<EventTarget, ReturnType<typeof setTimeout>>()\n\nexport function useLinkProps<\n  TRouter extends AnyRouter = RegisteredRouter,\n  TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n  TTo extends string = '',\n  TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n  TMaskTo extends string = '',\n>(\n  options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Solid.ComponentProps<'a'> {\n  const router = useRouter()\n  const [isTransitioning, setIsTransitioning] = Solid.createSignal(false)\n  const shouldHydrateHash = !isServer && !!router.options.ssr\n  const hasHydrated = useHydrated()\n\n  let hasRenderFetched = false\n\n  const [local, rest] = Solid.splitProps(\n    Solid.mergeProps(\n      {\n        activeProps: STATIC_ACTIVE_PROPS_GET,\n        inactiveProps: STATIC_INACTIVE_PROPS_GET,\n      },\n      options,\n    ),\n    [\n      'activeProps',\n      'inactiveProps',\n      'activeOptions',\n      'to',\n      'preload',\n      'preloadDelay',\n      'hashScrollIntoView',\n      'replace',\n      'startTransition',\n      'resetScroll',\n      'viewTransition',\n      'target',\n      'disabled',\n      'style',\n      'class',\n      'onClick',\n      'onBlur',\n      'onFocus',\n      'onMouseEnter',\n      'onMouseLeave',\n      'onMouseOver',\n      'onMouseOut',\n      'onTouchStart',\n      'ignoreBlocker',\n    ],\n  )\n\n  // const {\n  //   // custom props\n  //   activeProps = () => ({ class: 'active' }),\n  //   inactiveProps = () => ({}),\n  //   activeOptions,\n  //   to,\n  //   preload: userPreload,\n  //   preloadDelay: userPreloadDelay,\n  //   hashScrollIntoView,\n  //   replace,\n  //   startTransition,\n  //   resetScroll,\n  //   viewTransition,\n  //   // element props\n  //   children,\n  //   target,\n  //   disabled,\n  //   style,\n  //   class,\n  //   onClick,\n  //   onFocus,\n  //   onMouseEnter,\n  //   onMouseLeave,\n  //   onTouchStart,\n  //   ignoreBlocker,\n  //   ...rest\n  // } = options\n\n  const [_, propsSafeToSpread] = Solid.splitProps(rest, [\n    'params',\n    'search',\n    'hash',\n    'state',\n    'mask',\n    'reloadDocument',\n    'unsafeRelative',\n  ])\n\n  const currentLocation = Solid.createMemo(\n    () => router.stores.location.state,\n    undefined,\n    { equals: (prev, next) => prev.href === next.href },\n  )\n\n  const _options = () => options\n\n  const next = Solid.createMemo(() => {\n    // Rebuild when inherited search/hash or the current route context changes.\n    const _fromLocation = currentLocation()\n    const options = { _fromLocation, ..._options() } as any\n    // untrack because router-core will also access stores, which are signals in solid\n    return Solid.untrack(() => router.buildLocation(options))\n  })\n\n  const hrefOption = Solid.createMemo(() => {\n    if (_options().disabled) return undefined\n    // Use publicHref - it contains the correct href for display\n    // When a rewrite changes the origin, publicHref is the full URL\n    // Otherwise it's the origin-stripped path\n    // This avoids constructing URL objects in the hot path\n    const location = next().maskedLocation ?? next()\n    const publicHref = location.publicHref\n    const external = location.external\n\n    if (external) {\n      return { href: publicHref, external: true }\n    }\n\n    return {\n      href: router.history.createHref(publicHref) || '/',\n      external: false,\n    }\n  })\n\n  const externalLink = Solid.createMemo(() => {\n    const _href = hrefOption()\n    if (_href?.external) {\n      // Block dangerous protocols for external links\n      if (isDangerousProtocol(_href.href, router.protocolAllowlist)) {\n        if (process.env.NODE_ENV !== 'production') {\n          console.warn(`Blocked Link with dangerous protocol: ${_href.href}`)\n        }\n        return undefined\n      }\n      return _href.href\n    }\n    const to = _options().to\n    const safeInternal = isSafeInternal(to)\n    if (safeInternal) return undefined\n    if (typeof to !== 'string' || to.indexOf(':') === -1) return undefined\n    try {\n      new URL(to as any)\n      // Block dangerous protocols like javascript:, blob:, data:\n      if (isDangerousProtocol(to, router.protocolAllowlist)) {\n        if (process.env.NODE_ENV !== 'production') {\n          console.warn(`Blocked Link with dangerous protocol: ${to}`)\n        }\n        return undefined\n      }\n      return to\n    } catch {}\n    return undefined\n  })\n\n  const preload = Solid.createMemo(() => {\n    if (_options().reloadDocument || externalLink()) {\n      return false\n    }\n    return local.preload ?? router.options.defaultPreload\n  })\n  const preloadDelay = () =>\n    local.preloadDelay ?? router.options.defaultPreloadDelay ?? 0\n\n  const isActive = Solid.createMemo(() => {\n    if (externalLink()) return false\n    const activeOptions = local.activeOptions\n    const current = currentLocation()\n    const nextLocation = next()\n\n    if (activeOptions?.exact) {\n      const testExact = exactPathTest(\n        current.pathname,\n        nextLocation.pathname,\n        router.basepath,\n      )\n      if (!testExact) {\n        return false\n      }\n    } else {\n      const currentPath = removeTrailingSlash(current.pathname, router.basepath)\n      const nextPath = removeTrailingSlash(\n        nextLocation.pathname,\n        router.basepath,\n      )\n\n      const pathIsFuzzyEqual =\n        currentPath.startsWith(nextPath) &&\n        (currentPath.length === nextPath.length ||\n          currentPath[nextPath.length] === '/')\n      if (!pathIsFuzzyEqual) {\n        return false\n      }\n    }\n\n    if (activeOptions?.includeSearch ?? true) {\n      const searchTest = deepEqual(current.search, nextLocation.search, {\n        partial: !activeOptions?.exact,\n        ignoreUndefined: !activeOptions?.explicitUndefined,\n      })\n      if (!searchTest) {\n        return false\n      }\n    }\n\n    if (activeOptions?.includeHash) {\n      const currentHash =\n        shouldHydrateHash && !hasHydrated() ? '' : current.hash\n      return currentHash === nextLocation.hash\n    }\n    return true\n  })\n\n  const doPreload = () =>\n    router\n      .preloadRoute({ ..._options(), _builtLocation: next() } as any)\n      .catch((err: any) => {\n        console.warn(err)\n        console.warn(preloadWarning)\n      })\n\n  const preloadViewportIoCallback = (\n    entry: IntersectionObserverEntry | undefined,\n  ) => {\n    if (entry?.isIntersecting) {\n      doPreload()\n    }\n  }\n\n  const [ref, setRef] = Solid.createSignal<Element | null>(null)\n\n  useIntersectionObserver(\n    ref,\n    preloadViewportIoCallback,\n    { rootMargin: '100px' },\n    { disabled: !!local.disabled || !(preload() === 'viewport') },\n  )\n\n  Solid.createEffect(() => {\n    if (hasRenderFetched) {\n      return\n    }\n    if (!local.disabled && preload() === 'render') {\n      doPreload()\n      hasRenderFetched = true\n    }\n  })\n\n  if (externalLink()) {\n    return Solid.mergeProps(\n      propsSafeToSpread,\n      {\n        ref: mergeRefs(setRef, _options().ref),\n        href: externalLink(),\n      },\n      Solid.splitProps(local, [\n        'target',\n        'disabled',\n        'style',\n        'class',\n        'onClick',\n        'onBlur',\n        'onFocus',\n        'onMouseEnter',\n        'onMouseLeave',\n        'onMouseOut',\n        'onMouseOver',\n        'onTouchStart',\n      ])[0],\n    ) as any\n  }\n\n  // The click handler\n  const handleClick = (e: MouseEvent) => {\n    // Check actual element's target attribute as fallback\n    const elementTarget = (\n      e.currentTarget as HTMLAnchorElement | SVGAElement\n    ).getAttribute('target')\n    const effectiveTarget =\n      local.target !== undefined ? local.target : elementTarget\n\n    if (\n      !local.disabled &&\n      !isCtrlEvent(e) &&\n      !e.defaultPrevented &&\n      (!effectiveTarget || effectiveTarget === '_self') &&\n      e.button === 0\n    ) {\n      e.preventDefault()\n\n      setIsTransitioning(true)\n\n      const unsub = router.subscribe('onResolved', () => {\n        unsub()\n        setIsTransitioning(false)\n      })\n\n      // All is well? Navigate!\n      // N.B. we don't call `router.commitLocation(next) here because we want to run `validateSearch` before committing\n      router.navigate({\n        ..._options(),\n        replace: local.replace,\n        resetScroll: local.resetScroll,\n        hashScrollIntoView: local.hashScrollIntoView,\n        startTransition: local.startTransition,\n        viewTransition: local.viewTransition,\n        ignoreBlocker: local.ignoreBlocker,\n      })\n    }\n  }\n\n  const enqueueIntentPreload = (e: MouseEvent | FocusEvent) => {\n    if (local.disabled || preload() !== 'intent') return\n\n    if (!preloadDelay()) {\n      doPreload()\n      return\n    }\n\n    const eventTarget = e.currentTarget || e.target\n\n    if (!eventTarget || timeoutMap.has(eventTarget)) return\n\n    timeoutMap.set(\n      eventTarget,\n      setTimeout(() => {\n        timeoutMap.delete(eventTarget)\n        doPreload()\n      }, preloadDelay()),\n    )\n  }\n\n  const handleTouchStart = (_: TouchEvent) => {\n    if (local.disabled || preload() !== 'intent') return\n    doPreload()\n  }\n\n  const handleLeave = (e: MouseEvent | FocusEvent) => {\n    if (local.disabled) return\n    const eventTarget = e.currentTarget || e.target\n\n    if (eventTarget) {\n      const id = timeoutMap.get(eventTarget)\n      clearTimeout(id)\n      timeoutMap.delete(eventTarget)\n    }\n  }\n\n  const simpleStyling = Solid.createMemo(\n    () =>\n      local.activeProps === STATIC_ACTIVE_PROPS_GET &&\n      local.inactiveProps === STATIC_INACTIVE_PROPS_GET &&\n      local.class === undefined &&\n      local.style === undefined,\n  )\n\n  const onClick = createComposedHandler(() => local.onClick, handleClick)\n  const onBlur = createComposedHandler(() => local.onBlur, handleLeave)\n  const onFocus = createComposedHandler(\n    () => local.onFocus,\n    enqueueIntentPreload,\n  )\n  const onMouseEnter = createComposedHandler(\n    () => local.onMouseEnter,\n    enqueueIntentPreload,\n  )\n  const onMouseOver = createComposedHandler(\n    () => local.onMouseOver,\n    enqueueIntentPreload,\n  )\n  const onMouseLeave = createComposedHandler(\n    () => local.onMouseLeave,\n    handleLeave,\n  )\n  const onMouseOut = createComposedHandler(() => local.onMouseOut, handleLeave)\n  const onTouchStart = createComposedHandler(\n    () => local.onTouchStart,\n    handleTouchStart,\n  )\n\n  type ResolvedLinkStateProps = Omit<Solid.ComponentProps<'a'>, 'style'> & {\n    style?: Solid.JSX.CSSProperties\n  }\n\n  const resolvedProps = Solid.createMemo(() => {\n    const active = isActive()\n\n    const base = {\n      href: hrefOption()?.href,\n      ref: mergeRefs(setRef, _options().ref),\n      onClick,\n      onBlur,\n      onFocus,\n      onMouseEnter,\n      onMouseOver,\n      onMouseLeave,\n      onMouseOut,\n      onTouchStart,\n      disabled: !!local.disabled,\n      target: local.target,\n      ...(local.disabled && STATIC_DISABLED_PROPS),\n      ...(isTransitioning() && STATIC_TRANSITIONING_ATTRIBUTES),\n    }\n\n    if (simpleStyling()) {\n      return {\n        ...base,\n        ...(active && STATIC_DEFAULT_ACTIVE_ATTRIBUTES),\n      }\n    }\n\n    const activeProps: ResolvedLinkStateProps = active\n      ? (functionalUpdate(local.activeProps as any, {}) ?? EMPTY_OBJECT)\n      : EMPTY_OBJECT\n    const inactiveProps: ResolvedLinkStateProps = active\n      ? EMPTY_OBJECT\n      : functionalUpdate(local.inactiveProps, {})\n    const style = {\n      ...local.style,\n      ...activeProps.style,\n      ...inactiveProps.style,\n    }\n    const className = [local.class, activeProps.class, inactiveProps.class]\n      .filter(Boolean)\n      .join(' ')\n\n    return {\n      ...activeProps,\n      ...inactiveProps,\n      ...base,\n      ...(Object.keys(style).length ? { style } : undefined),\n      ...(className ? { class: className } : undefined),\n      ...(active && STATIC_ACTIVE_ATTRIBUTES),\n    } as ResolvedLinkStateProps\n  })\n\n  return Solid.mergeProps(propsSafeToSpread, resolvedProps) as any\n}\n\nconst STATIC_ACTIVE_PROPS = { class: 'active' }\nconst STATIC_ACTIVE_PROPS_GET = () => STATIC_ACTIVE_PROPS\nconst EMPTY_OBJECT = {}\nconst STATIC_INACTIVE_PROPS_GET = () => EMPTY_OBJECT\nconst STATIC_DEFAULT_ACTIVE_ATTRIBUTES = {\n  class: 'active',\n  'data-status': 'active',\n  'aria-current': 'page',\n}\nconst STATIC_DISABLED_PROPS = {\n  role: 'link',\n  'aria-disabled': true,\n}\nconst STATIC_ACTIVE_ATTRIBUTES = {\n  'data-status': 'active',\n  'aria-current': 'page',\n}\nconst STATIC_TRANSITIONING_ATTRIBUTES = {\n  'data-transitioning': 'transitioning',\n}\n\n/** Call a JSX.EventHandlerUnion with the event. */\nfunction callHandler<T, TEvent extends Event>(\n  event: TEvent & { currentTarget: T; target: Element },\n  handler: Solid.JSX.EventHandlerUnion<T, TEvent>,\n) {\n  if (typeof handler === 'function') {\n    handler(event)\n  } else {\n    handler[0](handler[1], event)\n  }\n  return event.defaultPrevented\n}\n\nfunction createComposedHandler<T, TEvent extends Event>(\n  getHandler: () => Solid.JSX.EventHandlerUnion<T, TEvent> | undefined,\n  fallback: (event: TEvent) => void,\n) {\n  return (event: TEvent & { currentTarget: T; target: Element }) => {\n    const handler = getHandler()\n    if (!handler || !callHandler(event, handler)) fallback(event)\n  }\n}\n\nexport type UseLinkPropsOptions<\n  TRouter extends AnyRouter = RegisteredRouter,\n  TFrom extends RoutePaths<TRouter['routeTree']> | string = string,\n  TTo extends string | undefined = '.',\n  TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,\n  TMaskTo extends string = '.',\n> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n  Omit<Solid.ComponentProps<'a'>, 'style'> & { style?: Solid.JSX.CSSProperties }\n\nexport type ActiveLinkOptions<\n  TComp = 'a',\n  TRouter extends AnyRouter = RegisteredRouter,\n  TFrom extends string = string,\n  TTo extends string | undefined = '.',\n  TMaskFrom extends string = TFrom,\n  TMaskTo extends string = '.',\n> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n  ActiveLinkOptionProps<TComp>\n\ntype ActiveLinkProps<TComp> = Partial<\n  LinkComponentSolidProps<TComp> & {\n    [key: `data-${string}`]: unknown\n  }\n>\n\nexport interface ActiveLinkOptionProps<TComp = 'a'> {\n  /**\n   * A function that returns additional props for the `active` state of this link.\n   * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n   */\n  activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n  /**\n   * A function that returns additional props for the `inactive` state of this link.\n   * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated)\n   */\n  inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>)\n}\n\nexport type LinkProps<\n  TComp = 'a',\n  TRouter extends AnyRouter = RegisteredRouter,\n  TFrom extends string = string,\n  TTo extends string | undefined = '.',\n  TMaskFrom extends string = TFrom,\n  TMaskTo extends string = '.',\n> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> &\n  LinkPropsChildren\n\nexport interface LinkPropsChildren {\n  // If a function is passed as a child, it will be given the `isActive` boolean to aid in further styling on the element it returns\n  children?:\n    | Solid.JSX.Element\n    | ((state: {\n        isActive: boolean\n        isTransitioning: boolean\n      }) => Solid.JSX.Element)\n}\n\ntype LinkComponentSolidProps<TComp> = TComp extends Solid.ValidComponent\n  ? Omit<Solid.ComponentProps<TComp>, keyof CreateLinkProps>\n  : never\n\nexport type LinkComponentProps<\n  TComp = 'a',\n  TRouter extends AnyRouter = RegisteredRouter,\n  TFrom extends string = string,\n  TTo extends string | undefined = '.',\n  TMaskFrom extends string = TFrom,\n  TMaskTo extends string = '.',\n> = LinkComponentSolidProps<TComp> &\n  LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type CreateLinkProps = LinkProps<\n  any,\n  any,\n  string,\n  string,\n  string,\n  string\n>\n\nexport type LinkComponent<\n  in out TComp,\n  in out TDefaultFrom extends string = string,\n> = <\n  TRouter extends AnyRouter = RegisteredRouter,\n  const TFrom extends string = TDefaultFrom,\n  const TTo extends string | undefined = undefined,\n  const TMaskFrom extends string = TFrom,\n  const TMaskTo extends string = '',\n>(\n  props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Solid.JSX.Element\n\nexport interface LinkComponentRoute<\n  in out TDefaultFrom extends string = string,\n> {\n  defaultFrom: TDefaultFrom;\n  <\n    TRouter extends AnyRouter = RegisteredRouter,\n    const TTo extends string | undefined = undefined,\n    const TMaskTo extends string = '',\n  >(\n    props: LinkComponentProps<\n      'a',\n      TRouter,\n      this['defaultFrom'],\n      TTo,\n      this['defaultFrom'],\n      TMaskTo\n    >,\n  ): Solid.JSX.Element\n}\n\nexport function createLink<const TComp>(\n  Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,\n): LinkComponent<TComp> {\n  return (props) => <Link {...props} _asChild={Comp} />\n}\n\nexport const Link: LinkComponent<'a'> = (props) => {\n  const [local, rest] = Solid.splitProps(\n    props as typeof props & { _asChild: any },\n    ['_asChild', 'children'],\n  )\n\n  const [_, linkProps] = Solid.splitProps(\n    useLinkProps(rest as unknown as any),\n    ['type'],\n  )\n\n  const children = Solid.createMemo(() => {\n    const ch = local.children\n    if (typeof ch === 'function') {\n      return ch({\n        get isActive() {\n          return (linkProps as any)['data-status'] === 'active'\n        },\n        get isTransitioning() {\n          return (linkProps as any)['data-transitioning'] === 'transitioning'\n        },\n      })\n    }\n\n    return ch satisfies Solid.JSX.Element\n  })\n\n  if (local._asChild === 'svg') {\n    const [_, svgLinkProps] = Solid.splitProps(linkProps, ['class'])\n    return (\n      <svg>\n        <a {...svgLinkProps}>{children()}</a>\n      </svg>\n    )\n  }\n\n  if (!local._asChild) {\n    return <a {...linkProps}>{children()}</a>\n  }\n\n  return (\n    <Dynamic component={local._asChild as Solid.ValidComponent} {...linkProps}>\n      {children()}\n    </Dynamic>\n  )\n}\n\nfunction isCtrlEvent(e: MouseEvent) {\n  return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n}\n\nfunction isSafeInternal(to: unknown) {\n  if (typeof to !== 'string') return false\n  const zero = to.charCodeAt(0)\n  if (zero === 47) return to.charCodeAt(1) !== 47 // '/' but not '//'\n  return zero === 46 // '.', '..', './', '../'\n}\n\nexport type LinkOptionsFnOptions<\n  TOptions,\n  TComp,\n  TRouter extends AnyRouter = RegisteredRouter,\n> =\n  TOptions extends ReadonlyArray<any>\n    ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp>\n    : ValidateLinkOptions<TRouter, TOptions, string, TComp>\n\nexport type LinkOptionsFn<TComp> = <\n  const TOptions,\n  TRouter extends AnyRouter = RegisteredRouter,\n>(\n  options: LinkOptionsFnOptions<TOptions, TComp, TRouter>,\n) => TOptions\n\nexport const linkOptions: LinkOptionsFn<'a'> = (options) => {\n  return options as any\n}\n"],"mappings":"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"}