{"version":3,"sources":["../../../src/primitives/Wall/SceneBackgroundsPanel.tsx"],"names":[],"mappings":";;;AAKA,MAAM,4BAAA,GAA+B,cAAiD,IAAI,CAAA;AAE1F,SAAS,+BAAA,GAA8D;AACrE,EAAA,MAAM,GAAA,GAAM,WAAW,4BAA4B,CAAA;AACnD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,EAC9F;AACA,EAAA,OAAO,GAAA;AACT;AAYA,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,UAAS,EAA+B;AACxE,EAAA,uBACE,GAAA,CAAC,4BAAA,CAA6B,QAAA,EAA7B,EAAsC,KAAA,EAAO,OAC5C,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAuB,QAAA,EAAS,CAAA,EACvC,CAAA;AAEJ;AAaA,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAW,QAAA,EAAS,EAAsC;AAC3E,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAiB;AACjC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,KAAK,IAAI,MAAA,EAAO;AAAA,EAClB,CAAA;AACA,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAsB,QAAA,EACzB,QAAA,EACH,CAAA;AAEJ;AASA,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,WAAA,GAAc,kBAAiB,EAAoC;AAC7F,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,UAAU,CAAA,CAAA,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACzC,WAAA;AAAA,MACA,UAAU,GAAA,CAAI,UAAA;AAAA,MACd,SAAA;AAAA,MACA,QAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;AASA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,MAAA,GAAS,WAAU,EAAwC;AACzF,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,MAAA;AAAA,MACA,QAAA,EAAU,OAAK,GAAA,CAAI,OAAA,CAAQ,EAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAI,CAAA;AAAA,MACtD,UAAU,GAAA,CAAI,UAAA;AAAA,MACd,SAAA;AAAA,MACA,QAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;AAUA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,WAAA,GAAc,oGAAA;AAAA,EACd,IAAA,GAAO;AACT,CAAA,EAAqC;AACnC,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAO,GAAA,CAAI,WAAA;AAAA,MACX,UAAU,CAAA,CAAA,KAAK,GAAA,CAAI,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MAChD,WAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAU,GAAA,CAAI,UAAA;AAAA,MACd,SAAA;AAAA,MACA,QAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;AAYA,SAAS,MAAA,CAAO;AAAA,EACd,SAAA;AAAA,EACA,YAAA,GAAe,qBAAA;AAAA,EACf,eAAA,GAAkB;AACpB,CAAA,EAAqC;AACnC,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,uBACE,GAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,QAAA,EAAU,CAAC,GAAA,CAAI,SAAA,EAAW,SAAA,EAC7C,QAAA,EAAA,GAAA,CAAI,UAAA,GAAa,eAAA,GAAkB,YAAA,EACtC,CAAA;AAEJ;AASA,SAAS,MAAA,CAAO,EAAE,SAAA,EAAU,EAAqC;AAC/D,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,GAAA,CAAI,MAAA,EAAO,CAAA;AACjD;AASA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAoC;AACjE,EAAA,MAAM,MAAM,+BAAA,EAAgC;AAC5C,EAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,OAAO,IAAA;AACvB,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM,CAAA;AAChD;AAmCO,MAAM,qBAAA,GAAwB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA,EACvD,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA,EAAO;AACT,CAAC","file":"SceneBackgroundsPanel.mjs","sourcesContent":["import { createContext, useContext, type ReactNode, type FormEvent } from 'react';\nimport type { SceneBackgroundsPanelState } from '../../hooks/useSceneBackgroundsPanel';\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst SceneBackgroundsPanelContext = createContext<SceneBackgroundsPanelState | null>(null);\n\nfunction useSceneBackgroundsPanelContext(): SceneBackgroundsPanelState {\n  const ctx = useContext(SceneBackgroundsPanelContext);\n  if (!ctx) {\n    throw new Error('<SceneBackgroundsPanel.*> must be rendered inside <SceneBackgroundsPanel>.');\n  }\n  return ctx;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelProps {\n  /** State from `useSceneBackgroundsPanel()`. */\n  admin: SceneBackgroundsPanelState;\n  /** Class on the root wrapper. */\n  className?: string;\n  children?: ReactNode;\n}\n\nfunction Root({ admin, className, children }: SceneBackgroundsPanelProps) {\n  return (\n    <SceneBackgroundsPanelContext.Provider value={admin}>\n      <div className={className}>{children}</div>\n    </SceneBackgroundsPanelContext.Provider>\n  );\n}\n\n// ─── AddForm ──────────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelAddFormProps {\n  className?: string;\n  children?: ReactNode;\n}\n\n/**\n * Form wrapper that calls `admin.submit()` on submit. Inputs disabled while\n * generating so consumers don't have to wire that themselves.\n */\nfunction AddForm({ className, children }: SceneBackgroundsPanelAddFormProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  const onSubmit = (e: FormEvent) => {\n    e.preventDefault();\n    void ctx.submit();\n  };\n  return (\n    <form className={className} onSubmit={onSubmit}>\n      {children}\n    </form>\n  );\n}\n\n// ─── Title input ──────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelTitleProps {\n  className?: string;\n  placeholder?: string;\n}\n\nfunction Title({ className, placeholder = 'e.g. The Bronx' }: SceneBackgroundsPanelTitleProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  return (\n    <input\n      type=\"text\"\n      value={ctx.name}\n      onChange={e => ctx.setName(e.target.value)}\n      placeholder={placeholder}\n      disabled={ctx.generating}\n      className={className}\n      required\n    />\n  );\n}\n\n// ─── File input (reference photo) ─────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelFileInputProps {\n  className?: string;\n  accept?: string;\n}\n\nfunction FileInput({ className, accept = 'image/*' }: SceneBackgroundsPanelFileInputProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  return (\n    <input\n      type=\"file\"\n      accept={accept}\n      onChange={e => ctx.setFile(e.target.files?.[0] ?? null)}\n      disabled={ctx.generating}\n      className={className}\n      required\n    />\n  );\n}\n\n// ─── Prompt textarea ──────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelPromptProps {\n  className?: string;\n  placeholder?: string;\n  rows?: number;\n}\n\nfunction Prompt({\n  className,\n  placeholder = 'e.g. Add this person to a photo of the Bronx, leave room beside them so others can be added later.',\n  rows = 3,\n}: SceneBackgroundsPanelPromptProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  return (\n    <textarea\n      value={ctx.description}\n      onChange={e => ctx.setDescription(e.target.value)}\n      placeholder={placeholder}\n      rows={rows}\n      disabled={ctx.generating}\n      className={className}\n      required\n    />\n  );\n}\n\n// ─── Submit button ────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelSubmitProps {\n  className?: string;\n  /** Idle label. Default `Generate background`. */\n  idleChildren?: ReactNode;\n  /** Loading label. Default `Generating…`. */\n  loadingChildren?: ReactNode;\n}\n\nfunction Submit({\n  className,\n  idleChildren = 'Generate background',\n  loadingChildren = 'Generating…',\n}: SceneBackgroundsPanelSubmitProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  return (\n    <button type=\"submit\" disabled={!ctx.canSubmit} className={className}>\n      {ctx.generating ? loadingChildren : idleChildren}\n    </button>\n  );\n}\n\n// ─── Status text ──────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelStatusProps {\n  className?: string;\n}\n\n/** Shows `admin.status`. Returns null when status is empty. */\nfunction Status({ className }: SceneBackgroundsPanelStatusProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  if (!ctx.status) return null;\n  return <span className={className}>{ctx.status}</span>;\n}\n\n// ─── Error text ───────────────────────────────────────────────────────────────\n\nexport interface SceneBackgroundsPanelErrorProps {\n  className?: string;\n}\n\n/** Shows `admin.error`. Returns null when error is empty. */\nfunction ErrorText({ className }: SceneBackgroundsPanelErrorProps) {\n  const ctx = useSceneBackgroundsPanelContext();\n  if (!ctx.error) return null;\n  return <span className={className}>{ctx.error}</span>;\n}\n\n// ─── Compound assembly ───────────────────────────────────────────────────────\n\n/**\n * Headless compound primitive for the wall scene-backgrounds editor. Pair with\n * `useSceneBackgroundsPanel()` for state. The list of existing backgrounds is\n * left to the consumer to render — iterate `admin.backgrounds` directly and\n * call `admin.remove(id)` for delete buttons.\n *\n * Usage:\n * ```tsx\n * const sceneBgPanel = useSceneBackgroundsPanel({ isAdmin });\n * return (\n *   <SceneBackgroundsPanel admin={sceneBgPanel} className=\"…\">\n *     <div className=\"grid …\">\n *       {sceneBgPanel.backgrounds.map(bg => (\n *         <div key={bg.id} className=\"…\">\n *           <img src={bg.image_url} />\n *           <button onClick={() => sceneBgPanel.remove(bg.id)}>×</button>\n *         </div>\n *       ))}\n *     </div>\n *     <SceneBackgroundsPanel.AddForm className=\"space-y-3\">\n *       <SceneBackgroundsPanel.Title className=\"…\" />\n *       <SceneBackgroundsPanel.FileInput className=\"…\" />\n *       <SceneBackgroundsPanel.Prompt className=\"…\" />\n *       <SceneBackgroundsPanel.Submit className=\"…\" />\n *       <SceneBackgroundsPanel.Status className=\"…\" />\n *       <SceneBackgroundsPanel.Error className=\"…\" />\n *     </SceneBackgroundsPanel.AddForm>\n *   </SceneBackgroundsPanel>\n * );\n * ```\n */\nexport const SceneBackgroundsPanel = Object.assign(Root, {\n  AddForm,\n  Title,\n  FileInput,\n  Prompt,\n  Submit,\n  Status,\n  Error: ErrorText,\n});\n"]}