{"version":3,"sources":["../src/tabs/tabs.tsx"],"names":["Root","usePermissions","resolvePermissions","useAudit","evaluatePermission","CANONICAL_ACTIONS","jsx","RadixTabs","List","forwardRef","Trigger","Content"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,SAASA,KAAAA,CAAK;AAAA,EACZ,QAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,MAAA;AAAA,EACX,eAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,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;AACZ,IAAA,IAAA,CAAK;AAAA,MACH,SAAA,EAAW,MAAA;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,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAiB;AAC1C,IAAA,IAAA,CAAK;AAAA,MACH,SAAA,EAAW,MAAA;AAAA,MACX,QAAQA,4BAAA,CAAkB,WAAA;AAAA,MAC1B,gBAAA,EAAkB,SAAA;AAAA,MAClB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA;AAAK,KACxB,CAAA;AACD,IAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,uBACEC,cAAA;AAAA,IAAWC,oBAAA,CAAA,IAAA;AAAA,IAAV;AAAA,MACC,KAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA,EAAe,iBAAA;AAAA,MACf,WAAA;AAAA,MACA,GAAA;AAAA,MACA,cAAA;AAAA,MACA,sBAAA,EAAqB,WAAA;AAAA,MACpB,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AACAP,KAAAA,CAAK,WAAA,GAAc,WAAA;AAOnB,IAAMQ,KAAAA,GAAOC,gBAAA;AAAA,EACX,SAAS,QAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,uBACEH,cAAA;AAAA,MAAWC,oBAAA,CAAA,IAAA;AAAA,MAAV;AAAA,QACC,GAAA;AAAA,QACA,sBAAA,EAAqB,WAAA;AAAA,QACpB,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AAOA,IAAMG,QAAAA,GAAUD,gBAAA,CAGd,SAAS,WAAA,CAAY,OAAO,GAAA,EAAK;AACjC,EAAA,uBACEH,cAAA;AAAA,IAAWC,oBAAA,CAAA,OAAA;AAAA,IAAV;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,cAAA;AAAA,MACpB,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAOD,IAAMI,QAAAA,GAAUF,gBAAA,CAGd,SAAS,WAAA,CAAY,OAAO,GAAA,EAAK;AACjC,EAAA,uBACEH,cAAA;AAAA,IAAWC,oBAAA,CAAA,OAAA;AAAA,IAAV;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,cAAA;AAAA,MACpB,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAiBM,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAAP,KAAAA;AAAA,EACA,IAAA,EAAAQ,KAAAA;AAAA,EACA,OAAA,EAAAE,QAAAA;AAAA,EACA,OAAA,EAAAC;AACF","file":"tabs.cjs","sourcesContent":["/**\n * Tabs — headless primitive wrapping Radix Tabs.\n *\n * Radix's Tabs owns the WAI-ARIA Tabs pattern: `role=\"tablist\"` /\n * `role=\"tab\"` / `role=\"tabpanel\"` wiring, arrow-key + Home/End\n * navigation, automatic vs. manual activation modes, and\n * `aria-controls` / `aria-labelledby` pairing (ARCHITECTURE §6). We\n * wrap thinly:\n *   - Permission gating on <Root> (denied → null + permission:denied)\n *   - Audit emission on tab change (`tabs:change`)\n *   - `data-oshon-primitive=\"tabs-*\"` styling hooks\n *\n * \"use client\" mandatory — Radix uses hooks + DOM APIs internally.\n */\n\n'use client';\n\nimport * as RadixTabs from '@radix-ui/react-tabs';\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// Root\n\nexport interface TabsRootProps\n  extends Omit<RadixTabs.TabsProps, 'onValueChange'> {\n  /**\n   * Fires whenever the active tab changes. The primitive fires\n   * `tabs:change` audit automatically before this callback runs.\n   */\n  onValueChange?: (value: string) => void;\n  /**\n   * Per-instance permission override. Merges over the ambient\n   * `PermissionContext`. Denied + any mode hides the entire tabs\n   * surface — tabs are navigation scaffolding; no useful visible-but-\n   * inert state — and emits a `permission:denied` audit.\n   */\n  permissions?: Partial<PermissionContext>;\n  /**\n   * Resource name for `permissions.can('view', resource, attrs)`.\n   * Default `'tabs'`. Override for e.g. `resource=\"admin:settings-tabs\"`.\n   */\n  resource?: string;\n  /** Attribute bag for attribute-based access control. */\n  permissionAttrs?: Record<string, unknown>;\n  children: ReactNode;\n}\n\n/**\n * Tabs root. Orchestrates the tablist + panels, gates on permissions,\n * fires `tabs:change` audit. Must wrap `Tabs.List` + `Tabs.Trigger*` +\n * `Tabs.Content*`.\n */\nfunction Root({\n  children,\n  value,\n  defaultValue,\n  onValueChange,\n  permissions,\n  resource = 'tabs',\n  permissionAttrs,\n  orientation,\n  dir,\n  activationMode,\n  ...rest\n}: TabsRootProps) {\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    emit({\n      component: 'tabs',\n      action: CANONICAL_ACTIONS.PERMISSION_DENIED,\n      permissionResult: 'denied',\n      ...(denyReason ? { denyReason } : {}),\n      details: { attemptedAction: 'view', resource },\n    });\n    return null;\n  }\n\n  const handleValueChange = (next: string) => {\n    emit({\n      component: 'tabs',\n      action: CANONICAL_ACTIONS.TABS_CHANGE,\n      permissionResult: 'granted',\n      details: { value: next },\n    });\n    onValueChange?.(next);\n  };\n\n  return (\n    <RadixTabs.Root\n      value={value}\n      defaultValue={defaultValue}\n      onValueChange={handleValueChange}\n      orientation={orientation}\n      dir={dir}\n      activationMode={activationMode}\n      data-oshon-primitive=\"tabs-root\"\n      {...rest}\n    >\n      {children}\n    </RadixTabs.Root>\n  );\n}\nRoot.displayName = 'Tabs.Root';\n\n// ────────────────────────────────────────────────────────────────────────────\n// List\n\nexport type TabsListProps = ComponentPropsWithoutRef<typeof RadixTabs.List>;\n\nconst List = forwardRef<ElementRef<typeof RadixTabs.List>, TabsListProps>(\n  function TabsList(props, ref) {\n    return (\n      <RadixTabs.List\n        ref={ref}\n        data-oshon-primitive=\"tabs-list\"\n        {...props}\n      />\n    );\n  },\n);\n\n// ────────────────────────────────────────────────────────────────────────────\n// Trigger\n\nexport type TabsTriggerProps = ComponentPropsWithoutRef<typeof RadixTabs.Trigger>;\n\nconst Trigger = forwardRef<\n  ElementRef<typeof RadixTabs.Trigger>,\n  TabsTriggerProps\n>(function TabsTrigger(props, ref) {\n  return (\n    <RadixTabs.Trigger\n      ref={ref}\n      data-oshon-primitive=\"tabs-trigger\"\n      {...props}\n    />\n  );\n});\n\n// ────────────────────────────────────────────────────────────────────────────\n// Content\n\nexport type TabsContentProps = ComponentPropsWithoutRef<typeof RadixTabs.Content>;\n\nconst Content = forwardRef<\n  ElementRef<typeof RadixTabs.Content>,\n  TabsContentProps\n>(function TabsContent(props, ref) {\n  return (\n    <RadixTabs.Content\n      ref={ref}\n      data-oshon-primitive=\"tabs-content\"\n      {...props}\n    />\n  );\n});\n\n// ────────────────────────────────────────────────────────────────────────────\n// Compound export\n\n/**\n * Compound Tabs primitive. Use as:\n *\n *   <Tabs.Root defaultValue=\"overview\">\n *     <Tabs.List>\n *       <Tabs.Trigger value=\"overview\">Overview</Tabs.Trigger>\n *       <Tabs.Trigger value=\"activity\">Activity</Tabs.Trigger>\n *     </Tabs.List>\n *     <Tabs.Content value=\"overview\">…</Tabs.Content>\n *     <Tabs.Content value=\"activity\">…</Tabs.Content>\n *   </Tabs.Root>\n */\nexport const Tabs = {\n  Root,\n  List,\n  Trigger,\n  Content,\n};\n\nexport type TabsProps = TabsRootProps;\n"]}