scene-selector.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. "use client";
  2. import { Copy, Trash2, Plus } from "lucide-react";
  3. import { useEditorStore } from "@/lib/store";
  4. export function SceneSelector() {
  5. const {
  6. scenes,
  7. activeSceneId,
  8. setActiveScene,
  9. createScene,
  10. duplicateScene,
  11. deleteScene,
  12. } = useEditorStore();
  13. return (
  14. <div className="flex flex-col h-full">
  15. <div className="h-9 flex items-center justify-between px-3 border-b border-[#1e1e1e] flex-shrink-0">
  16. <span className="text-[10px] font-semibold text-[#555] uppercase tracking-wider font-mono">
  17. Scenes
  18. </span>
  19. <button
  20. onClick={() => createScene(`Scene ${scenes.length + 1}`)}
  21. className="p-1 text-[#666] hover:text-white transition-colors"
  22. title="New scene"
  23. >
  24. <Plus size={12} />
  25. </button>
  26. </div>
  27. <div className="flex-1 overflow-y-auto py-1">
  28. {scenes.map((scene) => (
  29. <div
  30. key={scene.id}
  31. className={`group flex items-center justify-between px-3 py-1.5 cursor-pointer text-xs ${
  32. scene.id === activeSceneId
  33. ? "bg-white/8 text-white border-l-2 border-white"
  34. : "text-[#888] hover:text-[#ccc] border-l-2 border-transparent"
  35. }`}
  36. onClick={() => setActiveScene(scene.id)}
  37. >
  38. <span className="truncate">{scene.name}</span>
  39. <div className="hidden group-hover:flex items-center gap-0.5">
  40. <button
  41. onClick={(e) => {
  42. e.stopPropagation();
  43. duplicateScene(scene.id);
  44. }}
  45. className="p-0.5 text-[#666] hover:text-white"
  46. title="Duplicate"
  47. >
  48. <Copy size={10} />
  49. </button>
  50. {scenes.length > 1 && (
  51. <button
  52. onClick={(e) => {
  53. e.stopPropagation();
  54. deleteScene(scene.id);
  55. }}
  56. className="p-0.5 text-[#666] hover:text-red-400"
  57. title="Delete"
  58. >
  59. <Trash2 size={10} />
  60. </button>
  61. )}
  62. </div>
  63. </div>
  64. ))}
  65. </div>
  66. </div>
  67. );
  68. }