{"version":3,"sources":["../src/tooltip/tooltip.tsx"],"names":["Provider","jsx","RadixTooltip","Root","usePermissions","resolvePermissions","useAudit","evaluatePermission","CANONICAL_ACTIONS","Trigger","forwardRef","Portal","Content","Arrow"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAASA,UAAS,KAAA,EAA6B;AAC7C,EAAA,uBAAOC,cAAA,CAAcC,uBAAA,CAAA,QAAA,EAAb,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC3C;AACAF,SAAAA,CAAS,WAAA,GAAc,kBAAA;AAwBvB,SAASG,KAAAA,CAAK;AAAA,EACZ,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,SAAA;AAAA,EACX,eAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAUC,yBAAA,EAAe;AAC/B,EAAA,MAAM,SAAA,GAAYC,6BAAA,CAAmB,WAAA,EAAa,OAAO,CAAA;AACzD,EAAA,MAAM,OAAOC,mBAAA,EAAS;AAEtB,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAIC,6BAAA;AAAA,IAC9B,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AAIZ,IAAA,IAAA,CAAK;AAAA,MACH,SAAA,EAAW,SAAA;AAAA,MACX,QAAQC,4BAAA,CAAkB,iBAAA;AAAA,MAC1B,gBAAA,EAAkB,QAAA;AAAA,MAClB,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,OAAA,EAAS,EAAE,eAAA,EAAiB,MAAA,EAAQ,QAAA;AAAS,KAC9C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAOP,cAAA,CAAcC,uBAAA,CAAA,IAAA,EAAb,EAAmB,GAAG,MAAO,QAAA,EAAS,CAAA;AAChD;AACAC,KAAAA,CAAK,WAAA,GAAc,cAAA;AAOnB,IAAMM,QAAAA,GAAUC,gBAAA,CAGd,SAAS,cAAA,CAAe,OAAO,GAAA,EAAK;AACpC,EAAA,uBACET,cAAA;AAAA,IAAcC,uBAAA,CAAA,OAAA;AAAA,IAAb;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,iBAAA;AAAA,MACpB,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAOD,SAASS,QAAO,KAAA,EAA2B;AACzC,EAAA,uBAAOV,cAAA,CAAcC,uBAAA,CAAA,MAAA,EAAb,EAAqB,GAAG,KAAA,EAAO,CAAA;AACzC;AACAS,OAAAA,CAAO,WAAA,GAAc,gBAAA;AAWrB,IAAMC,QAAAA,GAAUF,gBAAA,CAGd,SAAS,cAAA,CAAe,OAAO,GAAA,EAAK;AACpC,EAAA,uBACET,cAAA;AAAA,IAAcC,uBAAA,CAAA,OAAA;AAAA,IAAb;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,iBAAA;AAAA,MACpB,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAOD,IAAMW,MAAAA,GAAQH,gBAAA,CAGZ,SAAS,YAAA,CAAa,OAAO,GAAA,EAAK;AAClC,EAAA,uBACET,cAAA;AAAA,IAAcC,uBAAA,CAAA,KAAA;AAAA,IAAb;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,eAAA;AAAA,MACpB,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAmBM,IAAM,OAAA,GAAU;AAAA,EACrB,QAAA,EAAAF,SAAAA;AAAA,EACA,IAAA,EAAAG,KAAAA;AAAA,EACA,OAAA,EAAAM,QAAAA;AAAA,EACA,MAAA,EAAAE,OAAAA;AAAA,EACA,OAAA,EAAAC,QAAAA;AAAA,EACA,KAAA,EAAAC;AACF","file":"tooltip.cjs","sourcesContent":["/**\n * Tooltip — headless primitive wrapping Radix Tooltip.\n *\n * Radix's Tooltip owns the hard parts: hover + focus triggers with\n * configurable delay, `aria-describedby` wiring, keyboard reachability,\n * pointer-vs-touch heuristics (ARCHITECTURE §6). We wrap thinly:\n *   - `Tooltip.Provider` surfaces the default delay contract\n *   - Permission gating on <Root> (canView=false → primitive returns null)\n *   - `data-oshon-primitive=\"tooltip-*\"` styling hooks\n *\n * Deliberately no audit events. Tooltips open/close on every hover and\n * an audit stream would be noise, not signal — principle #3 (\"RBAC +\n * audit by default\") covers actions, not purely informational surfaces.\n * See `docs/adr/primitives/003-tooltip-radix-wrap.md`.\n */\n\n'use client';\n\nimport * as RadixTooltip from '@radix-ui/react-tooltip';\nimport { forwardRef } from 'react';\nimport type {\n  ComponentPropsWithoutRef,\n  ElementRef,\n  ReactNode,\n} from 'react';\nimport {\n  evaluatePermission,\n  resolvePermissions,\n  usePermissions,\n  useAudit,\n  type PermissionContext,\n} from '../context.js';\nimport { CANONICAL_ACTIONS } from '../actions.js';\n\n// ────────────────────────────────────────────────────────────────────────────\n// Provider\n\nexport type TooltipProviderProps = ComponentPropsWithoutRef<typeof RadixTooltip.Provider>;\n\n/**\n * Configures default delay + skip-delay behavior for every descendant\n * Tooltip. Mount once near the app root.\n */\nfunction Provider(props: TooltipProviderProps) {\n  return <RadixTooltip.Provider {...props} />;\n}\nProvider.displayName = 'Tooltip.Provider';\n\n// ────────────────────────────────────────────────────────────────────────────\n// Root\n\nexport interface TooltipRootProps extends RadixTooltip.TooltipProps {\n  /**\n   * Per-instance permission override. Merges over the ambient\n   * `PermissionContext`. A tooltip has no useful non-interactive visible\n   * state, so any denied permission (regardless of `mode`) hides both\n   * trigger and content and emits a `permission:denied` audit event.\n   */\n  permissions?: Partial<PermissionContext>;\n  /**\n   * Resource name passed to `permissions.can('view', resource, attrs)`.\n   * Default `'tooltip'`. Override for specific semantics like\n   * `resource=\"field:ssn-help\"`.\n   */\n  resource?: string;\n  /** Attribute bag for attribute-based access control. */\n  permissionAttrs?: Record<string, unknown>;\n  children: ReactNode;\n}\n\nfunction Root({\n  children,\n  permissions,\n  resource = 'tooltip',\n  permissionAttrs,\n  ...rest\n}: TooltipRootProps) {\n  const context = usePermissions();\n  const effective = resolvePermissions(permissions, context);\n  const emit = useAudit();\n\n  const { granted, denyReason } = evaluatePermission(\n    effective,\n    'view',\n    resource,\n    permissionAttrs,\n  );\n\n  if (!granted) {\n    // Tooltips have no meaningful visible-but-inert state — all deny\n    // modes hide. We still emit the denial so governance can surface\n    // over-permissive help-text surfaces (principle #3, ADR-003).\n    emit({\n      component: 'tooltip',\n      action: CANONICAL_ACTIONS.PERMISSION_DENIED,\n      permissionResult: 'denied',\n      ...(denyReason ? { denyReason } : {}),\n      details: { attemptedAction: 'view', resource },\n    });\n    return null;\n  }\n\n  return <RadixTooltip.Root {...rest}>{children}</RadixTooltip.Root>;\n}\nRoot.displayName = 'Tooltip.Root';\n\n// ────────────────────────────────────────────────────────────────────────────\n// Trigger\n\nexport type TooltipTriggerProps = ComponentPropsWithoutRef<typeof RadixTooltip.Trigger>;\n\nconst Trigger = forwardRef<\n  ElementRef<typeof RadixTooltip.Trigger>,\n  TooltipTriggerProps\n>(function TooltipTrigger(props, ref) {\n  return (\n    <RadixTooltip.Trigger\n      ref={ref}\n      data-oshon-primitive=\"tooltip-trigger\"\n      {...props}\n    />\n  );\n});\n\n// ────────────────────────────────────────────────────────────────────────────\n// Portal\n\nexport type TooltipPortalProps = RadixTooltip.TooltipPortalProps;\n\nfunction Portal(props: TooltipPortalProps) {\n  return <RadixTooltip.Portal {...props} />;\n}\nPortal.displayName = 'Tooltip.Portal';\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content\n\nexport type TooltipContentProps = ComponentPropsWithoutRef<typeof RadixTooltip.Content>;\n\n/**\n * Content. Radix handles `role=\"tooltip\"`, positioning, and collision\n * detection. We add the styling hook.\n */\nconst Content = forwardRef<\n  ElementRef<typeof RadixTooltip.Content>,\n  TooltipContentProps\n>(function TooltipContent(props, ref) {\n  return (\n    <RadixTooltip.Content\n      ref={ref}\n      data-oshon-primitive=\"tooltip-content\"\n      {...props}\n    />\n  );\n});\n\n// ────────────────────────────────────────────────────────────────────────────\n// Arrow\n\nexport type TooltipArrowProps = ComponentPropsWithoutRef<typeof RadixTooltip.Arrow>;\n\nconst Arrow = forwardRef<\n  ElementRef<typeof RadixTooltip.Arrow>,\n  TooltipArrowProps\n>(function TooltipArrow(props, ref) {\n  return (\n    <RadixTooltip.Arrow\n      ref={ref}\n      data-oshon-primitive=\"tooltip-arrow\"\n      {...props}\n    />\n  );\n});\n\n// ────────────────────────────────────────────────────────────────────────────\n// Compound export\n\n/**\n * Compound Tooltip primitive. Use as:\n *\n *   <Tooltip.Provider>\n *     <Tooltip.Root>\n *       <Tooltip.Trigger asChild>\n *         <button>Help</button>\n *       </Tooltip.Trigger>\n *       <Tooltip.Portal>\n *         <Tooltip.Content>Inline documentation.</Tooltip.Content>\n *       </Tooltip.Portal>\n *     </Tooltip.Root>\n *   </Tooltip.Provider>\n */\nexport const Tooltip = {\n  Provider,\n  Root,\n  Trigger,\n  Portal,\n  Content,\n  Arrow,\n};\n\nexport type TooltipProps = TooltipRootProps;\n"]}