{"version":3,"sources":["../../../src/primitives/Wall/TokenPanel.tsx"],"names":[],"mappings":"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","file":"TokenPanel.mjs","sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\nimport { QRCodeCanvas } from 'qrcode.react';\nimport type { WallTokenAdmin } from '../../hooks/useWallToken';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface TokenPanelContextValue {\n  admin: WallTokenAdmin;\n  open: boolean;\n  onToggle: () => void;\n}\n\nconst TokenPanelContext = createContext<TokenPanelContextValue | null>(null);\n\nfunction useTokenPanelContext(): TokenPanelContextValue {\n  const ctx = useContext(TokenPanelContext);\n  if (!ctx) {\n    throw new Error('<TokenPanel.*> must be rendered inside <TokenPanel>.');\n  }\n  return ctx;\n}\n\n// ─── Default icons ────────────────────────────────────────────────────────────\n\nconst DEFAULT_TOGGLE_ICON = (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className=\"h-4 w-4\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    stroke=\"currentColor\"\n    strokeWidth={2}\n  >\n    <path\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      d=\"M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z\"\n    />\n  </svg>\n);\n\nconst DEFAULT_DOWNLOAD_ICON = (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className=\"h-3.5 w-3.5\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    stroke=\"currentColor\"\n    strokeWidth={2}\n  >\n    <path\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\"\n    />\n  </svg>\n);\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport interface TokenPanelProps {\n  admin: WallTokenAdmin;\n  open: boolean;\n  onToggle: () => void;\n  className?: string;\n  children: ReactNode;\n}\n\nfunction TokenPanelRoot({\n  admin,\n  open,\n  onToggle,\n  className,\n  children,\n}: TokenPanelProps) {\n  return (\n    <TokenPanelContext.Provider value={{ admin, open, onToggle }}>\n      <div className={className}>{children}</div>\n    </TokenPanelContext.Provider>\n  );\n}\n\n// ─── Subcomponents ────────────────────────────────────────────────────────────\n\nexport interface TokenPanelToggleProps {\n  className?: string;\n  /** Override the default label (\"Wall Access Token (set)\" / \"(not set)\"). */\n  children?: ReactNode;\n  /** Override the leading icon. Pass `null` to omit. */\n  icon?: ReactNode;\n}\n\nfunction Toggle({ className, children, icon }: TokenPanelToggleProps) {\n  const { admin, open, onToggle } = useTokenPanelContext();\n  const hasToken = admin.currentToken.length > 0;\n  const renderedIcon = icon === undefined ? DEFAULT_TOGGLE_ICON : icon;\n  return (\n    <button\n      type=\"button\"\n      onClick={onToggle}\n      className={className}\n      aria-expanded={open}\n    >\n      {renderedIcon}\n      {children ?? (\n        <>\n          Wall Access Token{' '}\n          {admin.loaded ? (hasToken ? '(set)' : '(not set)') : ''}\n        </>\n      )}\n    </button>\n  );\n}\n\nexport interface TokenPanelPanelProps {\n  className?: string;\n  children: ReactNode;\n}\n\nfunction Panel({ className, children }: TokenPanelPanelProps) {\n  const { open } = useTokenPanelContext();\n  if (!open) return null;\n  return <div className={className}>{children}</div>;\n}\n\nexport interface TokenPanelDescriptionProps {\n  className?: string;\n  children?: ReactNode;\n}\n\nfunction Description({ className, children }: TokenPanelDescriptionProps) {\n  return (\n    <p className={className}>\n      {children ?? (\n        <>\n          Guests need this token in their wall URL (<code>?t=...</code>) to trigger AI scenes.\n          Share via QR code or invite link. Empty means AI scenes always run.\n        </>\n      )}\n    </p>\n  );\n}\n\nexport interface TokenPanelControlsProps {\n  className?: string;\n  children: ReactNode;\n}\n\nfunction Controls({ className, children }: TokenPanelControlsProps) {\n  return <div className={className}>{children}</div>;\n}\n\nexport interface TokenPanelInputProps {\n  className?: string;\n  placeholder?: string;\n}\n\nfunction Input({ className, placeholder = '6-char token' }: TokenPanelInputProps) {\n  const { admin } = useTokenPanelContext();\n  return (\n    <input\n      type=\"text\"\n      value={admin.input}\n      onChange={e => admin.setInput(e.target.value)}\n      placeholder={placeholder}\n      className={className}\n    />\n  );\n}\n\nexport interface TokenPanelGenerateProps {\n  className?: string;\n  children?: ReactNode;\n  length?: number;\n}\n\nfunction Generate({ className, children, length = 6 }: TokenPanelGenerateProps) {\n  const { admin } = useTokenPanelContext();\n  return (\n    <button\n      type=\"button\"\n      onClick={() => admin.generate(length)}\n      className={className}\n    >\n      {children ?? 'Generate'}\n    </button>\n  );\n}\n\nexport interface TokenPanelSaveProps {\n  className?: string;\n  /** Label shown when not saving. Default: \"Save\". */\n  children?: ReactNode;\n  /** Label shown while saving. Default: \"Saving...\". */\n  savingLabel?: ReactNode;\n}\n\nfunction Save({ className, children, savingLabel }: TokenPanelSaveProps) {\n  const { admin } = useTokenPanelContext();\n  return (\n    <button\n      type=\"button\"\n      disabled={admin.saving}\n      onClick={admin.save}\n      className={className}\n    >\n      {admin.saving ? (savingLabel ?? 'Saving...') : (children ?? 'Save')}\n    </button>\n  );\n}\n\nexport interface TokenPanelClearProps {\n  className?: string;\n  children?: ReactNode;\n}\n\nfunction Clear({ className, children }: TokenPanelClearProps) {\n  const { admin } = useTokenPanelContext();\n  if (!admin.currentToken) return null;\n  return (\n    <button type=\"button\" onClick={admin.clear} className={className}>\n      {children ?? 'Clear'}\n    </button>\n  );\n}\n\nexport interface TokenPanelShareSectionProps {\n  className?: string;\n  children: ReactNode;\n}\n\nfunction ShareSection({ className, children }: TokenPanelShareSectionProps) {\n  const { admin } = useTokenPanelContext();\n  if (!admin.currentToken || !admin.shareUrl) return null;\n  return <div className={className}>{children}</div>;\n}\n\nexport interface TokenPanelShareLinkProps {\n  className?: string;\n}\n\nfunction ShareLink({ className }: TokenPanelShareLinkProps) {\n  const { admin } = useTokenPanelContext();\n  return (\n    <code className={className}>\n      {`${admin.shareUrl}?t=${admin.currentToken}`}\n    </code>\n  );\n}\n\nexport interface TokenPanelQRProps {\n  /** Canvas size in px (controls download resolution). Default 512. */\n  size?: number;\n  /** Displayed CSS size in px. Default 160. */\n  displaySize?: number;\n  level?: 'L' | 'M' | 'Q' | 'H';\n  marginSize?: number;\n  /** Optional wrapper className (e.g. for a framed background). */\n  frameClassName?: string;\n}\n\nfunction QR({\n  size = 512,\n  displaySize = 160,\n  level = 'M',\n  marginSize = 4,\n  frameClassName,\n}: TokenPanelQRProps) {\n  const { admin } = useTokenPanelContext();\n  const canvas = (\n    <QRCodeCanvas\n      ref={admin.qrCanvasRef}\n      value={`${admin.shareUrl}?t=${admin.currentToken}`}\n      size={size}\n      level={level}\n      marginSize={marginSize}\n      style={{ width: displaySize, height: displaySize }}\n    />\n  );\n  if (frameClassName) {\n    return <div className={frameClassName}>{canvas}</div>;\n  }\n  return canvas;\n}\n\nexport interface TokenPanelDownloadProps {\n  className?: string;\n  children?: ReactNode;\n  icon?: ReactNode;\n}\n\nfunction Download({ className, children, icon }: TokenPanelDownloadProps) {\n  const { admin } = useTokenPanelContext();\n  const renderedIcon = icon === undefined ? DEFAULT_DOWNLOAD_ICON : icon;\n  return (\n    <button type=\"button\" onClick={admin.downloadQR} className={className}>\n      {renderedIcon}\n      {children ?? 'Download PNG'}\n    </button>\n  );\n}\n\n// ─── Compound export ──────────────────────────────────────────────────────────\n\n/**\n * Owner-only admin panel for the wall access token, expressed as a compound\n * component. The root wires up context (admin state + open/toggle); each\n * subcomponent reads from context and accepts its own className.\n *\n * Standard shape:\n *\n * ```tsx\n * <TokenPanel admin={tokenAdmin} open={open} onToggle={...} className=\"mb-3\">\n *   <TokenPanel.Toggle className=\"...\" />\n *   <TokenPanel.Panel className=\"...\">\n *     <TokenPanel.Description className=\"...\" />\n *     <TokenPanel.Controls className=\"...\">\n *       <TokenPanel.Input className=\"...\" />\n *       <TokenPanel.Generate className=\"...\" />\n *       <TokenPanel.Save className=\"...\" />\n *       <TokenPanel.Clear className=\"...\" />\n *     </TokenPanel.Controls>\n *     <TokenPanel.ShareSection className=\"...\">\n *       <TokenPanel.ShareLink className=\"...\" />\n *       <TokenPanel.QR frameClassName=\"...\" />\n *       <TokenPanel.Download className=\"...\" />\n *     </TokenPanel.ShareSection>\n *   </TokenPanel.Panel>\n * </TokenPanel>\n * ```\n *\n * Templates are free to re-arrange, omit, or wrap any subcomponent.\n */\nexport const TokenPanel = Object.assign(TokenPanelRoot, {\n  Toggle,\n  Panel,\n  Description,\n  Controls,\n  Input,\n  Generate,\n  Save,\n  Clear,\n  ShareSection,\n  ShareLink,\n  QR,\n  Download,\n});\n"]}